RSYNC

環境:Redhat7.4
master:192.168.230.15
slave:192.168.230.16

服務名稱:Rsync

rsync簡介

rsync是linux系統下的數據鏡像備份工具。使用快速增量備份工具Remote Sync可以遠程同步,支持本地複製,或者與其他SSH、rsync主機同步。

rsync 特性

rsync支持很多特性:

  • 可以鏡像保存整個目錄樹和文件系統
  • 可以很容易做到保持原來文件的權限、時間、軟硬鏈接等等
  • 無須特殊權限即可安裝
  • 快速:第一次同步時rsync會複製全部內容,但在下一次只傳輸修改過的文件。rsync在傳輸數據的過程中可以實行壓縮及解壓縮操作,因此可以使用更少的帶寬
  • 安全:可以使用scp、ssh等方式來傳輸文件,當然也可以通過直接的socket連接
  • 支持匿名傳輸,以方便進行網站鏡象
rsync的ssh認證協議

rsync命令來同步系統文件之前要先登錄remote主機認證,認證過程中用到的協議有2種:

  • ssh協議

  • rsync協議

    rsync server端不用啓動rsync的daemon進程,只要獲取remote host的用戶 名和密碼就可以直接rsync同步文件
    rsync server端因爲不用啓動daemon進程,所以也不用配置文件/etc/rsyncd.conf
    ssh認證協議跟scp的原理是一樣的,如果在同步過程中不想輸入密碼就用ssh-keygen -t rsa打通通道

rsync命令

Rsync的命令格式常用的有以下三種:

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

//對應於以上三種命令格式,rsync有三種不同的工作模式:

1)拷貝本地文件。當SRC和DES路徑信息都不包含有單個冒號":"分隔符時就啓動這種工作模式。
2)使用一個遠程shell程序(如rsh、ssh)來實現將本地機器的內容拷貝到遠程機器。當DST路徑地址包含單個冒號":"分隔符時啓動該模式。
3)使用一個遠程shell程序(如rsh、ssh)來實現將遠程機器的內容拷貝到本地機器。當SRC地址路徑包含單個冒號":"分隔符時啓動該模式。

rsync常用選項:

-a, --archive       //歸檔
-v, --verbose       //囉嗦模式
-q, --quiet         //靜默模式
-r, --recursive     //遞歸
-p, --perms         //保持原有的權限屬性
-z, --compress      //在傳輸時壓縮,節省帶寬,加快傳輸速度
--delete            //在源服務器上做的刪除操作也會在目標服務器上同步

rsync+inotify

rsync與傳統的cp、tar備份方式相比,rsync具有安全性高、備份迅速、支持增量備份等優點,通過rsync可以解決對實時性要求不高的數據備份需求,例如定期的備份文件服務器數據到遠端服務器,對本地磁盤定期做數據鏡像等。
隨着應用系統規模的不斷擴大,對數據的安全性和可靠性也提出的更好的要求,rsync在高端業務系統中也逐漸暴露出了很多不足,首先,rsync同步數據時,需要掃描所有文件後進行比對,進行差量傳輸。如果文件數量達到了百萬甚至千萬量級,掃描所有文件將是非常耗時的。而且正在發生變化的往往是其中很少的一部分,這是非常低效的方式。其次,rsync不能實時的去監測、同步數據,雖然它可以通過linux守護進程的方式進行觸發同步,但是兩次觸發動作一定會有時間差,這樣就導致了服務端和客戶端數據可能出現不一致,無法在應用故障時完全的恢復數據。基於以上原因,rsync+inotify組合出現了!

Inotify是一種強大的、細粒度的、異步的文件系統事件監控機制,linux內核從2.6.13起,加入了Inotify支持,通過Inotify可以監控文件系統中添加、刪除,修改、移動等各種細微事件,利用這個內核接口,第三方軟件就可以監控文件系統下文件的各種變化情況,而inotify-tools就是這樣的一個第三方軟件。
在前面有講到,rsync可以實現觸發式的文件同步,但是通過crontab守護進程方式進行觸發,同步的數據和實際數據會有差異,而inotify可以監控文件系統的各種變化,當文件有任何變動時,就觸發rsync同步,這樣剛好解決了同步數據的實時性問題。

環境說明:

服務器類型 IP地址 應用 操作系統
源服務器 192.168.230.16 rsync
inotify-tools
腳本
centos7/redhat7
目標服務器 192.168.230.15 rsync centos7/redhat7

需求:

把源服務器上/etc目錄實時同步到目標服務器的/chenshuai/下

