Rsync+sersync實現數據實時同步

[toc]

背景

新公司需要我做代碼發佈的活,一開始覺得沒什麼,不就是把文件丟上去重啓一下服務就好了嘛。結果每天發佈的次數可以達到十幾次。像nodejs的,有3臺服務器,每次都要傳3次,然後做3次重啓操作。大好的青春不能浪費在這上面,於是動了文件同步的心思。
網上說當同步的目錄數據量不大時,建議使用Rsync+Inotify-tools;當數據量很大(幾百G甚至1T以上)、文件很多時,建議使用Rsync+sersync。於是直接上 Rsync+sersync

簡介

1.什麼是Rsync?

Rsync(Remote Synchronize)是一款開源的、快速的、多功能的、可以實現全量及增量的本地或遠程數據同步備份的優秀工具,並且支持多種操作系統平臺運行。

官網文檔:https://rsync.samba.org/ftp/rsync/rsync.html

2.Rsync簡介

Rsync具有本地與遠程兩臺主機之間的數據快速複製同步鏡像、遠程備份等功能,該功能類似scp,但是優於scp功能,還具有本地不同分區目錄之間全量及增量複製數據。

Rsync同步數據鏡像時,通過“quick check”算法,僅同步大小或最後修改時間發生變化的文件或目錄,當然也可以根據權限,屬主等屬性變化的同步,所以可以實現快速同步。

rsync 具有如下的基本特性:

可以鏡像保存整個目錄樹和文件系統
可以很容易做到保持原來文件的權限、時間、軟硬鏈接等
無須特殊權限即可安裝
優化的流程,文件傳輸效率高
可以使用 rsh、ssh 方式來傳輸文件,當然也可以通過直接的 socket 連接
支持匿名傳輸,以方便進行網站鏡象

3.Rsync命令格式

本地: rsync [OPTION...] SRC... [DEST]

通過shell遠程訪問:

拉取: rsync [OPTION...] [USER@]HOST:SRC... [DEST]

推送: rsync [OPTION...] SRC... [USER@]HOST:DEST

通過rsync守護進程訪問:

拉取: rsync [OPTION...] [USER@]HOST::SRC... [DEST]

rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]

推送: rsync [OPTION...] SRC... [USER@]HOST::DEST

rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST

4.什麼Sersync?

sersync是基於Inotify開發的,類似於Inotify-tools的工具;

sersync可以記錄下被監聽目錄中發生變化的(包括增加、刪除、修改)具體某一個文件或某一個目錄的名字;

rsync在同步的時候,只同步發生變化的這個文件或者這個目錄(每次發生變化的數據相對整個同步目錄數據來說是很小的,rsync在遍歷查找比對文件時,速度很快),因此,效率很高;
注:當同步的目錄數據量不大時,建議使用Rsync+Inotify-tools;當數據量很大(幾百G甚至1T以上)、文件很多時,建議使用Rsync+sersync。

Rsync安裝及配置

環境
ip 系統版本 關係
192.168.153.12 CentOS6.9 源服務器
192.168.153.13 CentOS6.9 目標服務器
目的

把192.168.153.12這臺源服務器上的/home/nodejs/目錄實時同步到192.168.153.13目標服務器上的 /home/nodejs 。

具體操作

前提:兩臺機器都要關閉selinux,iptables。

在目標服務器 192.168.153.13 上操作。

#安裝rsync,xinetd。CentOS下使用xinetd管理rsync
yum install rsync xinetd -y
#編輯rsync文件,設置rsync開機啓動
vim /etc/xinetd.d/rsync
disable = yes 改爲  disable = no
#啓動xinetd服務的同時,rsync也啓動了。
/etc/init.d/xinetd start
chkconfig xinetd on

#創建測試文件夾
mkdir -p /home/nodejs

#創建 rsync 配置文件
vim /etc/rsyncd.conf 
#日誌文件
log file = /var/log/rsyncd.log
#pid文件
pidfile = /var/run/rsyncd.pid
#鎖文件
lock file = /var/run/rsync.lock
#密碼文件
secrets file = /etc/rsync.pass 

#自定義一個名稱,認證模塊名
[nodejs]
#要同步的目錄  
path = /home/nodejs/
#註釋,要與自定義名稱一致
comment = nodejs
#設置rsync運行權限
uid = root
gid = root
#默認端口
port=873
#如果"use chroot"指定爲true,那麼rsync在傳輸文件以前首先chroot到path參數所指定的目錄下。這樣做的原因是實現額外的安全防護,但是缺點是需要以root權限,並且不能備份指向外部的符號連接所指向的目錄文件。默認情況下chroot值爲true.但是這個一般不需要,我選擇no或false
use chroot = no
#是否允許可讀可寫
read only = no
#是否允許列表
list = no           
#最大連接數
max connections = 200
#超時時間
timeout = 600
#認證的用戶名
auth users = xx 
#允許訪問的ip,可填寫192.168.153.0/24
hosts allow = 192.168.153.12
#默認的,不要動了。
hosts deny = 0.0.0.0/32

