Linux文件同步

簡介
文件實時同步對於運維是個很常見的需求。
如集羣的機器,須要上傳個文件,以前的步驟是每臺服務器分別上傳。
作文件同步之後,只上傳一臺,其餘機器自動同步。         
目前實現實時同步的主流方案有 rsync+inotify、sersync、lsyncd。
rsync + inotify
rsync + inotify 是最多見的方案。
Inotify 是一個 Linux 內核特性,它監控文件系統,而且及時向專門的應用程序發出相關的事件警告,好比刪除、讀、寫和卸載操做等
本準備試驗一下,在網上看到以下評價:
當向監控目錄下拷貝複雜層次目錄(多層次目錄中包含文件),或者向其中拷貝大量文件時,inotify常常會隨機性地遺漏某些文件。這些遺漏掉的文件因爲未被監控到,全部監控的後續操做都不會執行,例如不會被rsync同步。
sersync
這是國人開發的實時同步工具。優勢以下:
1.sersync是使用c++編寫,並且對linux系統文件系統產生的臨時文件和重複的文件操做進行過濾,因此在結合rsync同步的時候,節省了運行時耗和網絡資源。所以更快。
2.配置簡單,其中bin目錄下已經有基本上靜態編譯的2進制文件,配合bin目錄下的xml配置文件直接使用便可。
3.使用多線程進行同步,尤爲在同步較大文件時,可以保證多個服務器實時保持同步狀態。
4.有出錯處理機制,經過失敗隊列對出錯的文件從新同步,若是仍舊失敗,則按設定時長對同步失敗的文件從新同步。
5. 自帶crontab功能,只需在xml配置文件中開啓,便可按您的要求,隔一段時間總體同步一次。無需再額外配置crontab功能。

實戰
ip 目錄 角色
192.168.1.2 /home/work 同步機
192.168.1.3 /home/work 被同步機

基於Centos6 ,使用 sersync + rsync 將 192.168.1.2 的 /home/work 目錄實時同步到 192.168.1.3 的 /home/work 目錄下。php

192.168.1.3 被同步機操做css

yum install rsync -y

vim /etc/rsyncd.conflinux

log file = /var/log/rsyncd.log #日誌文件
pidfile = /var/run/rsyncd.pid #pid 文件
lock file = /var/run/rsync.lock #鎖文件
secrets file = /etc/rsync.pass  #認證文件
max connections = 0 # 鏈接數限制,0即不限制

[dubbo]  # 模塊名
path = /home/work # 同步目錄
comment = dubbo # 註釋,要與模塊名一致 
uid = root #設置rsync運行權限
gid = root
port = 873
use chroot = no
read only = no
list = no
timeout = 600
auth users = xx # 認證用戶
hosts allow =192.168.1.2 # 容許同步的機器
hosts deny = 0.0.0.0/32

vim /etc/rsync.passc++

xx:abc123  #對應rsyncd.conf 的 auth users

設置文件權限shell

chmod 600 /etc/rsyncd.conf
chmod 600 /etc/rsync.pass

啓動express

rsync --daemon

192.168.1.2 同步端操做vim

yum install rsync -y
rsync --daemon
echo "abc123" > /etc/passwd.txt 
chmod 600 /etc/passwd.txt

sersync
如下解釋下配置文件tomcat