在目標服務器上做以下操作:

[root@master ~]# systemctl stop firewalld
[root@master ~]# setenforce 0
[root@master ~]# yum install rsync -y
[root@master ~]# 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    //用戶認證配置文件,裏面保存用戶名稱和密碼,必須手動創建這個文件

[etc_from_client]     //自定義同步名稱
path = /chenshuai          //rsync服務端數據存放路徑,客戶端的數據將同步至此目錄
comment = sync etc from client
uid = root        //設置rsync運行權限爲root
gid = root        //設置rsync運行權限爲root
port = 873        //默認端口
ignore errors     //表示出現錯誤忽略錯誤
use chroot = no       //默認爲true,修改爲no,增加對目錄文件軟連接的備份
read only = no    //設置rsync服務端爲讀寫權限
list = no     //不顯示rsync服務端資源列表
max connections = 200     //最大連接數
timeout = 600     //設置超時時間
auth users = admin        //執行數據同步的用戶名,可以設置多個,用英文狀態下逗號隔開
hosts allow = 192.168.230.16   //允許進行數據同步的客戶端IP地址,可以設置多個,用英文狀態下逗號隔開
[root@master ~]# mkdir /chenshuai/  這個目錄可自行創建
[root@master ~]# echo 'admin:123456' > /etc/rsync.pass
[root@master ~]# chmod 600 /etc/rsync.pass 
[root@master ~]# systemctl start rsyncd
[root@master ~]# systemctl enable rsyncd

在源服務器上做以下操作:

[root@slave ~]# systemctl stop firewalld
[root@slave ~]# setenforce 0
//安裝rsync服務端軟件,只需要安裝,不要啓動,不需要配置
[root@slave ~]# yum install rsync -y
//創建認證密碼文件
[root@slave ~]# echo '123456' > /etc/rsync.pass
//設置文件權限,只設置文件所有者具有讀取、寫入權限即可
[root@slave ~]# chmod 600 /etc/rsync.pass 
//在源服務器上創建測試目錄,然後在源服務器運行以下命令
[root@slave ~]# mkdir -p /root/test
[root@slave ~]# touch /root/test/haha
[root@slave ~]# rsync -avH --port 873 --progress --delete /root/test/ [email protected]::etc_from_client --password-file=/etc/rsync.pass
//運行完成後,在目標服務器上查看,在/chenshuai目錄下有haha文件,說明數據同步成功
[root@master ~]# ls /chenshuai/
haha

//安裝inotify-tools工具,實時觸發rsync進行同步
[root@slave ~]# yum install inotify-tools -y
//寫同步腳本,此步乃最最重要的一步,讓腳本自動去檢測我們制定的目錄下 \
//文件發生的變化,然後再執行rsync的命令把它同步到我們的服務器端去
[root@slave ~]# vi /scripts/inotify.sh
host=192.168.230.15      //目標服務器的ip(備份服務器)
src=/etc        //在源服務器上所要監控的備份目錄(此處可以自定義,但是要保證存在)
des=etc_from_client     //自定義的模塊名,需要與目標服務器上定義的同步名稱一致
password=/etc/rsync.pass        //執行數據同步的密碼文件
user=admin          //執行數據同步的用戶名
inotifywait=/usr/bin/inotifywait

$inotifywait -mrq --timefmt '%Y%m%d %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src \
| while read files;do
    rsync -avzP --delete  --timeout=100 --password-file=${password} $src $user@$host::$des
    echo "${files} was rsynced" >>/tmp/rsync.log 2>&1
done

//啓動腳本
[root@slave ~]# nohup bash /scripts/inotify.sh &  這裏會報一個錯,直接Ctrl+c
[root@slave ~]# mkdir /etc/mydir
[root@slave ~]# touch /etc/mydir/myfile
//查看inotify生成的日誌
[root@slave ~]# tail /tmp/rsync.log 
20190219 16:03 /etc/mydirCREATE,ISDIR was rsynced
20190219 16:03 /etc/mydir/myfileCREATE was rsynced
//從日誌上可以看到,我們生成了一個mydir目錄,並且添加了內容到其裏面

//設置開機自啓
[root@slave ~]# chmod +x /etc/rc.d/rc.local 
[root@slave ~]# echo 'nohup /bin/bash /scripts/inotify.sh' >> /etc/rc.d/rc.local

//到目標服務器上去查看是否把新生成的文件自動傳上去了:
[root@master ~]# ls /chenshuai/
etc  haha
[root@master ~]# ls /chenshuai/etc/ |grep mydir
mydir
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章