gofs使用教程-基於golang的開源跨平台文件同步工具


概述

gofs是基於golang開發的一款開箱即用的跨平台文件同步工具,支持在本地磁盤之間同步、從遠程服務器同步變更到本地、將本地文件變更推送到遠程服務器三種模式。開源地址如下:Github & Gitee,歡迎Star或者提交Issue和PR!

安裝

首先需要確保已經安裝了Go (版本必須是1.20+),然后你就可以使用下面的命令來安裝gofs

如果你不需要自行從源碼編譯安裝,也可以直接下載最新發布的二進制文件Release

go install github.com/no-src/gofs/...@latest

在Docker中運行

你可以使用build-docker.sh腳本來構建docker鏡像,首先你需要克隆本倉庫並且cd到本倉庫的根目錄

$ ./scripts/build-docker.sh

或者使用以下命令直接從DockerHub中拉取docker鏡像

$ docker pull nosrc/gofs

更多關於發布與docker的腳本參見scripts目錄

后台運行

在windows系統中,你可以使用下面的命令構建一個在后台運行的不帶命令行界面的程序

go install -ldflags="-H windowsgui" github.com/no-src/gofs/...@latest

快速開始

先決條件

請確保文件同步的源目錄和目標目錄都已經存在,如果目錄不存在,則用你實際的目錄替換下面的路徑進行提前創建

$ mkdir source dest

生成僅用於測試的證書和密鑰文件,生產中請替換為正式的證書

TLS證書和密鑰文件僅用於與Web文件服務器遠程磁盤服務端進行安全通訊

$ go run $GOROOT/src/crypto/tls/generate_cert.go --host 127.0.0.1
2021/12/30 17:21:54 wrote cert.pem
2021/12/30 17:21:54 wrote key.pem

查看你的工作目錄

$ ls
cert.pem  key.pem  source  dest

使用方法

在磁盤之間同步

使用本地磁盤在磁盤之間同步文件

sequenceDiagram participant DA as DiskA participant C as Client participant DB as DiskB autonumber C ->> DA: monitor disk DA ->> C: notify change C ->> DA: read file DA ->> C: return file C ->> DB: write file

從服務器端同步

使用遠程磁盤服務端遠程磁盤客戶端從服務端同步文件

sequenceDiagram participant SD as Server Disk participant S as Server participant C as Client participant CD as Client Disk autonumber S ->> SD: monitor disk C ->> S: connect and auth SD ->> S: notify change S ->> C: notify change C ->> S: pull file S ->> SD: read file SD ->> S: return file S ->> C: send file C ->> CD: write file

同步到服務器端

使用遠程推送服務端遠程推送客戶端同步文件到服務端

sequenceDiagram participant CD as Client Disk participant C as Client participant S as Server participant SD as Server Disk autonumber C ->> CD: monitor disk CD ->> C: notify change C ->> CD: read file CD ->> C: return file C ->> S: push file S ->> SD: write file

從SFTP服務器上同步

使用SFTP拉取客戶端從SFTP服務器上同步文件

sequenceDiagram participant CD as Client Disk participant C as Client participant SS as SFTP Server participant SSD as SFTP Server Disk autonumber C ->> SS: pull file SS ->> SSD: read file SSD ->> SS: return file SS ->> C: send file C ->> CD: write file

同步到SFTP服務器

使用SFTP推送客戶端同步文件到SFTP服務器

sequenceDiagram participant CD as Client Disk participant C as Client participant SS as SFTP Server participant SSD as SFTP Server Disk autonumber C ->> CD: monitor disk CD ->> C: notify change C ->> CD: read file CD ->> C: return file C ->> SS: push file SS ->> SSD: write file

從MinIO服務器上同步

使用MinIO拉取客戶端從MinIO服務器上同步文件

sequenceDiagram participant CD as Client Disk participant C as Client participant MS as MinIO Server participant MSD as MinIO Server Disk autonumber C ->> MS: pull file MS ->> MSD: read file MSD ->> MS: return file MS ->> C: send file C ->> CD: write file

同步到MinIO服務器

使用MinIO推送客戶端同步文件到MinIO服務器

sequenceDiagram participant CD as Client Disk participant C as Client participant MS as MinIO Server participant MSD as MinIO Server Disk autonumber C ->> CD: monitor disk CD ->> C: notify change C ->> CD: read file CD ->> C: return file C ->> MS: push file MS ->> MSD: write file

核心功能

本地磁盤

監控本地源目錄將變更同步到目標目錄

你可以使用logically_delete命令行參數來啟用邏輯刪除,從而避免誤刪數據

