lsyncd+rsync配置圖片資源雙向同步

需求:爲保證國內外圖片加載速度,國內請求上傳圖片資源地址阿里雲服務器,國外請求上傳圖片資源地址aws ,爲保證圖片資源的一致性,需定時進行aws和阿里雲圖片雙向同步css

調研方案:因爲以前配置過inotify+rsync,計劃經過該方案解決,但這種方案在圖片資源量級較大時,並不能作到實時同步,並且inotify 存在性能問題,參考網上幾種方案對比,故決定採用lsyncd+rsync。html

lsyncd簡介:vim

Lsyncd watches a local directory trees event monitor interface (inotify or fsevents). It aggregates and combines events for a few seconds and then spawns one (or more) process(es) to synchronize the changes. By default this is rsync. 
Lsyncd is thus a light-weight live mirror solution that is comparatively easy to install not requiring new filesystems or block devices and does not hamper local filesystem performance. Lsyncd監聽本地文件系統事件監控接口(inotify或fsevents)。它將若干秒內的事件聚合,而後觸發一個或多個進程以同步變動。默認的同步手段是rsync。
Lysncd是一個輕量級、易安裝的同步方案,它不須要新的文件系統或塊設備,也不會影響本地文件系統性能。

lsyncd的安裝配置:bash

源端配置服務器

rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm # 安裝 epel 源
yum -y install lsyncd rsync # 安裝
mkdir /etc/lsyncd ; vim /etc/lsyncd/lsyncd.conf #配置ssh

settings { -- 日誌文件存放位置 logfile ="/var/log/lsyncd/lsyncd.log", -- 監控目錄狀態文件的存放位置 statusFile ="/var/log/lsyncd/lsyncd.status", -- 指定要監控的事件,如,CloseWrite,Modify,CloseWrite or Modify inotifyMode = "CloseWrite or Modify", -- 指定同步時進程的最大個數 maxProcesses = 10, -- 隔多少秒記錄一次被監控目錄的狀態 statusInterval = 10, -- false=啓用守護模式 nodaemon = false, -- 當事件被命中累計多少次後才進行一次同步(即便間隔低於statusInterval) maxDelays = 20 } sync { -- lsyncd運行模式 -- default.direct=本地目錄間同步 -- default.rsync=使用rsync -- default.rsyncssh=使用rsync的ssh模式 default.rsync, -- 同步的源目錄 source = "/test", -- 同步的目標目錄 target = "rsync://rsync@x.x.x.x:873/rsync_test0", -- 是否同步刪除 true=同步刪除 false=增量備份 delete = false, -- 排除同步文件 exclude = { "dir*" }, -- 等待rsync同步延時時間(秒) delay = 10, -- init=false則只同步lsyncd啓動後變動,不設置則lsyncd啓動後進行全量的同步 --init = True, rsync = {
-- 單位kb bwlimit=1000, binary = "/usr/bin/rsync", archive = true, compress = true, verbose = true, perms = true, -- rsync的用戶密碼,不是Linux系統的用戶密碼 password_file = "/etc/lsyncd/rsync.passwd" } }

建立祕鑰文件:性能

echo "4V6bXyY7MCchEZ2hRq" > /etc/lsyncd/rsync.passwd ; chmod 600 /etc/lsyncd/rsync.passwd測試

 編輯/etc/init.d/lsyncd ,將該文件中的/etc/lsyncd.conf替換成/etc/lsyncd/lsyncd.conf,不要有遺漏。ui

目標端配置this

yum -y install rsync  #安裝rsync

mkdir /var/rsync && mkdir /etc/rsync && mkdir /opt/rsync

vim /etc/rsync/rsync.conf

