摘要:# hosts allow = 192.168.1.0/255.255.255.0 172.18.50.111 # hosts deny = * # 配置單客戶端最大的連接,這個如果只是私人使用,基本用不到 #max connections = 4 transfer logging = yes log format = %t %a %m %f %b log file = /var/log/rsync.log # 拍不lost found等沒有用的文件夾 exclude = lost+found/ # 無響應超時時間 timeout = 600 # 在發生io錯誤的時候繼續處理 ignore nonreadable = yes # 避免無意義的壓縮帶來的資源浪費 dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2 [data] path = /data/ # 是否公開顯示 list = yes comment = This is site data # 這裏可以配置多個,用空格空開 auth users = newnius secrets file = /etc/rsyncd.secrets exclude = lost+found/。# /etc/rsyncd: configuration file for rsync daemon mode # See rsyncd.conf man page for more options. uid = root gid = root # 如果要在客戶端上保留文件系統權限和用戶,這裏需要配置成yes use chroot = yes # 如果服務端只用來提供同步,這裏可以設置成yes,避免數據被誤操作 read only = no # 配置允許的客戶端網段,需要注意的是docker需要配置`--net host`才能正確使用。

19年以來似乎折騰了很多數據備份/同步工具,例如rclone、mega等等。

不得不說rclone是一個神器,它支持了非常多的協議和網盤,大魚目前的數據安全性方案裏也用到了很多,但是rclone也有它的缺陷,比如它是基於已有的協議作爲轉換的。在剛開始的NAS每日備份方案中,用到了rclone基於WebDav協議進行nextcloud網盤的數據備份,即便是文件內容沒有任何變化,rclone仍然花費了近一個小時來檢查同步我那不過幾百個G的數據,而且在此過程中,發送了非常多的請求,造成了主機長時間高負載。

後來在重新研究備份方案時,發現了rsync。與rclone兼容已有協議/服務不同,它是一個CS架構的軟件,需要在客戶機和服務器上同時部署,雖然增加了一些服務器的負載,不過帶來的優勢卻是很明顯的,可以通過數據壓縮等各種優化來加快同步。rsync是直接同步文件系統的,有更高的效率。而且,rsync是基於時間戳和文件大小來檢查文件是否一致的,這樣在文件系統只發生少量變動的情況下在極短的時間內就可以完成同步任務。(基於時間戳和文件大小的方法在原理上可能會出現實際文件發生改動但是時間戳和大小不變的情況,不過正常情況下不會出現這種情況,可以放心使用)

rsync是基於delta-transfer的差分同步方案,對於一些經常改變但是隻有一小部分發生更新的大文件非常有效,比如說日誌,在降低了網絡通信開銷的同時也加快了同步速度。此外,它是一個跨機的文件同步的工具,這樣就可以異地備份,提高可靠性。

安裝部署

rsync部署起來也很方便,直接 sudo apt install -y rsync 就可以了,然後在服務器上使用命令 rsync --daemon 運行服務端。

以下依舊是基於docker的部署方式,首先放 Dockerfile

可以直接跳到後面

FROM alpine:3.10

RUN apk add --no-cache rsync

ADD bootstrap.sh /etc/bootstrap.sh

ENTRYPOINT ["/etc/bootstrap.sh"]
# bootstrap.sh
if ! [[ -z $@ ]]; then
	eval $@
else
	rsync --daemon --config=/etc/rsyncd.conf
	while pgrep rsync > /dev/null; do sleep 1; done
fi

配置和使用

首先要寫一下配置文件。前面的部分是全局的配置,後面可以針對每一個子項進行配置,比如我們要同步 /data 目錄。

# /etc/rsyncd: configuration file for rsync daemon mode
# See rsyncd.conf man page for more options.
uid = root
gid = root

# 如果要在客戶端上保留文件系統權限和用戶,這裏需要配置成yes
use chroot = yes
# 如果服務端只用來提供同步,這裏可以設置成yes,避免數據被誤操作
read only = no

# 配置允許的客戶端網段,需要注意的是docker需要配置`--net host`才能正確使用。
# hosts allow = 192.168.1.0/255.255.255.0 172.18.50.111
# hosts deny = *

# 配置單客戶端最大的連接,這個如果只是私人使用,基本用不到
#max connections = 4

transfer logging = yes
log format = %t %a %m %f %b
log file = /var/log/rsync.log

# 拍不lost found等沒有用的文件夾
exclude = lost+found/
# 無響應超時時間
timeout = 600

# 在發生io錯誤的時候繼續處理
ignore nonreadable = yes

# 避免無意義的壓縮帶來的資源浪費
dont compress   = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2

[data]
path = /data/
# 是否公開顯示
list = yes
comment = This is site data
# 這裏可以配置多個,用空格空開
auth users = newnius
secrets file = /etc/rsyncd.secrets
exclude = lost+found/

保存爲 /data/rsync/config/rsyncd.conf 文件。

再創建一個 /data/rsync/config/rsyncd.secrets 文件,文件內容是用戶和祕鑰,建議設置的複雜一點,文件格式如下:

user1:password1
user2:password2
newnius:123456

你可以 在這裏找到完整的配置項和含義

啓動服務端

docker run \
	--name rsync \
	-d \
	--restart always \
	--publish 873:873 \
	--mount type=bind,src=/data/,dst=/data/ \
	--mount type=bind,src=/data/rsync/config/,dst=/config/ \
	newnius/rsync

服務端需要暴露873端口用於請求處理和數據傳輸。

客戶端同步

docker run \
	-it \
	--rm \
	--name rsync \
	--env AUTH_USER=newnius \
	--env AUTH_PASSWORD=password \
	--mount type=bind,src=/data/,dst=/data/ \
	newnius/rsync rsync -avzP --delete --password-file=/etc/rsyncd.secret [email protected]::data/ /data/

注意修改腳本里的賬號、密碼以及ip地址,文件目錄等等。

腳本默認已經配置了免輸入密碼,如果自己在宿主機上配置的話,需要主要祕鑰文件的權限一定要是 600 ,否則會被忽略,你也可以在日誌文件裏看到提示。

chmod 600 /etc/rsyncd.user1.secret

chmod 600 /etc/rsyncd.secrets

安全性

rsync提供了急於賬號祕鑰的驗證方式,同時也可以配置允許的客戶端ip,在數據鏈路安全上,rsync可以採用基於ssh協議的傳輸方式(本文沒有涉及),基本可以保證安全性。

不過ssh協議容易被檢測,直接將rsync服務暴露在公網也有一定的隱患,大魚的方案是利用已有的內網代理v2ray,然後讓rsync走代理,這樣即便是rsync的驗證存在問題,也可以保證安全。要讓rsync走代理,只需要在客戶端命令前面加上 RSYNC_PROXY=localhost:8118 即可,http協議,不用寫。

相關文章