設置checkpoint_count命令行參數來使用文件中的檢查點來減少傳輸未修改的文件塊,默認情況下checkpoint_count=10,這意味着它最多有10+2個檢查點。在頭部和尾部還有兩個額外的檢查點。第一個檢查點等於chunk_size,它是可選的。最后一個檢查點等於文件大小,這是必需的。由checkpoint_count設置的檢查點偏移量總是大於chunk_size,除非文件大小小於或等於chunk_size,那么checkpoint_count將變為0,所以它是可選的

默認情況下,如果源文件的大小和修改時間與目標文件相同,則忽略當前文件的傳輸。你可以使用force_checksum命令行參數強制啟用校驗和來比較文件是否相等

默認的校驗和哈希算法為md5,你可以使用checksum_algorithm命令行參數來更改默認的哈希算法,當前支持的算法如下:md5sha1sha256sha512crc32crc64adler32fnv-1-32fnv-1a-32fnv-1-64fnv-1a-64fnv-1-128fnv-1a-128

如果你想要降低同步的頻率,你可以使用sync_delay命令行參數來啟用同步延遲,當事件數量大於等於sync_delay_events或者距離上次同步已經等待超過sync_delay_time時開始同步

另外你可以使用progress命令行參數來打印文件同步的進度條

$ gofs -source=./source -dest=./dest

加密

你可以使用encrypt命令行參數來啟用加密功能,並通過encrypt_path命令行參數指定一個目錄作為加密工作區。所有在這個目錄中的文件都會被加密之后再同步到目標路徑中

$ gofs -source=./source -dest=./dest -encrypt -encrypt_path=./source/encrypt -encrypt_secret=mysecret

解密

你可以使用decrypt命令行參數來將加密文件解密到指定的路徑中

$ gofs -decrypt -decrypt_path=./dest/encrypt -decrypt_secret=mysecret -decrypt_out=./decrypt_out

全量同步

執行一次全量同步,直接將整個源目錄同步到目標目錄

$ gofs -source=./source -dest=./dest -sync_once

定時同步

定時執行全量同步,將整個源目錄同步到目標目錄

# 每30秒鍾將源目錄全量同步到目標目錄
$ gofs -source=./source -dest=./dest -sync_cron="*/30 * * * * *"

守護進程模式

啟動守護進程來創建一個工作進程處理實際的任務,並將相關進程的pid信息記錄到pid文件中

$ gofs -source=./source -dest=./dest -daemon -daemon_pid

Web文件服務器

啟動一個Web文件服務器用於訪問遠程的源目錄和目標目錄

Web文件服務器默認使用HTTPS協議,使用tls_cert_filetls_key_file命令行參數來指定相關的證書和密鑰文件

如果你不需要使用TLS進行安全通訊,可以通過將tls命令行參數指定為false來禁用它

如果將tls設置為true,則服務器默認運行端口為443,反之默認端口為80,你可以使用server_addr命令行參數來自定義服務器運行端口,例如-server_addr=":443"

如果你在服務器端啟用tls命令行參數,可以通過tls_insecure_skip_verify命令行參數來控制客戶端是否跳過驗證服務器的證書鏈和主機名,默認為true

如果你已經啟用了tls命令行參數,那么你可以使用http3命令行參數在服務器端和客戶端啟用HTTP3協議

出於安全考慮,你應該設置rand_user_count命令行參數來隨機生成指定數量的用戶或者通過users命令行參數自定義用戶信息來保證數據的訪問安全,禁止用戶匿名訪問數據

如果rand_user_count命令行參數設置大於0,則隨機生成的賬戶密碼將會打印到日志信息中,請注意查看

如果你需要啟用gzip壓縮響應結果,則添加server_compress命令行參數,但是目前gzip壓縮不是很快,在局域網中可能會影響傳輸效率

你可以使用session_connection命令行參數來切換Web文件服務器的會話存儲模式,當前支持memory與redis,默認為memory。
如果你想使用redis作為會話存儲,這里是一個redis會話連接字符串的示例:
redis://127.0.0.1:6379?password=redis_password&db=10&max_idle=10&secret=redis_secret

# 啟動一個Web文件服務器並隨機創建3個用戶
# 在生產環境中請將`tls_cert_file`和`tls_key_file`命令行參數替換為正式的證書和密鑰文件
$ gofs -source=./source -dest=./dest -server -tls_cert_file=cert.pem -tls_key_file=key.pem -rand_user_count=3

速率限制

使用max_tran_rate命令行參數來限制服務器端和客戶端的最大傳輸速率,這是一個期望值,而不是絕對值

例如,限制最大傳輸速率為1048576字節,即1MB

$ gofs -source=./source -dest=./dest -max_tran_rate=1048576

遠程磁盤服務端

啟動一個遠程磁盤服務端作為一個遠程文件數據源

source命令行參數詳見遠程磁盤服務端數據源協議

注意遠程磁盤服務端的用戶至少要擁有讀權限,例如:-users="gofs|password|r"

