超實用!!rsync分散式 + inotify監控實時同步
一、rsync同步簡介
.一款快速增量備份工具
- Remote Sync,遠端同步
- 支援本地複製,或者與其他SSH、rsync主機同步
- 官方網站: http://rsync.samba.org
1. 軟體簡介
- Rsync 是一個遠端資料同步工具,可通過 LAN/WAN 快速同步多臺主機間的檔案。
- Rsync 本來是用以取代scp 的一個工具,它當前由 Rsync.samba.org 維護。
- Rsync 使用所謂的“Rsync 演演算法”來使本地和遠端兩個主機之間的檔案達到同步,這個演算法只傳送兩個檔案的不同部分,而不是每次都整份傳送,因此速度相當快。
- 執行 Rsync server 的機器也叫 backup server,一個 Rsync server 可同時備份多個 client 的資料;也可以多個Rsync server 備份一個 client 的資料。
2. Rsync原理
- Rsync 可以使用 daemon 模式。Rsync server 會開啟一個873的服務通道(port),等待對方 Rsync 連線。
- 連線時,Rsync server 會檢查口令是否相符,若通過口令查核,則可以開始進行檔案傳輸。
- 第一次連通完成時,會把整份檔案傳輸一次,下一次就只傳送二個檔案之間不同的部份。
Rsync 支援大多數的類 Unix 系統,CentOS7.0圖形介面安裝基本已經安裝了Rsync軟體,可以用yum安裝
3. Rsync 的基本特點如下:
- 可以映象儲存整個目錄樹和檔案系統;
- 可以很容易做到保持原來檔案的許可權、時間、軟硬連結等;
- 無須特殊許可權即可安裝;
- 優化的流程,檔案傳輸效率高;
- 可以使用 rcp、ssh 等方式來傳輸檔案,當然也可以通過直接的 socket 連線;
- 支援匿名傳輸。
4.rsync命令的用法
格式:rsync [選項] 原始位置 目標位置 常用選項
選項 | 用途 |
---|---|
-a | 歸檔模式,遞迴併保留物件屬性,等同於-rlptgoD |
-V | 顯示同步過程的詳細(verbose)資訊 |
-z | 在傳輸檔案時進行壓縮(compress)-H:保留硬連線檔案 |
-A | 保留ACL屬性資訊 |
–delete | 刪除目標位置有而原始位置沒有的檔案 |
–checksum | 根據物件的校驗和來決定是否跳過檔案 |
5.同步源的兩種方法
格式1: rsync [選項] 使用者名稱@主機地址::共享模組名 目標位置
格式2: rsync [選項] rsync://使用者名稱@主機地址/共享模組名 目標位置
二、配置Rsync伺服器
Rsync同步源(指備份操作的遠端伺服器,也稱為備份源)
1.基本思路
- 建立rsyncd.conf配置檔案、獨立的賬號檔案
- 啟用rsync的–daemon模式
daemon守護程式的作用是時該服務即使沒有請求服務,服務的埠號任然開放。
應用示例 - 使用者backuper,允許下行同步
- 操作的目錄為/var/www/html/
實驗步驟
- 配置檔案/etc/rsyncd.conf
- 設定rsync賬號檔案
- 啟動rsync服務
- 到另一臺伺服器驗證
【伺服器1(rsync源端)配置】
1.修改rsync配置檔案
[root@oracle ~]# vi /etc/rsyncd.conf
uid = nobody ##主賬號為匿名
gid = nobody ##組賬號匿名
use chroot = yes ##家目錄鎖定,鎖定家目錄後無法使用cd命令進入其他目錄
address = 192.168.10.10 ##本地rsync源端地址
max connections = 4 ##最大連線數為4
pid file = /var/run/rsyncd.pid ##pid檔案位置
log file = /var/log/rsyncd.log ##日誌檔案位置
port = 873 ##監聽埠873
hosts allow = 192.168.10.0/24 ##允許訪問的網段
[wwwroot] ##共享模組的名稱
path = /var/www/html ##共享目錄
comment = ww.bai.com ##描述資訊,自定義
read only = yes ##只讀模式
auth users = backuper ##授權的虛擬使用者為backuper(不需要系統建立)
secrets file = /etc/rsyncd_user.db ##認證密碼存放檔案
dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2 ##不進行壓縮的檔案格式型別
2.編輯使用者記錄檔案並啟動rsync
[root@oracle ~]# vi /etc/rsyncd_user.db ##編寫使用者資料檔案
backuper:abc123 ##每一行為一個使用者記錄,格式為——使用者名稱:密碼
[root@oracle ~]# chmod 600 /etc/rsyncd_user.db ## 600許可權,不允許其他使用者讀取
[root@oracle ~]# rsync --daemon ##啟動守護程式
[root@oracle ~]# netstat -anupt |grep 873 ##檢視埠狀態
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 12109/rsync
tcp6 0 0 :::873 :::* LISTEN 12109/rsync
3.共享目錄下建立檔案測試
[root@oracle html]# vi abc
abc
[root@oracle html]# cat abc
this abc
【伺服器2(發起端)】
1.到發起端測試,檢視 /var/www/html目錄下檔案
[root@squid ~]# cd /var/www/html
[root@squid html]# ls ##檢視不到檔案,為空
[root@squid html]#
2.和伺服器1(源端)進行rsync同步
[root@squid html]# rsync -avz rsync://backuper@192.168.10.10/wwwroot /var/www/html
##rsync -avz backuper@192.168.10.10::wwwroot /var/www/html ###該命令效果一樣
Password: ##輸入密碼
receiving incremental file list
./
abc
sent 46 bytes received 118 bytes 36.44 bytes/sec
total size is 9 speedup is 0.05
[root@squid html]# ls ##在此檢視,發現源端的檔案同步到發起端了
abc
3.配置免互動
[root@squid html]# rm -rf abc ##先刪除abc檔案,方便測試
[root@squid html]# ls
[root@squid html]#
[root@squid html]# vi /etc/server.password ##編寫免互動密碼存放檔案
abc123 ##寫入rsync指定的虛擬使用者backuper的密碼
[root@squid html]# chmod 600 /etc/server.password ##同樣設定600許可權,只允許主人檢視
[root@squid html]# vi /etc/server.password
[root@squid html]# rsync -az --delete --password-file=/etc/server.password backuper@192.168.10.10::wwwroot /var/www/html ##免互動同步,--delete會刪除本端與源端檔名不相同的檔案,--password-file指定存放密碼的檔案位置
[root@squid html]# ls
abc
[root@squid html]# cat abc ##同步成功
this abc
4.可指定週期性計劃任務,定時同步
[root@oracle ~]# crontab -e ##設定每晚10點執行同步
*/30 22 * * * rsync -az --delete --password-file=/etc/server.password backuper@192.168.10.10::wwwroot /var/www/html
[root@oracle ~]# crontab -l
*/30 22 * * * rsync -az --delete --password-file=/etc/server.password backuper@192.168.10.10::wwwroot /var/www/html
三、rsync+inotify實時同步
單靠rsync結合週期計劃任務有很大的侷限性,不能實時的更新,因此產生inotify這款軟體來解決這個瓶頸
1.rsync實時同步
- 定期同步的不足
◆ 執行備份的時間固定,延遲明顯、實時性差
◆ 當同步源長期不變化時,密集的定期任務是不必要的 - 實時同步的優點
◆ 一旦同步源出現變化,立即啟動備份
◆ 只要同步源無變化,則不執行備份
2.關於inotify
- Linux核心的inotify機制
◆ 從版本2.6.13開始提供
◆ 可以監控檔案系統的變動情況,並做出通知
◆ 響應輔助軟體: inotify-tools
3.實驗設計
安裝inotify-tools輔助工具
inotifywait:用於持續監控,實時輸出結果
inotifywatch:用於短期監控,任務完成後再出結果
需要兩臺伺服器:伺服器1(rsync源端)、伺服器2(inotify端)
- 調整inotify需要的核心引數
- 安裝inotify軟體
- 修改上述實驗中rsync伺服器1端中配置檔案引數:read only = no
- 調整兩臺伺服器共享目錄html的許可權為777
- 使用inotify內建命令進行測試
- 編輯實時監控指令碼
- 驗證指令碼可用性
rsync分散式+inotify實時監控,實現實時同步
【伺服器2(inotify端)】
1.修改核心引數
[root@oracle ~]# vi /etc/sysctl.conf
fs.inotify.max_queued_events = 16384
fs.inotify.max_user_instances = 1024
fs.inotify.max_user_watches = 1048576
[root@oracle ~]# sysctl -p ##生效
fs.inotify.max_queued_events = 16384 ##監控事件的佇列大小
fs.inotify.max_user_instances = 1024 ##監控的最大例項數
fs.inotify.max_user_watches = 1048576 ##每個例項被監控的最大檔案數
2. 安裝inotify軟體
[root@oracle ~]# ls ##檢視inotify軟體包
inotify-tools-3.14.tar.gz
[root@oracle inotify-tools-3.14]# yum -y install gcc gcc-c++ make ##安裝環境
[root@oracle ~]# tar zxvf inotify-tools-3.14.tar.gz -C /opt/ ##解壓軟體包
[root@oracle ~]# cd /opt/inotify-tools-3.14/
[root@oracle inotify-tools-3.14]# ./configure ##直接配置
[root@oracle inotify-tools-3.14]# make && make install ##安裝軟體
[root@oracle ~]# inotifywait -mrq -e modify,create,move,delete /var/www/html & ##後臺執行監控
3.測試監控
[root@oracle ~]# cd /var/www/html ##進入html目錄建立檔案
[root@oracle html]# touch test.txt ##建立檔案
[root@oracle ~]#
/var/www/html/ CREATE test.txt ##這裡後臺會有監控提示,建立了test.txt檔案
[root@oracle html]# rm -rf test.txt ## 刪除test.txt檔案
[root@oracle ~]#
/var/www/html/ CREATE test.txt
/var/www/html/ DELETE test.txt ##後臺出現新的提示,刪除了test.txt檔案
4.配置監控指令碼
[root@oracle opt]# vim /opt/inotify.sh ##編寫監控指令碼
#!/bin/bash
INOTIFY_CMD="inotifywait -mrq -e modify,create,move,attrib,delete /var/www/html/"
RSYNC_CMD="rsync -az --delete --password-file=/etc/server.password /var/www/html/ backuper@192.168.10.10::wwwroot/"
$INOTIFY_CMD | while read DIRECTORY EVENT FILE
do
if [ $(pgrep rsync | wc -l) -le 0 ]
then
$RSYNC_CMD
fi
done
5.調整共享目錄html的許可權為777
[root@oracle opt]# chmod +x inotify.sh ##給執行許可權
[root@oracle opt]# chmod 777 /var/www/html/ ##給/var/www/html最高許可權,可供讀寫
[root@oracle opt]# ll /var/www/
total 0
drwxrwxrwx. 2 root root 17 Oct 23 22:13 html
【伺服器1(rsync源端)】
### 1.修改/etc/rsyncd.conf中[wwwroot]共享模組配置
[root@oracle opt]# vi /etc/rsyncd.conf
……省略部分
[wwwroot]
path = /var/www/html
comment = ww.bai.com
read only = no ##將這裡的yes改為no,需要能寫
……省略部分
2.調整共享目錄html的許可權為777
[root@squid html]# chmod 777 /var/www/html ##同樣給與最高許可權
[root@squid html]# ll /var/www/
drwxrwxrwx 2 root root 17 Oct 23 19:16 html
3.關閉rsync程式,生效配置
[root@oracle ~]# netstat -anupt |grep 873
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 12109/rsync
[root@oracle ~]# pkill -9 rsync ##關閉程式,重啟生效
[root@oracle ~]# netstat -anupt |grep rsync ##程式關閉了
[root@oracle ~]# rsync --daemon ##啟動守護程式
error:failed to create pid file /var/run/rsyncd.pid: File exists ##會提示報錯,pid檔案存在
[root@oracle ~]# rm -rf /var/run/rsyncd.pid ##刪除pid檔案即可
[root@oracle ~]# rsync --daemon ##再次啟動守護程式
驗證
1.首先在兩臺伺服器共享目錄插入不同檔案,造成不同步現象
【伺服器1(rsync源端)】
[root@oracle ~]# cd /var/www/html/
[root@oracle html]# touch test.txt
[root@oracle html]# ls
test.txt
[root@oracle html]#
【伺服器2(inotify端)】
[root@squid ~]# cd /var/www/html/
[root@squid html]# touch abc.txt
[root@squid html]# ls
abc.txt
[root@squid html]#
兩臺伺服器共享目錄內檔案不一致
2.執行指令碼,進行驗證
【伺服器2(inotify端)】
[root@squid opt]# ./inotify.sh & ##後臺執行指令碼
[1] 10901
[root@squid opt]# cd /var/www/html/
[root@squid html]# touch 123.txt ##在共享目錄中新增新的檔案
[root@squid html]# rsync: failed to set times on "/." (in wwwroot): Operation not permitted (1)
rsync: chgrp "/.123.txt.BUNMxZ" (in wwwroot) failed: Operation not permitted (1)
rsync: chgrp "/.abc.txt.cVZqbR" (in wwwroot) failed: Operation not permitted (1)
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1178) [sender=3.1.2]
rsync: failed to set times on "/." (in wwwroot): Operation not permitted (1)
rsync: chgrp "/.123.txt.wa4qcd" (in wwwroot) failed: Operation not permitted (1)
rsync: chgrp "/.abc.txt.33vNF5" (in wwwroot) failed: Operation not permitted (1)
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1178) [sender=3.1.2]
###注意,這裡的failed提示並不是同步失敗,而是因為rsync伺服器那一端修改了read only = no的引數,rsync程式預設是yes,因此會提示失敗,實際上並不影響
【伺服器1(rsync源端)】
[root@oracle html]# ls ##原本的test.txt檔案被刪除,新增了inotify端的檔案,完全一致狀態
123.txt abc.txt
相關文章
- rsync+inotify實時同步
- rsync+inotify資料的實時同步
- 小白都會的rsync遠端同步原理及-------(定期同步與rsync+inotify實時同步)實驗
- rsync+inotify實現實時同步(小業務場景解決方案)
- 綜合架構-5 實時同步服務-rsync+crond+inotify架構
- rsync實時同步
- 檔案共享服務之實時備份(inotify+rsync)
- 使用inotify-tools與rsync構建實時備份系統
- rsync 守護程式及實時同步
- Zabbix 4.0企業級分散式監控實戰分散式
- 分散式監控平臺Centreon實踐真傳分散式
- RunLoop實戰:實時卡頓監控OOP
- Prometheus監控實戰應用Prometheus
- 實時監控系統,統一監控企業APIAPI
- SkyWalking —— 分散式應用監控與鏈路追蹤分散式
- 搭建jmeter+influxdb+grafana壓測實時監控平臺(超詳細,小白適用)JMeterUXGrafana
- 為你介紹4個超實用的Linux監控工具Linux
- webrtc-streamer實時播放監控Web
- linux 利用rsync實現檔案增量同步Linux
- Zabbix企業分散式監控工具分散式
- 打造雲原生大型分散式監控系統 (三): Thanos 部署與實踐分散式
- alpakka-kafka(10)-用kafka實現分散式近實時交易Kafka分散式
- 企業實踐|分散式系統可觀測性之應用業務指標監控分散式指標
- Spring Boot應用監控實戰Spring Boot
- 用canal監控binlog並實現mysql定製同步資料的功能MySql
- TiDB監控實現--存活監控TiDB
- 網路實時監控工具:PeakHour for macMac
- IO實時監控命令iostat詳解iOS
- SpringBoot+WebSocket實時監控異常Spring BootWeb
- Angular 如何通過 HTTP Interceptor 實現 HTTP 請求的超時監控AngularHTTP
- Java CompletableFuture 非同步超時實現探索Java非同步
- 分散式監控系統之Zabbix proxy分散式
- zabbix的主動模式監控和zabbix-proxy分散式監控模式分散式
- 最佳實踐【二】從 0 開始,用 flask+mongodb 打造分散式伺服器監控平臺FlaskMongoDB分散式伺服器
- Linux 使用 inotify 監控檔案或目錄變化Linux
- 幾種分散式呼叫鏈監控元件的實踐與比較(二)比較分散式元件
- 分散式監控系統之Zabbix主動、被動及web監控分散式Web
- Oracle輕量級實時監控工具-oratopOracle