#創建用戶認證文件
vim /etc/rsync.pass
#格式, 用戶名:密碼 ,可以設置多個,每行一個
xx:abc123

#設置文件權限
chmod 600 /etc/rsyncd.conf
chmod 600 /etc/rsync.pass

#啓動rsync
/etc/init.d/xinetd restart

在源服務器192.168.153.12 上操作

#安裝rsync,xinetd。CentOS下使用xinetd管理rsync
yum install rsync xinetd -y
#編輯rsync文件,設置rsync開機啓動
vim /etc/xinetd.d/rsync
disable = yes 改爲  disable = no
#啓動xinetd服務的同時,rsync也啓動了。
/etc/init.d/xinetd start
chkconfig xinetd on

#創建測試文件夾
mkdir -p /home/nodejs
#創建密碼認證文件
vim /etc/passwd.txt
#源服務器就只設置密碼,不需要填用戶
abc123
#設置權限
chmod 600 /etc/passwd.txt

#測試源服務器192.168.153.12 到目標服務器192.168.153.13的數據同步
#在/home/nodejs/目錄下準備這些文件
[root@cs6 nodejs]# ls
xxx0  xxx1  xxx2  yy0  yy1  yy2

rsync -avH --port=873 --progress --delete  /home/nodejs/ [email protected]::nodejs --password-file=/etc/passwd.txt

#然後到目標服務器192.168.153.13 /home/nodejs 目錄下查看是否同步了這些文件夾,如果有,rsync同步完成。

sersync安裝及配置

在源服務器上操作。

#查看服務器內核是否支持inotify,其實這一步可以省略,基本沒有不通過的
ll /proc/sys/fs/inotify
total 0
-rw-r--r-- 1 root root 0 May 23 16:11 max_queued_events
-rw-r--r-- 1 root root 0 May 23 16:11 max_user_instances
-rw-r--r-- 1 root root 0 May 23 16:11 max_user_watches

#修改inotify參數,默認內核參數值太小
vim /etc/sysctl.conf
#inotify
fs.inotify.max_queued_events=99999999
fs.inotify.max_user_watches=99999999
fs.inotify.max_user_instances=65535

參數說明:

max_queued_events:

inotify隊列最大長度,如果值太小,會出現"** Event Queue Overflow **"錯誤,導致監控文件不準確

max_user_watches:

要同步的文件包含多少目錄,可以用:find /home/www.osyunwei.com -type d | wc -l 統計,必須保證max_user_watches值大於統計結果(這裏/home/www.osyunwei.com爲同步文件目錄)

max_user_instances:

每個用戶創建inotify實例最大值

#安裝sersync
http://sersync.sourceforge.net/ 軟件官網
下載需要×××,我給上傳到百度雲了,歡迎下載。
鏈接:https://pan.baidu.com/s/1-NcvYkyWBb7k3Gln8KZxlA 密碼:ovd9

把 sersync2.5.4_64bit_binary_stable_final.tar.gz 上傳到 /usr/src/目錄下。
cd /usr/src/
tar zxvf sersync2.5.4_64bit_binary_stable_final.tar.gz
mv GNU-Linux-x86/ /usr/local/sersync

#配置 sersync
cd /usr/local/sersync/
[root@cs6 sersync]# ls
confxml.xml   sersync2
# 編輯xml文件,先備份
cp confxml.xml{,.bak20180523}
vim confxml.xml

24     <sersync>
25         <localpath watch="/home/nodejs/">
26             <remote ip="192.168.153.13" name="nodejs"/>

32             <auth start="true" users="xx" passwordfile="/etc/passwd.txt"/>

 38         <crontab start="true" schedule="600"><!--600mins-->

參數說明:
localpath wath="/home/nodejs" #源服務器同步目錄
<remote ip="192.168.153.13" name="nodejs"/> # 目標服務器ip,同步模塊
<auth start="true" users="xx" passwordfile="/etc/passwd.txt"/> # users="xx" #使用xx去同步
passwordfile="/etc/passwd.txt" #使用的目標服務器密碼文件爲
start="true" schedule="600"
設置爲true,每隔600分鐘全盤同步一次

#設置開機啓動
vim /etc/rc.d/rc.local
/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 

#重啓定時任務
/etc/init.d/crond restart

測試同步

在源服務器上 /home/nodejs/ 下放置一個redis的安裝包及解壓包。

ls -l 
total 1628
drwxrwxr-x  6 root root    4096 Dec 18  2015 redis-3.0.6
-rw-r--r--  1 root root 1372648 May  8 17:52 redis-3.0.6.tar.gz
等兩分鐘以後去目標服務器 /home/nodejs 下查看文件是否正常同步。
正常同步,說明配置成功了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章