你可以使用checkpoint_countsync_delay命令行參數就跟本地磁盤一樣

# 啟動一個遠程磁盤服務端
# 在生產環境中請將`tls_cert_file`和`tls_key_file`命令行參數替換為正式的證書和密鑰文件
# 為了安全起見,請使用復雜的賬戶密碼來設置`users`命令行參數
$ gofs -source="rs://127.0.0.1:8105?mode=server&local_sync_disabled=true&path=./source&fs_server=https://127.0.0.1" -dest=./dest -users="gofs|password|r" -tls_cert_file=cert.pem -tls_key_file=key.pem

遠程磁盤客戶端

啟動一個遠程磁盤客戶端將遠程磁盤服務端的文件變更同步到本地目標目錄

source命令行參數詳見遠程磁盤服務端數據源協議

使用sync_once命令行參數,可以直接將遠程磁盤服務端的文件整個全量同步到本地目標目錄,就跟全量同步一樣

使用sync_cron命令行參數,可以定時將遠程磁盤服務端的文件整個全量同步到本地目標目錄,就跟定時同步一樣

使用force_checksum命令行參數強制啟用校驗和來比較文件是否相等,就跟本地磁盤一樣

你可以使用sync_delay命令行參數就跟本地磁盤一樣

# 啟動一個遠程磁盤客戶端
# 請將`users`命令行參數替換為上面設置的實際賬戶名密碼
$ gofs -source="rs://127.0.0.1:8105" -dest=./dest -users="gofs|password"

遠程推送服務端

啟動一個遠程磁盤服務端作為一個遠程文件數據源,並使用push_server命令行參數啟用遠程推送服務端

注意遠程推送服務端的用戶至少要擁有讀寫權限,例如:-users="gofs|password|rw"

# 啟動一個遠程磁盤服務端並啟用遠程推送服務端
# 在生產環境中請將`tls_cert_file`和`tls_key_file`命令行參數替換為正式的證書和密鑰文件
# 為了安全起見,請使用復雜的賬戶密碼來設置`users`命令行參數
$ gofs -source="rs://127.0.0.1:8105?mode=server&local_sync_disabled=true&path=./source&fs_server=https://127.0.0.1" -dest=./dest -users="gofs|password|rw" -tls_cert_file=cert.pem -tls_key_file=key.pem -push_server

遠程推送客戶端

啟動一個遠程推送客戶端將本地文件變更同步到遠程推送服務端

使用chunk_size命令行參數來設置大文件上傳時切分的區塊大小,默認值為1048576,即1MB

你可以使用checkpoint_countsync_delay命令行參數就跟本地磁盤一樣

更多命令行參數用法請參見遠程磁盤客戶端

# 啟動一個遠程推送客戶端並且啟用本地磁盤同步,將source目錄下的文件變更同步到本地dest目錄和遠程推送服務器上
# 請將`users`命令行參數替換為上面設置的實際賬戶名密碼
$ gofs -source="./source" -dest="rs://127.0.0.1:8105?local_sync_disabled=false&path=./dest" -users="gofs|password"

SFTP客戶端

啟動一個SFTP客戶端,將發生變更的文件同步到SFTP服務器

$ gofs -source="./source" -dest="sftp://127.0.0.1:22?local_sync_disabled=false&path=./dest&remote_path=/gofs_sftp_server" -users="sftp_user|sftp_pwd"

SFTP推送客戶端

啟動一個SFTP推送客戶端,將發生變更的文件同步到SFTP服務器

$ gofs -source="./source" -dest="sftp://127.0.0.1:22?local_sync_disabled=false&path=./dest&remote_path=/gofs_sftp_server&ssh_user=sftp_user&ssh_pass=sftp_pwd"

SFTP拉取客戶端

啟動一個SFTP拉取客戶端,將文件從SFTP服務器拉到本地目標路徑

$ gofs -source="sftp://127.0.0.1:22?remote_path=/gofs_sftp_server&ssh_user=sftp_user&ssh_pass=sftp_pwd" -dest="./dest" -sync_once

MinIO推送客戶端

啟動一個MinIO推送客戶端,將發生變更的文件同步到MinIO服務器

$ gofs -source="./source" -dest="minio://127.0.0.1:9000?secure=false&local_sync_disabled=false&path=./dest&remote_path=minio-bucket" -users="minio_user|minio_pwd"

MinIO拉取客戶端

啟動一個MinIO拉取客戶端,將文件從MinIO服務器拉到本地目標路徑

$ gofs -source="minio://127.0.0.1:9000?secure=false&remote_path=minio-bucket" -dest="./dest" -users="minio_user|minio_pwd" -sync_once

任務服務端

啟動一個任務服務器,將任務分發給客戶端

遠程磁盤服務端為例,
首先創建一個任務清單配置文件remote-disk-task.yaml
這里定義了一個從服務器同步文件的任務

