用lsyncd和rsyncd實現無ssh支持的文件實時同步

文件存儲與同步的基本討論

網站發展到必定階段,有時須要將各服務器上傳的文件進行集中,這裏討論若是集中的問題,至於若是分散負載均衡、CDN加速、多主機、多域名等blablabla,概不討論。linux

集中共享的方案(環境以CentOS 6.5爲例)一般的做法是文件同步、共享硬盤空間、硬件堆疊和分佈式文件存儲四種。git

  1. 文件同步是用工具定時或自動將分散的文件同步到一個集中的存儲區域,如cron配合ftp、ssh、rsync等實現定時同步;github

  2. 共享空間的作法是用文件存儲協議實現掛載和管理,如mount、samba、NFS;apache

  3. 硬件堆疊是採用大磁盤空間實現,如陣列;centos

  4. 最後一種是集羣和分佈式文件系統,如taobao文件系統 tfs服務器

第2種不太穩定,第3種成本高,第4種實施複雜,最簡單實用的是第1種。負載均衡

第1種方案傳統的作法是用rsync命令,結合ssh證書受權免賬號登陸來實現同步,但這種作法有幾個負面影響:ssh

  • 須要添加本地賬號分佈式

  • 不是實時同步工具

  • 配置稍顯囉嗦

好了,咱們要實現的功能的實時監控,實時同步,管理簡單,維護方便,這裏介紹lsyncd和rsyncd兩個命令實現的文件集中同步管理。

lsyncd負責監控文件的變化,發起文件推送;rsyncd負責接收同步指令,進行身份認證及寫文件到本地。

lsyncd和rsyncd的配置及管理

接收端rsyncd的配置

通常linux服務器均安裝有rsync命令,沒有的就安裝一個。

yum install rsync

配置成daemon運行方式

 vi /etc/rsyncd.conf
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
[img]
    path = 換成本地寫入文件夾絕對路徑
    comment = special offer image files
    uid = root
    gid = root
    read only = no
    list = yes
    auth users = rsyncclient
    secrets file = /etc/rsyncd.secrets
    hosts allow = 192.168.100.0/255.255.255.0 192.168.200.234

注意:[img]爲虛擬目錄名稱,在發起端配置中要用到;hosts allow換成發在發端的IP地址;auth users爲認證的用戶名,密碼存在/etc/rsyncd.secrets文件裏。uid和gid此處寫的是root注意換成你本身的真實用戶和組,如,是網站上傳的文件夾,須要換成apache或nobody,不然文件上傳會失敗。

vi /etc/rsyncd.secrets
rsyncclient:password

注意:此密碼文件與發在發端的密碼文件稍有不一樣,多了一個用戶名。

啓動rsyncd(假設當前在root環境):

/usr/bin/rsync --daemon

把這個命令加到 /etc/rc.local做自動啓動用。

查看服務Log是否有錯誤

tail -f /var/log/rsyncd.log

 

發起端lsyncd的配置

安裝

yum install lsyncd

若是提示沒有找到lsyncd你須要下載epel.repo (關於阿里雲鏡像的配置)到/etc/yum.repos.d/目錄下再安裝便可。

vi /etc/lsyncd.conf

將下述代碼粘貼到此文件

settings {
    logfile = "/var/log/lsyncd/lsyncd.log",
    statusFile = "/var/log/lsyncd/lsyncd-status.log",
    statusInterval = 10
}
--------------------------------
-- sync files to product server
-------------------------------
sync {
    default.rsync,
    source="換成你的要監控並同步的文件夾絕對路徑",
    target="rsync://rsyncclient@[換成接收端IP]:/img",
    delete = false,-- Doesn't delete files on the remote host eventho they're deleted at the source. This might be beneficial for some not for others
    delay = 5, -- We want to delay the syncing for 5 seconds so we queue up the events
    maxProcesses = 4, -- We only want to use a maximum of 4 rsync processes at same time
    rsync = {
        password_file = "/etc/rsyncd.secrets_master",
        compress = true,
        acls = true,
        verbose = true,
        owner = true,
        group = true,
        perms = true
    }
}

重要:注意上面的 delete = false 參數,若是不要刪除接收端的文件,請設置爲 false,不然將自動刪除發起端沒有,但在接收端有的文件!!請慎重選擇,通常設成false。

上面配置中假設同步賬號叫 rsyncclient,密碼文件存放在 /etc/rsyncd.secret_master,注意:這裏的賬號不是本地賬號,只是rsyncd的虛擬賬號。

接收端虛擬路徑叫 img,具體定義參考接收端的配置,它只是一個虛擬目錄,實際指向在配置文件中。

vi /etc/rsyncd.secrets_master
password

注意:此文件一行只有一個明文密碼。

最後,啓動lsyncd服務

service lsyncd start

查看log看是否正常啓動

tail -f /var/log/lsyncd/lsyncd.log

若是有這行代表正常啓動並配置成功了。

Normal: Finished a list after exitcode: 0

將lsyncd設成自動啓動

chkconfig --level 3 lsyncd on

 

一切順利的話,發起端已經監控了文件的變化,並在5秒延時後自動推送到接收端,您能夠本身測試查看實際效果。再次提醒,請先在測試環境演練多遍,觀察至少一週時間後再配置到生產環境!

‍總結‍

此方案的優勢是實時同步,無須ssh協議支持,不須要添加本地賬號,配置簡單,佈署靈活。

 

<做者:朱淦 350050183@qq.com>‍

相關文章
相關標籤/搜索