Rsync:用於同步文件、目錄的工具
inotify:監控源目錄的變化,藉助rsync將變化的數據同步到目的目錄
環境描述:
系統:rhel 6.3
源服務器:10.1.1.1
目的服務器:10.1.1.2
目的:將源服務上的/testdir目錄實時同步到目的服務器的/testdir目錄
iptables防火牆,selinux關閉
在目的服務器172.16.1.2上操作:
1、安裝rsync服務端軟件
# yum install -y rsync xinetd
編輯rsync配置文件,設置sync開機自動啓動
# vim /etc/xinetd.d/rsync
service rsync
{
disable = no //將disabled=yes修改爲no
socket_type = stream
wait = no
user = root
server = /usr/bin/rsync
server_args = --daemon
log_on_failure += USERID
}
啓動xinetd服務(以xinted管理rsync服務)
/etc/init.d/xinetd start
2、創建rsyncd.conf配置文件
# vim /etc/rsyncd.conf
log file=/var/log/rsyncd.log //指定日誌文件名稱,rsync服務啓動後自動創建該文件
pidfile=/var/run/rsyncd.pid //pid文件的位置
lock file=/var/run/rsync.lock //支持max connections參數的鎖文件
secrets file=/etc/rsync.pass //用戶認證文件,保存用戶名及密碼
motd file=/etc/rsyncd.motd //rsync啓動時保存歡迎信息的文件
[testdir] //同步目錄名稱描述,建議與同步目錄同名
path=/testdir //數據目錄位置
comment=testdir
uid=root //設置rsync運行權限爲root
gid=root //設置rsync運行權限爲root
port=873 //默認端口號
use chroot=no //默認爲true,表示不同步軟鏈接文件;改爲no表示同步軟鏈接
read only=no //設置rsync服務端文件爲讀寫權限
list=no //不顯示rsync服務端資源列表
max connections=200 //最大連接數
timeout=600 //超時時間
auth users=root //執行數據同步的用戶名,可設置多個,不同用戶名用逗號隔開
hosts allow=172.16.1.1 //允許進行數據同步的客戶端IP地址,多個IP使用逗號隔開
3、創建用戶認證文件
# vim /etc/rsync.pass
root:redhat
格式 用戶名:密碼,一行一個用戶信息
4、分別將配置文件及用戶認證文件的權限修改爲600
# chmod 600 /etc/rsyncd.conf
# chmod 600 /etc/rsync.pass
5、重新啓動rsync服務
# /etc/init.d/xinetd restart
在源服務器上操作:
1、安裝rsync客戶端軟件
# yum install -y rsync xinetd
編輯rsync配置文件,設置sync開機自動啓動
# vim /etc/xinetd.d/rsync
service rsync
{
disable = no //將disabled=yes修改爲no
socket_type = stream
wait = no
user = root
server = /usr/bin/rsync
server_args = --daemon
log_on_failure += USERID
}
啓動xinetd服務(以xinted管理rsync服務)
/etc/init.d/xinetd start
2、創建密碼認證文件,該文件只保存目的服務器上的認證用戶密碼
# vim /etc/passwd.txt
redhat
# chmod 600 /etc/passwd.txt
測試源服務器與目的服務器數據是否同步成功
分別在源服務器和目的服務器上創建/testdir目錄,在源服務器的/testdir中創建任意文件,使用如下同步命令後,查看目的服務器是否會出現創建的文件,如果在目標服務器上可以查看到源服務器創建的文件,表明同步成功
# rsync -avH --port=873 --progress --delete /testdir/ [email protected]::testdir --password-file=/etc/passwd.txt
命令說明:
-a:遞歸傳輸文件,並保留文件所有屬性
-v: 顯示詳細過程
-H: 保留硬鏈接
--progress:顯示備份過程
--delete:同步時,會刪除目的服務器中目錄中源服務器中沒有的文件
/testdir/: 源數據目錄,最後一個/表示同步時只同步子文件及目錄; 如果不加/,表示整個/testdir目錄都會同步的目標服務器
[email protected]::testdir: root同步用戶, 目標服務器中的目錄只需要寫目錄名稱即可
--password-file=/etc/passwd.txt: 指定密碼文件
在源服務器上安裝inotify軟件,實時監測源目錄的變化實現實時同步
1、查看服務器內核是否支持inotify,2.6.13內核後開始支持
# ll /proc/sys/fs/inotify/
total 0
-rw-r--r-- 1 root root 0 Dec 10 09:26 max_queued_events
-rw-r--r-- 1 root root 0 Dec 10 09:26 max_user_instances
-rw-r--r-- 1 root root 0 Dec 10 09:26 max_user_watches
2、安裝inotify
# tar zxf inotify-tools-3.14.tar.gz
# cd inotify-tools-3.14
# ./configure --prefix=/usr/local/inotify
# make
# make install
3、修改環境變量PATH,併爲inotify軟件的庫文件、頭文件創建軟鏈接
# vim /etc/profile
export PATH=$PATH:/usr/local/inotify/bin
# source /etc/profile
導出inotify的庫文件
# echo "/usr/local/inotify/lib" > /etc/ld.so.conf.d/inotify.conf
# ldconfig
導出inotify的頭文件
ln -s /usr/local/inotify/include /usr/include/inotify
4、修改inotify內核參數(默認的inotify參數值太小)
# vim /etc/sysctl.conf
fs.inotify.max_queued_events=9999999
fs.inotify.max_user_watches=99999999
fs.inotify.max_user_instances=65535
# sysctl -p
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 4294967295
kernel.shmall = 268435456
fs.inotify.max_queued_events = 9999999
fs.inotify.max_user_watches = 99999999
fs.inotify.max_user_instances = 65535
參數說明:
max_queued_events:inotify隊列最大長度,值太小,導致監控文件不準確
max_user_watches: 要同步的文件包含多少目錄; 該值要大於find /testdir -type d | wc -l的值
max_user_instances:每個用戶創建inotify實例最大值
5、創建腳本,根據inotify的監測事件,實時觸發rsync同步
# vim rsync.sh
#!/bin/bash
srcdir=/testdir/
dstdir=testdir
excludedir=/usr/local/inotify/exclude.list
rsyncuser=root
rsyncpassdir=/etc/passwd.txt
dstip=10.1.1.2
while true
do
/usr/local/inotify/bin/inotifywait -rq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e close_write,delete,create,attrib -t 1 $srcdir
rsync -avH --delete $srcdir --timeout=100 $rsyncuser@$dstip::$dstdir --password-file=$rsyncpassdir >/dev/null 2>&1
done
exit 0
該腳本只適用於目標服務器只有一個的情況,如果存在多個,在腳本中使用for循環同步到多個目標服務器
# chmod a+x /root/rsync.sh
在源服務器目錄中創建文件,手動運行該腳本,查看目標服務器上是否同步了新創建的文件,如果可以查看到,表明實時同步成功
通過設置腳本開機自動運行 或者通過計劃任務定時運行該腳本,可自動實現實時
開機自動啓動:
# vim /etc/rc.d/rc.local
sh /root/rsync.sh &
計劃任務:
# crontab -e
*/10 * * * * sh /root/rsync.sh &
腳本中inotifywait命令說明:
-m:始終監聽目錄狀態變化
-r:遞歸監聽
-q:顯示狀態變化信息
-format: 指定輸出格式;常用的格式符如:%w:表示發生事件的目錄 %f:表示發生事件的文件 %e:表示發生的事件 %T:使用由-timefmt定義的時間格式
-timefmt:指定時間格式,用於-format選項中的%T格式
-e close_write,modify,delete,create,attrib,move:常用的監控事件