Home | 簡體中文 | 繁體中文 | 雜文 | 知乎專欄 | Github | OSChina 博客 | 雲社區 | 雲棲社區 | Facebook | Linkedin | 視頻教程 | 打賞(Donations) | About
知乎專欄多維度架構 微信號 netkiller-ebook | QQ群:128659835 請註明“讀者”

70.3. lsyncd

70.3.1. 安裝

Ubuntu

		
apt install lsyncd		
		
		

CentOS

		
yum install lsyncd		
		
		

70.3.2. 配置 lsyncd.conf

		
vi etc/lsyncd.conf
settings {
    logfile      ="/var/log/lsyncd/lsyncd.log",
    statusFile   ="/var/log/lsyncd/lsyncd.status",
    inotifyMode  = "CloseWrite",
    maxProcesses = 7,
    -- nodaemon =true,
    }

sync {
    default.rsync,
    source    = "/tmp/src",
    target    = "/tmp/dest",
    -- excludeFrom = "/etc/rsyncd.d/rsync_exclude.lst",
    rsync     = {
        binary    = "/usr/bin/rsync",
        archive   = true,
        compress  = true,
        verbose   = true
        }
    }		
		
		

70.3.2.1. lsyncd.conf 配置項說明

70.3.2.1.1. settings 全局設置
				
logfile 定義日誌檔案
stausFile 定義狀態檔案
nodaemon=true 表示不啟用守護模式,預設
statusInterval 將lsyncd的狀態寫入上面的statusFile的間隔,預設10秒
inotifyMode 指定inotify監控的事件,預設是CloseWrite,還可以是Modify或CloseWrite or Modify
maxProcesses 同步進程的最大個數。假如同時有20個檔案需要同步,而maxProcesses = 8,則最大能看到有8個rysnc進程
maxDelays 累計到多少所監控的事件激活一次同步,即使後面的delay延遲時間還未到
				
				
70.3.2.1.2. sync 定義同步參數

可以繼續使用maxDelays來重寫settings的全局變數。一般第一個參數指定lsyncd以什麼模式運行:rsync、rsyncssh、direct三種模式:

				
default.rsync :本地目錄間同步,使用rsync,也可以達到使用ssh形式的遠程rsync效果,或daemon方式連接遠程rsyncd進程;
default.direct :本地目錄間同步,使用cp、rm等命令完成差異檔案備份;
default.rsyncssh :同步到遠程主機目錄,rsync的ssh模式,需要使用key來認證

source 同步的源目錄,使用絶對路徑。
target 定義目的地址,三種模式寫法:
	/tmp/dest :本地目錄同步,可用於direct和rsync模式
	172.16.0.1:/tmp/dest :同步到遠程伺服器目錄,可用於rsync和rsyncssh模式
	172.16.0.1::module :同步到遠程伺服器目錄,用於rsync模式

init 這是一個優化選項,當init = false,只同步進程啟動以後發生改動事件的檔案,原有的目錄即使有差異也不會同步。預設是true

delay 累計事件,等待rsync同步延時時間,預設15秒(最大累計到1000個不可合併的事件)。也就是15s內監控目錄下發生的改動,會累積到一次rsync同步,避免過于頻繁的同步。(可合併的意思是,15s內兩次修改了同一檔案,最後只同步最新的檔案)

excludeFrom 排除選項,後面指定排除的列表檔案,如excludeFrom = "/etc/lsyncd.exclude",如果是簡單的排除,可以使用exclude = LIST。
這裡的排除規則寫法與原生rsync有點不同,更為簡單:
監控路徑裡的任何部分匹配到一個文本,都會被排除,例如/bin/foo/bar可以匹配規則foo
如果規則以斜線/開頭,則從頭開始要匹配全部
如果規則以/結尾,則要匹配監控路徑的末尾
?匹配任何字元,但不包括/
*匹配0或多個字元,但不包括/
**匹配0或多個字元,可以是/
delete 為了保持target與souce完全同步,Lsyncd預設會delete = true來允許同步刪除。它除了false,還有startup、running值

				
				
70.3.2.1.3. rsync
				
bwlimit 限速,單位kb/s,與rsync相同(這麼重要的選項在文檔裡竟然沒有標出)
compress 壓縮傳輸預設為true。在頻寬與cpu負載之間權衡,本地目錄同步可以考慮把它設為false
perms 預設保留檔案權限。
				
				

70.3.3. 配置演示

		
settings {
    logfile ="/var/log/lsyncd.log",
    statusFile ="/var/log/lsyncd.status",
    inotifyMode = "CloseWrite",
    maxProcesses = 8,
    }


-- 本地目錄同步,direct:cp/rm/mv。 適用:500+萬檔案,變動不大
sync {
    default.direct,
    source    = "/tmp/src",
    target    = "/tmp/dest",
    delay = 1
    maxProcesses = 1
    }

-- 本地目錄同步,rsync模式:rsync
sync {
    default.rsync,
    source    = "/tmp/src",
    target    = "/tmp/dest1",
    excludeFrom = "/etc/rsyncd.d/rsync_exclude.lst",
    rsync     = {
        binary = "/usr/bin/rsync",
        archive = true,
        compress = true,
        bwlimit   = 2000
        } 
    }

-- 遠程目錄同步,rsync模式 + rsyncd daemon
sync {
    default.rsync,
    source    = "/tmp/src",
    target    = "www@192.168.0.1::module",
    delete="running",
    exclude = { ".*", ".tmp" },
    delay = 30,
    init = false,
    rsync     = {
        binary = "/usr/bin/rsync",
        archive = true,
        compress = true,
        verbose   = true,
        password_file = "/etc/rsyncd.d/rsync.pwd",
        _extra    = {"--bwlimit=200"}
        }
    }

-- 遠程目錄同步,rsync模式 + ssh shell
sync {
    default.rsync,
    source    = "/tmp/src",
    target    = "www.netkiller.cn:/tmp/dest",
    -- target    = "root@www.netkiller.cn:/www/netkiller.cn/www.netkiller.cn",
    maxDelays = 5,
    delay = 30,
    -- init = true,
    rsync     = {
        binary = "/usr/bin/rsync",
        archive = true,
        compress = true,
        bwlimit   = 2000
        -- rsh = "/usr/bin/ssh -p 22 -o StrictHostKeyChecking=no"
        -- 如果要指定其它連接埠,請用上面的rsh
        }
    }

-- 遠程目錄同步,rsync模式 + rsyncssh,效果與上面相同
sync {
    default.rsyncssh,
    source    = "/tmp/src",
    host      = "www.netkiller.cn",
    targetdir = "/remote/dir",
    excludeFrom = "/etc/rsyncd.d/rsync_exclude.lst",
    -- maxDelays = 5,
    delay = 0,
    -- init = false,
    rsync    = {
        binary = "/usr/bin/rsync",
        archive = true,
        compress = true,
        verbose   = true,
        _extra = {"--bwlimit=2000"},
        },
    ssh      = {
        port  =  1234
        }
    }