需求:爲保證國內外圖片加載速度,國內請求上傳圖片資源地址阿里雲服務器,國外請求上傳圖片資源地址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系統中的用戶無關。
#!/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