<?xml version="1.0" encoding="ISO-8859-1"?>
<head version="2.5">
    <host hostip="localhost" port="8008"></host>
    <debug start="false"/>  #是否開啓debug模式,默認未開啓
    <fileSystem xfs="false"/>    # 文件系統是xfs的要開啓才能正常工做
    <filter start="true"> #是否開啓文件過濾,以下幾種類型能夠根據本身須要進行修改。
    <exclude expression="(.*)\.out"></exclude> #過濾.out文件,如tomcat的catalina.out,微服務的nohup.out 
    <exclude expression="(.*)\.gz"></exclude> #過濾.gz文件
    <exclude expression="^logs/*"></exclude> #過濾logs目錄,如tomcat的logs目錄
    <exclude expression="^static/*"></exclude> #同上解釋
    </filter>
    <inotify> # inotify的選項,默認便可
    <delete start="true"/>
    <createFolder start="true"/>
    <createFile start="false"/>
    <closeWrite start="true"/>
    <moveFrom start="true"/>
    <moveTo start="true"/>
    <attrib start="false"/>
    <modify start="false"/>
    </inotify>

    <sersync>
    <localpath watch="/home/work/"> # 要同步的目錄
        <remote ip="192.168.1.3" name="dubbo"/> # 要同步的服務器,及rsyncd.conf 模塊名
        <!--<remote ip="192.168.8.39" name="tongbu"/>-->
        <!--<remote ip="192.168.8.40" name="tongbu"/>-->
    </localpath>
    <rsync> # 這裏使用的是 rsync daemon 去同步,而不是ssh,因此要指定 passwordfile文件
        <commonParams params="-artuz"/>
        <auth start="true" users="xx" passwordfile="/etc/passwd.txt"/>
        <userDefinedPort start="false" port="874"/><!-- port=874 -->
        <timeout start="false" time="100"/><!-- timeout=100 -->
        <ssh start="false"/>
    </rsync>
    <failLog path="/tmp/rsync_fail_log.log"  timeToExecute="60"/><!--default every 60mins execute once--> # 同步錯誤日誌
    <crontab start="true" schedule="600"><!--600mins--> #是否開啓全盤同步。
        <crontabfilter start="false"> #若是開啓了全盤同步,這裏也要開啓,並設置與上面一致的過濾類型。
        <exclude expression="*(.*)\.out"></exclude>
        <exclude expression="^logs/*"></exclude>
        </crontabfilter>
    </crontab>
    <plugin start="false" name="command"/>
    </sersync>

    <plugin name="command">
    <param prefix="/bin/sh" suffix="" ignoreError="true"/>  <!--prefix /opt/tongbu/mmm.sh suffix-->
    <filter start="false">
        <include expression="(.*)\.php"/>
        <include expression="(.*)\.sh"/>
    </filter>
    </plugin>

    <plugin name="socket">
    <localpath watch="/opt/tongbu">
        <deshost ip="192.168.138.20" port="8009"/>
    </localpath>
    </plugin>
    <plugin name="refreshCDN">
    <localpath watch="/data0/htdocs/cms.xoyo.com/site/">
        <cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx" passwd="xxxx"/>
        <sendurl base="http://pic.xoyo.com/cms"/>
        <regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/>
    </localpath>
    </plugin>
</head>

執行同步bash

/usr/local/sersync/sersync2 -d -r -o  /usr/local/sersync/confxml.xml

監控腳本
vim /home/check_sersync.sh服務器

#!/bin/bash

sersync="/usr/local/sersync/sersync2"
confxml="/usr/local/sersync/confxml.xml"
status=$(ps aux|grep 'sersync2'|grep -v grep|wc -l)

if [[ $status -eq 0 ]]; then
    $sersync -d -r -o $confxml &
else
    exit 0;
fi

添加執行權限

chmod +x /home/check_sersync.sh

設置定時任務

crontab -e

每隔兩分鐘執行一次
*/2 * * * * /bin/bash /home/check_sersync.sh > /dev/null 2>&1
lsyncd

Lysncd 其實是lua語言封裝了 inotify 和 rsync 工具,採用了 Linux 內核(2.6.13 及之後)裏的 inotify 觸發機制,而後經過rsync去差別同步,達到實時的效果。我認爲它最使人稱道的特性是,完美解決了 inotify + rsync海量文件同步帶來的文件頻繁發送文件列表的問題 —— 經過時間延遲或累計觸發事件次數實現。另外,它的配置方式很簡單,lua自己就是一種配置語言,可讀性很是強。lsyncd也有多種工做模式能夠選擇,本地目錄cp,本地目錄rsync,遠程目錄rsyncssh。

這個比sersync設置簡單些。

實戰

被控制端與如上一致。

同步機設置以下:

yum install lsyncd -y

vim /etc/lsyncd.conf

settings {
    logfile = "/tmp/lsyncd.log",    #日誌     
    statusFile = "/tmp/lsyncd.status",    #記錄同步的文件和目錄
    pidfile = "/var/run/lsyncd.pid",         
    statusInterval = 1,      #將lsyncd的狀態寫入上面的statusFile的間隔,默認10秒                
    nodaemon = false,                        
    inotifyMode  = "CloseWrite", #指定inotify監控的事件,默認是CloseWrite,還能夠是Modify或CloseWrite or Modify
    maxProcesses = 1,  #同步進程的最大個數                   
    maxDelays = 1,  #累計到多少所監控的事件激活一次同步,即便後面的delay延遲時間還未到                         
}
sync {
    default.rsync,
    source = "/home/work/",       
    delete = true,                           
    target = "xx@192.168.1.3::dubbo",  # 認證用戶,被同步的服務器,同步的模塊名
    -- excludeFrom = "/etc/rsyncd.d/rsync_exclude.lst", #要同步的文件或目錄列表,我測試lsyncd過濾並很差用,不清楚是哪裏的問題。
rsync = {
    binary = "/usr/bin/rsync", 
    archive = true,            
    compress = false,          
    owner = true,              
    perms = true,              
    whole_file = false,
    password_file = "/etc/passwd.txt"
    }
}

啓動即同步

/etc/init.d/lsyncd start
總結

我我的測試

  • sersync 文件多時同步較快
  • lsyncd 同步大文件時速度較快
  • sersync 過濾功能比較好用,lsyncd過濾我測試失敗,暫未解決。
相關文章
相關標籤/搜索