然后創建在上述清單配置文件中定義的任務內容配置文件run-gofs-remote-disk-client.yaml
,它將會被客戶端執行

最后使用task_conf命令行參數啟動遠程磁盤服務端

這里使用conf命令行參數來簡化命令並復用集成測試的配置文件

$ cd integration
$ mkdir -p rs/source rs/dest
$ gofs -conf=./testdata/conf/run-gofs-remote-disk-server.yaml

任務客戶端

啟動一個任務客戶端來訂閱任務服務器,然后獲取任務並執行它

使用task_client命令行參數來啟動任務客戶端,task_client_max_worker命令行參數將限制任務客戶端的最大並發工作線程數

你可以使用task_client_labels命令行參數來定義任務客戶端的標簽,這些標簽用於在任務服務器端匹配任務

這里使用conf命令行參數來簡化命令並復用集成測試的配置文件

$ cd integration
$ mkdir -p rc/source rc/dest
$ gofs -conf=./testdata/conf/run-gofs-task-client.yaml

中繼

如果你需要在兩個無法直接相連的設備之間同步文件,可以使用反向代理作為中繼服務器來實現,詳情參見中繼模式

遠程磁盤服務端數據源協議

遠程磁盤服務端數據源協議基於URI基本語法,詳見RFC 3986

方案

方案名稱為rs

主機名

遠程磁盤服務端數據源在遠程磁盤服務端模式下使用0.0.0.0或者其他本地網卡IP地址作為主機名,在遠程磁盤客戶端
模式下使用遠程磁盤服務端的IP地址或者域名作為主機名

端口號

遠程磁盤服務端數據源端口號,默認為8105

參數

僅在遠程磁盤服務端模式下設置以下參數

示例

遠程磁盤服務端模式下的示例

注:若圖表展示錯位,請點擊圖表中的全屏按鈕查看

 rs://127.0.0.1:8105?mode=server&local_sync_disabled=true&path=./source&fs_server=https://127.0.0.1
 \_/  \_______/ \__/ \____________________________________________________________________________/
  |       |       |                                      |
 方案   主機名   端口號                                    參數

管理接口

基於Web文件服務器的應用管理接口

默認情況下,僅允許私有地址和回環地址訪問管理接口的相關路由

你可以通過將manage_private命令行參數設置為false來禁用默認行為,允許公網IP訪問管理接口的路由

$ gofs -source=./source -dest=./dest -server -tls_cert_file=cert.pem -tls_key_file=key.pem -rand_user_count=3 -manage

性能分析接口

pprof訪問地址如下:

https://127.0.0.1/manage/pprof/

配置接口

讀取應用程序配置,默認返回json格式,當前支持jsonyaml格式

https://127.0.0.1/manage/config

或者使用format參數來指定返回的配置格式

https://127.0.0.1/manage/config?format=yaml

報告接口

使用report命令行參數來啟用報告接口的路由並且開始收集報告數據,需要先啟用manage命令行參數

報告接口詳情參見Report API

https://127.0.0.1/manage/report

日志

默認情況下會啟用文件日志與控制台日志,你可以將log_file命令行參數設置為false來禁用文件日志

使用log_level命令行參數設置日志的等級,默認級別是INFO,可選項為:DEBUG=0 INFO=1 WARN=2 ERROR=3

使用log_dir命令行參數來設置日志文件目錄,默認為./logs/

使用log_flush命令行參數來設置自動刷新日志到文件中,默認啟用

使用log_flush_interval命令行參數設置自動刷新日志到文件中的頻率,默認為3s

使用log_event命令行參數啟用事件日志,所有事件都會記錄到文件中,默認為禁用

使用log_sample_rate命令行參數設置采樣日志的采樣率,取值范圍為0到1,默認值為1

使用log_format命令行參數設置日志輸出格式,當前支持textjson,默認為text

使用log_split_date命令行參數來根據日期拆分日志文件,默認為禁用

# 在"本地磁盤"模式下設置日志信息
$ gofs -source=./source -dest=./dest -log_file -log_level=0 -log_dir="./logs/" -log_flush -log_flush_interval=3s -log_event

使用配置文件

如果需要的話,你可以使用配置文件來代替所有的命令行參數,當前支持jsonyaml格式

所有的配置字段名稱跟命令行參數一樣,你可以參考配置示例或者配置接口的響應結果

$ gofs -conf=./gofs.yaml

校驗和

你可以使用checksum命令行參數來計算並打印文件的校驗和

chunk_sizecheckpoint_countcheckpoint_count命令行參數在這里同在本地磁盤中一樣有效

$ gofs -source=./gofs -checksum

更多信息

幫助信息

$ gofs -h

版本信息

$ gofs -v

關於信息

$ gofs -about


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM