環境: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