rsync

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:常用的監控事件


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章