######### 全局配置參數 ########## #rsync端口 默認873 port=873 #rsync服務的運行用戶,默認是nobody,文件傳輸成功後屬主將是這個uid uid = 0 # rsync服務的運行組,默認是nobody,文件傳輸成功後屬組將是這個gid gid = 0 #rsync daemon在傳輸前是否切換到指定的path目錄下,並將其監禁在內 use chroot = no #最大鏈接數量,0表示沒有限制 max connections = 30 #確保rsync服務器不會永遠等待一個崩潰的客戶端,0表示永遠等待 timeout = 300 #客戶端鏈接過來顯示的消息 motd file = /var/rsync/rsync.motd #rsync daemon的pid文件 pid file = /var/run/rsync.pid #指定鎖文件 lock file = /var/run/rsync.lock #指定rsync的日誌文件,而不把日誌發送給syslog log file = /var/log/rsync/rsync.log #指定哪些文件不用進行壓縮傳輸 dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2 ###########下面指定模塊,並設定模塊配置參數,能夠建立多個模塊########### [rsync_test0] # 第一個模塊的ID #文件路徑 path = /test/ #忽略某些IO錯誤信息 ignore errors #只讀 read only = false #不隱藏該模板 list = true #容許IP hosts allow = x.x.x.x/32 #不容許IP hosts deny = 0.0.0.0/32 #指定鏈接到該模塊的用戶列表,只有列表裏的用戶才能鏈接到模塊,用戶名和對應密碼保存在secrts file中 #這裏使用的不是系統用戶,而是虛擬用戶。不設置時,默認全部用戶都能鏈接,但使用的是匿名鏈接 auth users = rsync #保存auth users用戶列表的用戶名和密碼,每行包含一個username:passwd。 #因爲"strict modes"默認爲true,因此此文件要求非rsync daemon用戶不可讀寫。只有啓用了auth users該選項纔有效。 secrets file = /etc/rsync/rsync.passwd

將rsync用戶認證信息寫入到密碼文件中
echo 'rsync:4V6bXyY7MCchEZ2hRq' >> /etc/rsync/rsync.passwd 其中rsync是用戶名,須要和rsync.conf文件中的auth users保持一致,冒號後面的是該用戶的密碼。注意:該用戶爲虛擬用戶,與Linux系統中的用戶無關。

建立rsync啓動腳本
vim  /opt/rsync/rsync.sh 
#!/bin/bash
#rsync啓動腳本,注意這裏的pid文件路徑,conf文件路徑必定要和本身的配置保持一致。
status1=$(ps -ef | egrep "rsync --daemon.*rsync.conf" | grep -v 'grep')
pidfile="/var/run/rsync.pid"
start_rsync="rsync --daemon --config=/etc/rsync/rsync.conf"

function rsyncstart() {
	if [ "${status1}X" == "X" ];then
		rm -f $pidfile
		$start_rsync
		status2=$(ps -ef | egrep "rsync --daemon.*rsync.conf" | grep -v 'grep')
		if [  "${status2}X" != "X"  ];then
			echo "rsync service start.......OK"
		fi
	else
		echo "rsync service is running !"
	fi
}
function rsyncstop() {
	if [ "${status1}X" != "X" ];then
		kill -9 $(cat $pidfile)
		status2=$(ps -ef | egrep "rsync --daemon.*rsync.conf" | grep -v 'grep')
		if [ "${statusw2}X" == "X" ];then
			echo "rsync service stop.......OK"
		fi
	else
		echo "rsync service is not running !"
	fi
}
function rsyncstatus() {
	if [ "${status1}X" != "X" ];then
		echo "rsync service is running !"
	else
		echo "rsync service is not running !"
	fi
}
function rsyncrestart() {
	if [ "${status1}X" == "X" ];then
		echo "rsync service is not running..."
		rsyncstart
	else
		rsyncstop
		rsyncstart
	fi
}
case $1 in
"start")
rsyncstart
;;
"stop")
rsyncstop
;;
"status")
rsyncstatus
;;
"restart")
rsyncrestart
;;
*)
echo
echo  "Usage: $0 start|stop|restart|status"
echo
esac

chmod +x /opt/rsync/rsync.sh

編輯/etc/init.d/lsyncd  將全部 /etc/lsyncd.conf  替換成 /etc/lsyncd/lsyncd.conf

源端啓動lsyncd: service  lsyncd start  目標端:/opt/rsync/rsync.sh start 

測試rsync配置: rsync -r /test/ rsync://rsync@x.x.x.x:873/rsync_test0/ --password-file=/etc/lsyncd/rsync.passwd

因爲配置的是雙向同步,因此兩邊都須要進行源端和目標端配置。

分別在兩邊的/test 目錄建立文件,觀察同步狀況,驗證配置是否正常。

參考連接:http://www.devisaac.com/2018/07/26/remote-realtime-backup-using-lsyncd-and-rsync.html

相關文章
相關標籤/搜索