Github:axkibe/lsyncd
官方文檔:Lsyncd – Live Syncing (Mirror) Daemoncss
Lsyncd的三種同步模式html
爲了方便,咱們直接把它們稱爲rsync、rsyncssh、direct。linux
1. rsync同步模式nginx
首先,你須要知道rsync的基本用法,如下的rsync命令就能夠把文件從本地的「/data/wwwroot」目錄推送到遠程的「remote@192.168.1.6::wwwroot/」目錄中,運行在「rsync同步模式」的lsyncd正是經過組裝相似這樣的命令來同步文件的:git
rsync -avz --partial --delete /data/wwwroot remote@192.168.1.6::wwwroot/ --password-file=/etc/rsyncd.password
有人可能會疑惑,既然rsync自己就能夠同步,那要lsyncd幹嗎?有兩個緣由:github
- 實時同步。
- 減小rsync掃描文件帶來的延時和性能損耗。
2. rsyncssh同步模式
明白了rsync同步模式,就不難明白rsyncssh模式,由於rsync自己就是有ssh模式的,lsyncd一樣是負責監聽哪些文件變化了,而後組裝rsync同步命令進行同步。
rsync的ssh模式,主要的好處是用於文件移動的時候。web
├── dir1 │ ├── aa.txt │ ├── bb.txt │ └── cc.txt └── dir2 └── dd.txt
├── dir1 │ └── aa.txt └── dir2 ├── bb.txt ├── cc.txt └── dd.txt
3. direct同步模式
這個模式用於本地的兩個目錄之間同步,不用於遠程服務器同步。lsyncd一樣是監聽文件變化事件,而後把變化的文件從源目錄同步到目標目錄,同步的命令,就是linux系統自己的命令,好比cp、rm、mv,增長了文件用cp拷過去,刪除了文件,那邊也用rm刪除,移動了文件,那邊也用mv移動。json
假設有A和B兩臺機,A同步到B,則:vim
A中的lsyncd監聽到文件變化後,調用A中的rsync向B推送文件,B由於運行有一個rsyncd服務,因此能夠接收這個推送,從而完成文件的同步。bash
另外還能夠有C、D、E、F、……,它們都與B相同,只要運行rsyncd服務便可,A上可配置一次性推送向多臺機器。
CentOS用yum、其餘的用各自的包管理軟件,好比Ubuntu用apt-get,Mac用brew install:
yum -y install rsync lsyncd
Lsyncd安裝好以後,默認的配置文件在/etc/lsyncd.conf,另外還有些配置的例子在/usr/share/doc/lsyncd-2.2.2/examples下:
/usr/share/doc/lsyncd-2.2.2/examples/ ├── lalarm.lua ├── lbash.lua ├── lecho.lua ├── lftp.lua ├── lgforce.lua ├── limagemagic.lua ├── lpostcmd.lua ├── lrsync.lua ├── lrsyncssh.lua └── lsayirc.lua 0 directories, 10 files
/etc/lsyncd.conf也能夠寫成/etc/lsyncd.lua,它自己就是用lua(一種腳本語言)寫配置的。
配置文件是使用lua語言寫的,因此註釋要用lua語言的註釋符號,即兩個橫槓--。
配置文件主要有三部分:
如下是兩個官方的配置文檔:
/etc/lsyncd.conf中的默認內容沒什麼價值,能夠所有刪除,下邊咱們來說解配置文件要怎麼寫。
default.rsync模式配置文件:
-- 因爲該配置文件其實是lua語言的語法,因此寫註釋要用--,--是lua語言的註釋符號
-- Lsyncd自己的配置
settings { -- 指定日誌文件位置 logfile = "/var/log/lsyncd/lsyncd.log", -- 指定狀態文件位置 statusFile = "/var/log/lsyncd/lsyncd.status", -- 是否之後臺的方式運行,注意它是nodaemon,因此是雙重否認,若是填false,意思就是「不要不後臺運行」(即後臺運行),非後臺運行通常用於調試,把rsync的verbose也設置爲true,這樣會把同步的細節輸出到控制檯,方便調試 nodaemon = false, -- 系統inotify指定監聽的變化,什麼事件才同步。CloseWrite表示文件關閉的時候同步(建立文件,修改文件後保存都會觸發CloseWrite事件),能夠是"Modify"、"CloseWrite" (默認) 或"CloseWrite or Modify"。 inotifyMode = "CloseWrite", -- 最大同步進程數(default.rsyncssh模式,則必須設置爲1,這就是rsyncssh模式的缺點了,若是是default.rsync模式則能夠設置大於1,這樣會有多個同步進程,速度更快) maxProcesses = 8, -- maxProcesses = 1, -- 配合下面的delay選項使用,delay單位是秒,當delay時間到了,無論maxDelays設置多少,都會同步,一樣,當maxDelays達到了設定值,無論是否到delay時間,都會同步,即兩個選項有一個知足即會觸發同步,爲了實時同>步,咱們通常設置爲1,表示即便只有一個文件改變也同步 maxDelays = 1, } ---- 同步配置default.rsync模式(好比配置從哪同步到哪,忽略哪些文件,多久同步一次等),能夠有多個sync模塊,每一個模塊用於設置一臺目標機器 sync { -- 有default.rsync/default.direct/default.rsyncssh三種模式,咱們默認都用default.rsync便可。 default.rsync, -- 同步源目錄(本機某個目錄) source = "/data/wwwroot", -- 同步目標地址,不一樣同步模式有不一樣寫法,因爲絕大多數狀況都採用rsync同步,因此這裏寫的是rsync的同步地址 target = "remote@192.168.1.6::wwwroot", -- 默認true,容許刪除目錄服務器中的某些文件(即刪除「那些在源服務器中不存在的文件」),可選值有: true/false/startup/running,startup就是隻在啓動lsyncd服務的時候判斷目標服務器中有哪些文件在源服務器中沒有,而後把這些文件刪除,但啓動以後若是目標服務器又新增了文件,這些文件即便在源服務器不存在,也不會被刪除;而running與startup正好相反,是在啓動的時候不會刪除,啓動以後會刪除,true=running+startup,false至關於running和startup都不作。 -- delete = true, -- 哪些文件不一樣步(可用正則)) exclude = { '.**', '.git/**', '*.bak', '*.tmp', 'runtime/**', 'cache/**' }, -- 與上邊的maxDelays配合,maxDelays是累計事件數(單位:個),delay是時間(單位:秒),這兩個只要有一個符合條件就會同步一次,但爲了確保實時同步,maxDelays咱們通常設置爲1,也就是隻要有一個文件變化事件,就會同步一次,而delay是比較大的,默認是15。固然,假如咱們把maxDelays設置爲100,那可能15秒到了也沒有達到100個文件變化,但因爲到達時間了,它也會同步。 delay = 15, -- 當init = false時只同步進程啓動之後發生改動事件的文件,原有的目錄即便有差別也不會同步,若是爲true,則啓動後若是源目錄與目標目錄的文件有差別都會同步,默認爲true。 -- init = false, -- rsync的配置(這是default.rsync模式,若是是default.rsyncssh模式,該模塊的配置會有所不一樣) rsync = { -- rsync可執行文件的絕對路徑 binary = "/usr/bin/rsync", -- 密碼文件路徑(default.rsyncssh模式不須要該項) password_file = "/etc/rsyncd.password", -- 打包後再同步(注意,打包不等於壓縮,打包便可以壓縮也能夠不壓縮) archive = true, -- 壓縮後再同步 compress = false, -- 輸出同步信息(因爲是後臺執行,因此不必輸出,若是非後臺執行能夠設置爲true,非後臺執行主要用於調試) verbose = false, -- 因爲rsync有很是多的選項(請本身rsync --help查看),部分非主要選項能夠用_extra的方式指定,雙引號引住,逗號分隔(bwlimit中的bw是bandwith,即帶寬,整個意思是帶寬限制,omit-link-times忽略符號連接的修改時間) _extra = {"--bwlimit=200", "--omit-link-times"} } }
解釋幾個選項:
exclude再能夠用excludeFrom來代替,這樣就能夠在外部文件單獨寫要排除同步的文件:
excludeFrom = "/etc/lsyncd_exclude.lst",
外部排除同步文件/etc/lsyncd_exclude.lst的寫法:
.svn Runtime/* Uploads/*
若某個事件的路徑中的某些片斷匹配這些文本,那麼排除。好比/bin/foo/bar匹配規則foo。
– 若是規則以/開始,那麼只匹配路徑的開始
若是規則以/結束,那麼只匹配路徑的結束
– ? 匹配任何不是/的字符
– *匹配0或屢次非/字符
– **匹配任何字符0或屢次。
文章開頭已經說過A、B兩臺機各自要安裝什麼,如今A機的操做前面已經講過了,B機的操做,因爲以前寫過文章,這裏就再也不重複,請直接看:rsync的使用。
開放端口
rsync的默認端口是873,若是你是CentOS7的firewalld防火牆,能夠用如下方法容許873端口:
firewall-cmd --zone=public --add-port=873/tcp --permanent firewall-cmd --reload
若是你是本地作實驗以爲防火牆麻煩,也可關閉防火牆:systemctl stop firewalld
啓動lsync服務
如何啓動的官方文檔:Invoking。
lsync配置文件寫好後,就能夠啓動它了,因爲咱們有配置文件,因此啓動方式是:lsyncd -log Exec /etc/lsyncd.conf
-log Exec表示記錄全部進程的日誌(由於若是maxProcesses大於1就會有多個同步進程)
啓動後,它只輸出了:21:46:54 Normal: --- Startup, daemonizing ---
查看是否啓動成功:ps aux | grep lsyncd
如何進程正常運行,能夠看到:root 5238 7.7 0.6 13348 3340 ? Ss 21:46 0:15 lsyncd /etc/lsyncd.conf
查看log文件,你會看到已經同步了不少文件:tail -100f /var/log/lsyncd/lsyncd.log
但其實在CentOS7系統中,咱們通常不直接啓動,而是用systemctl命令來啓動:systemctl start lsyncd
查看啓動狀態:systemctl status lsyncd
中止:systemctl stop lsyncd
重啓:systemctl restart lsyncd
設置開機自啓動:systemctl enable lsyncd
相比rsync,主要修改的有如下幾點:
Error: error preparing /etc/lsyncd.conf: /etc/lsyncd.conf:69: default.rsyncssh must have maxProcesses set to 1.
-- 因爲該配置文件其實是lua語言的語法,因此寫註釋要用--,--是lua語言的註釋符號 -- Lsyncd自己的配置 settings { -- 指定日誌文件位置 logfile = "/var/log/lsyncd/lsyncd.log", -- 指定狀態文件位置 statusFile = "/var/log/lsyncd/lsyncd.status", -- inotify事件模式,什麼事件才同步,CloseWrite表示文件關閉的時候同步(建立文件,修改文件後再關閉(如vim的:wq)都會觸發CloseWrite事件) inotifyMode = "CloseWrite", -- 最大同步進程數(default.rsyncssh模式必須設置爲1,不然沒法啓動,default.rsync模式能夠設置大於1) maxProcesses = 1, -- 配合下面的delay選項使用,delay單位是秒,當delay時間到了,無論maxDelays設置多少,都會同步,一樣,當maxDelays達到了設定值,無論是否到delay時間,都會同步,即兩個選項有一個知足即會觸發同步,爲了實時同>步,咱們通常設置爲1,表示即便只有一個文件改變也同步 maxDelays = 1, -- 是否之後臺的方式運行,注意它是nodaemon,因此是雙重否認,若是填false,意思就是「不要不後臺運行」(即後臺運行),非後臺運行通常用於調試,把rsync的verbose也設置爲true,這樣會把同步的細節輸出到控制檯,方便調試 nodaemon = false, } -- 同步配置default.rsync模式(好比配置從哪同步到哪,要忽略哪些文件,多久同步一次等),能夠有多個sync模塊,每一個模塊用於設置一臺目標機器 sync { -- 有default.rsync/default.direct/default.rsyncssh三種模式,咱們默認都用default.rsyncssh方式,由於這種方式實際上是最好的。 default.rsyncssh, -- 同步源目錄(本機某個目錄) source = "/data/wwwroot/", -- 同步目標地址,rsyncssh模式寫法 host="192.168.1.6", targetdir="/data/wwwroot/", -- 默認true,容許刪除目錄服務器中的某些文件(即刪除「那些在源服務器中不存在的文件」),可選值有: true/false/startup/running,startup就是隻在啓動lsyncd服務的時候判斷目標服務器中有哪些文件在源服務器中沒有,而後把這些文件刪除,但啓動以後若是目標服務器又新增了文件,這些文件即便在源服務器不存在,也不會被刪除;而running與startup正好相反,是在啓動的時候不會刪除,啓動以後會刪除,true=running+startup,false至關於running和startup都不作。 -- delete = true, -- 哪些文件不一樣步(可用正則)) exclude = { '.**', '.git/**', '*.bak', '*.tmp', 'runtime/**', 'cache/**' }, -- 忽略文件路徑規則也可用外部配置文件 -- excludeFrom = "/etc/lsyncd_exclude.lst", -- 與上邊的maxDelays配合,maxDelays是累計事件數(單位:個),delay是時間(單位:秒),這兩個只要有一個符合條件就會同步一次,但爲了確保實時同步,maxDelays咱們通常設置爲1,也就是隻要有一個文件變化事件,就會同步一次,而delay是比較大的,默認是15。固然,假如咱們把maxDelays設置爲100,那可能15秒到了也沒有達到100個文件變化,但因爲到達時間了,它也會同步。 delay = 15, -- 當init = false時只同步進程啓動之後發生改動事件的文件,原有的目錄即便有差別也不會同步,若是爲true,則啓動後若是源目錄與目標目錄的文件有差別,就會同步,咱們固然要設置爲true,默認爲true,因此這個設置能夠不寫,寫在這裏是爲了解釋它。 -- init = false, -- rsyncssh的配置(這是default.rsyncssh模式,若是是default.rsyncssh模式,該模塊的配置會有所不一樣) rsync = { -- rsync可執行文件的絕對路徑 binary = "/usr/bin/rsync", -- 密碼文件路徑(rsync模式不用該配置,rsyncssh模式才須要該項) -- password_file = "/etc/rsyncd.password", -- 打包後再同步(注意,打包不等於壓縮,打包便可以壓縮也能夠不壓縮) archive = true, -- 壓縮後再同步 compress = true, -- 同步符號連接文件 copy_links = true, -- 同步符號連接目錄 copy_dirlinks = true, -- 輸出同步信息(因爲是後臺執行,因此不必輸出,若是非後臺執行能夠設置爲true,非後臺執行主要用於調試) verbose = false, -- 因爲rsync有很是多的選項(請本身rsync --help查看),部分非主要選項能夠用_extra的方式指定,雙引號引住,逗號分隔(bwlimit中的bw是bandwith,即帶寬,整個意思是帶寬限制,omit-link-times忽略符號連接的修改時間) _extra = {"--bwlimit=200", "--omit-link-times"}, -- 指定ssh相關參數選項 rsh = "/usr/bin/ssh -l xiebruce -i /root/.ssh/id_rsa -o StrictHostKeyChecking=no" } }
其中這一句就是用來經過ssh登陸到服務器的:rsh = "/usr/bin/ssh -l xiebruce -i /root/.ssh/id_rsa -o StrictHostKeyChecking=no"
The authenticity of host '192.168.1.6 (192.168.1.6)' can't be established. ECDSA key fingerprint is SHA256:xcDUp3zNlJvhY4fwfwDH1pgOyc5p8Vsr2OjopanEQBw. Are you sure you want to continue connecting (yes/no)?
若是你輸入no那就不會登陸,若是你輸入yes,就會登陸,而且把這個「key fingerprint」(指紋密鑰)添加到你終端的ssh配置目錄下的known_hosts文件中,這個文件的位置,對於Mac/Linux電腦,是在~/.ssh/known_hosts,Windows的話則是在C:\Users\用戶名\目錄下。
同理,如今是rsync登陸你的ssh,因此rsync也會存儲這樣的指紋密鑰,若是「StrictHostKeyChecking」設置爲yes,就意味着每次都要嚴格檢查密鑰(就至關於你用終端登陸時,每次都要你輸入一遍yes),這樣顯然是不必的,因此咱們要把它設置爲「StrictHostKeyChecking=no」。
default.direct模式:該模式我沒有測試
sync { default.direct, source = "/home/user/src/", target = "/home/user/trg/" }
格式以下,每臺目標服務器一個sync模塊便可,每一個sync模塊都像上邊說的那樣寫就行,其實就只是ip不一樣,其餘都同樣:
settings { logfile = "/var/log/lsyncd/lsyncd.log", inotifyMode = "CloseWrite or Modify", -- statusFile = "/var/log/lsyncd/lsyncd.status", } -- B服務器配置 sync { default.rsync, source = "/etc/nginx/", target = "rsync://rsync@192.168.1.6:1873/nginx/", exclude = { ".*", "*.tmp", "*.swp", "*.bak", "*.log", "*.swx", "*~", "sets/config.json", "listen_local_*" }, delay = 2, init = false, rsync = { password_file = "/etc/rsyncd.passwd", archive = true, compress = true, verbose = true, checksum = true, ignore_times = true } } -- C服務器配置 sync { default.rsync, source = "/data/web/", target = "rsync://rsync@192.168.1.11:1873/web/", exclude = { ".*", "*.tmp", "*.swp", "*.bak", "*.log", "*.out", "*/logs/*", "*.swx", "*~" }, delay = 120, init = false, rsync = { password_file = "/etc/rsyncd.passwd", archive = true, compress = true, verbose = true, checksum = true, ignore_times = true } } -- D服務器配置 sync { default.rsync, source = "/data/script/", target = "rsync://rsync@192.168.1.100:1873/script/", exclude = { ".*", "*.tmp", "*.swp", "*.bak", "*.log", "*.out", "*/logs/*", "*.swx", "*~" }, delay = 2, init = false, rsync = { password_file = "/etc/rsyncd.passwd", archive = true, compress = true, verbose = true, checksum = true, ignore_times = true } }