rsync是一款開源的備份工具,能夠在不一樣服務器(主機)之間進行同步備份,mysql
可實現徹底備份與增量備份,所以很是適合用於架構集中式備份或異地備份等應用。nginx
rsync官方地址:http://rsync.samba.org/redis
rsync端口:873sql
rsync運行模式:C/S shell
拓展: C/S 客戶端/服務端 B/S 瀏覽器/服務端
Rsync常見的
兩種備份方式徹底備份
增量備份瀏覽器
假設客戶端的上有file1 file2 file3
文件安全
服務端上有file1
文件,現要將客戶端上的數據備份至服務端bash
徹底備份,將客戶端全部的數據內容file1 file2 file3所有備份至服務端(效率低下,佔用空間)
增量備份,將客戶端的file2 file3增量備份至服務端(提升備份效率,節省空間,適合異地備份)
數據同步的兩種方式服務器
推:全部主機推送本地數據至Rsync備份服務器,會致使數據同步緩慢(適合少許數據備份) 架構
拉:rsync備份服務端拉取全部主機上的數據,會致使備份服務器開銷大
若是服務器多的話 全部服務器都用一臺服務器備份 會致使同步的時候 備份服務器使用過多 因此使用多臺備份服務器
Rsync
命令對應選項-a #歸檔模式傳輸, 等於-tropgDl -v #詳細模式輸出, 打印速率, 文件數量等 -z #傳輸時進行壓縮以提升效率 -r #遞歸傳輸目錄及子目錄,即目錄下得全部目錄都一樣傳輸。 -t #保持文件時間信息 -o #保持文件屬主信息 -p #保持文件權限 -g #保持文件屬組信息 -l #保留軟鏈接 -P #顯示同步的過程及傳輸時的進度等信息 -D #保持設備文件信息 -L #保留軟鏈接指向的目標文件 -e #使用的信道協議,指定替代rsh的shell程序 --exclude=PATTERN #指定排除不須要傳輸的文件模式 --exclude-from=file #文件名所在的目錄文件 --bwlimit=100 #限速傳輸 --partial #斷點續傳 --delete #讓目標目錄和源目錄數據保持一致
Rsync大體使用三種主要的數據傳輸方式
本地方式
遠程方式
守護進程
本地方式至關於cp(複製) 本地略有些雞肋 功能和cp是同樣的
單個主機本地之間的數據傳輸(此時相似於cp
命令)
[root@backup ~]# rsync /etc/passwd /tmp/ [root@backup ~]# ls /tmp/passwd /tmp/passwd
經過ssh
通道傳輸數據,相似scp
命令
Access via remote shell: 遠程傳輸
遠程方式存在的缺陷:
1.須要使用系統用戶(不安全)
2.使用普通用戶(權限存在問題)
3.須要走ssh協議
Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST] 下載(拉) 下載pull [root@nfs ~]# pwd 查看當前路徑 在nfs服務器下 /root [root@nfs ~]# echo "This Nfs" > file [root@backup ~]# rsync -avz root@172.16.1.31:/root/file /opt/ 在backup服務器下 以root用戶身份將172.16.1.31 root目錄下file文件 傳輸到opt目錄下 [root@backup ~]# cat /opt/file 查看內容 This Nfs Push: rsync [OPTION...] SRC... [USER@]HOST:DEST 上傳(推) 上傳push(將backup的file2文件上傳至NFS服務器的/mnt目錄) [root@backup ~]# pwd 查看當前路徑 在backup服務器下 /root [root@backup ~]# echo "This Rsync" > file2 [root@backup ~]# rsync -avz /root/file2 root@172.16.1.31:/mnt 將backup服務器裏的root目錄下的file2文件 發送到172.16.1.31服務器的mnt目錄下 [root@nfs ~]# cat /mnt/file2 This Rsync 推送目錄(推送/root/目錄下面的全部文件和目錄,不會推送/root/目錄自己) [root@backup ~]# rsync -avz /root/ root@172.16.1.31:/tmp 推送目錄,推送目錄自己以及目錄下面的全部文件 [root@backup ~]# rsync -avz /root root@172.16.1.31:/tmp
守護進程傳輸方式:rsync
自身很是重要的功能(不使用系統用戶,更加安全)
角色 |
外網IP(NAT) |
內網IP(LAN) |
主機名 |
Rsync的服務端 |
eth0:10.0.0.41 |
eth1:172.16.1.41 |
backup |
rsync的客戶端 |
eth0:10.0.0.31 |
eth1:172.16.1.31 |
nfs |
[root@backup ~]# yum -y install rsync
查詢配置文件存放的路徑
[root@backup ~]# rpm -qc rsync /etc/rsyncd.conf 配置/etc/rsyncd.conf (直接複製下面內容,將原有內容清空) [root@backup ~]# cat /etc/rsyncd.conf uid = rsync gid = rsync port = 873 fake super = yes use chroot = no max connections = 200 timeout = 600 ignore errors read only = false list = false auth users = rsync_backup secrets file = /etc/rsync.password log file = /var/log/rsyncd.log ##################################### [backup] comment = welcome to oldboyedu backup! path = /backup
建立rsync帳戶,不容許登陸不建立家目錄 [root@backup ~]# useradd -M -s /sbin/nologin rsync 建立備份目錄(儘量磁盤空間足夠大),受權rsync用戶爲屬主 [root@backup ~]# mkdir /backup [root@backup ~]# chown -R rsync.rsync /backup/
建立虛擬用戶密碼文件(用於客戶端鏈接時使用的用戶)
建立虛擬用戶和密碼,並賦予600權限 [root@backup ~]# echo "rsync_backup:1" >/etc/rsync.password [root@backup ~]# chmod 600 /etc/rsync.password
啓動rsync服務,並加入開機自啓 [root@backup ~]# systemctl start rsyncd [root@backup ~]# systemctl enable rsyncd 啓動後檢查 [root@bogon ~]# netstat -lntp|grep rsync
客戶端:
Access via rsync daemon: 守護進程方式傳輸
Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST] 下載
Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
1.將客戶端的/etc/passwd 推送至 rsync服務端[backup] rsync [OPTION...] SRC... [USER@]HOST::DEST [root@nfs ~]# rsync -avz /etc/passwd rsync_backup@172.16.1.41::backup 2.將rsync服務端模塊[/backup]下載至本地 Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST] [root@nfs ~]# rsync -avz rsync_backup@172.16.1.41::backup /opt
適合終端執行指定用戶密碼文件
[root@nfs ~]# echo "1" >/etc/rsync.password 密碼爲1 將密碼寫入rsync.password文件 [root@nfs ~]# chmod 600 /etc/rsync.password rsync -avz rsync_backup@172.16.1.41::backup /opt --password-file=/etc/rsync.password
export RSYNC_PASSWORD=1 定義變量
[root@nfs ~]# export RSYNC_PASSWORD=1 [root@nfs ~]# rsync -avz rsync_backup@172.16.1.41::backup /opt
客戶端與服務端保持一致(--delete)
--delete強制一致
[root@nfs ~]# rsync -avz /root rsync_backup@172.16.1.41::backup --delete
--bwlimit=1 限速爲1M 工做中經常使用 不用限速 分分鐘帶寬佔滿
rsync -avzP --bwlimit=1 /opt/test.dosk rsync_backup@172.16.1.41::backup
統一全部的目錄站點是/backup
系統重要的配置文件
建議備份的數據內容以下
1.配置文件 開機自啓動配置文件 設備掛載配置文件 本地內網配置文件 如/etc/rc.local /etc/fstab /etc/hosts 2.重要目錄 cron定時任務 firewalld防火牆 腳本目錄 如/var/spool/cron/ /etc/firewalld /server/scripts 3.系統日誌文件 如/var/log/ //系統安全日誌、sudo日誌、內核日誌、rsyslog日誌 4.應用程序日誌 nginx、PHP、mysql、redis..... 工做中根據實際狀況再想下還有什麼須要備份的
備份在/backup目錄下 /backup/日期爲名的目錄/
例如: /backup/nfs_172.16.1.31_2018_09_05 /backup/nfs_172.16.1.31_2018_09_06 /backup/nfs_172.16.1.31_2018_09_07 編寫腳本 寫入定時任務 [root@nfs ~]# echo $(hostname)_$(ifconfig eth1|awk 'NR==2{print $2}')_$(date +%F) nfs_172.16.1.31_2018-09-05 [root@nfs ~]# mkdir /server/scripts -p
[root@nfs01 backup]# cat /server/scripts/backup_rsync.sh #!/usr/bin/bash #1.定義變量 Path=/backup Host=$(hostname) Addr=$(ifconfig eth1|awk 'NR==2{print $2}') Date=$(date +%F) Dest=${Path}/${Host}_${Addr}_${Date} #2.檢查目錄是否存在 [ -d $Dest ] || mkdir -p $Dest #3.拷貝須要備份的文件至$Dest # system backup cp -rp /etc/passwd /etc/fstab /etc/rc.d/rc.local /var/spool/cron $Dest/ # user backup cp -rp /server/ $Dest/ # config backup cp -rp /etc/rsyncd.conf $Dest/ #4.推送至備份服務端 Rsync_User=rsync_backup Rsync_Addr=172.16.1.41 Rsync_Module=backup export RSYNC_PASSWORD=123456 rsync -avz $Path/ ${Rsync_User}@${Rsync_Addr}::${Rsync_Module} #5.保留本地最近7天的文件 find $Path/ -type d -mtime +7 -exec rm -rf {} \;
問題不限於CentOS 7
CentOS 7 以上 防火牆爲 firewalld
CentOS 6 及如下 防火牆爲 iptables
No route to host
[root@nfs01 tmp]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup rsync: failed to connect to 172.16.1.41: No route to host (113) rsync error: error in socket IO (code 10) at clientserver.c(124) [sender=3.0.6]
關閉rsync服務端的防火牆服務(iptables)
[root@backup mnt]# /etc/init.d/iptables stop iptables: Setting chains to policy ACCEPT: filter [ OK ] iptables: Flushing firewall rules: [ OK ] iptables: Unloading modules: [ OK ] [root@backup mnt]# /etc/init.d/iptables status iptables: Firewall is not running.
[root@nfs01 tmp]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::/backup ERROR: The remote path must start with a module name not a / rsync error: error starting client-server protocol (code 5) at main.c(1503) [sender=3.0.6]
rsync命令語法理解錯誤,::/backup是錯誤的語法,應該爲::backup(rsync模塊)
[root@nfs01 tmp]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup Password: @ERROR: auth failed on module backup rsync error: error starting client-server protocol (code 5) at main.c(1503) [sender=3.0.6]
1. 密碼真的輸入錯誤,用戶名真的錯誤
2. secrets file = /etc/rsync.password指定的密碼文件和實際密碼文件名稱不一致
3. /etc/rsync.password文件權限不是600
4. rsync_backup:oldboy123密碼配置文件後面注意不要有空格
echo "rsync_backup:oldboy123" >>/etc/rsync.password
5. rsync客戶端密碼文件中只輸入密碼信息便可,不要輸入虛擬認證用戶名稱
[root@nfs01 tmp]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup @ERROR: Unknown module 'backup' rsync error: error starting client-server protocol (code 5) at main.c(1503) [sender=3.0.6]
/etc/rsyncd.conf配置文件模塊名稱書寫錯誤
[root@nfs01 tmp]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup Password: sending incremental file list hosts rsync: mkstemp ".hosts.5z3AOA" (in backup) failed: Permission denied (13) sent 196 bytes received 27 bytes 63.71 bytes/sec total size is 349 speedup is 1.57 rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1039) [sender=3.0.6]
1. 共享目錄的屬主和屬組不正確,不是rsync
2. 共享目錄的權限不正確,不是755
[root@nfs01 tmp]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup Password: @ERROR: chdir failed rsync error: error starting client-server protocol (code 5) at main.c(1503) [sender=3.0.6]
1. 備份存儲目錄沒有創建
2. 創建的備份存儲目錄和配置文件定義不一致
[root@nfs01 tmp]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup Password: @ERROR: invalid uid rsync rsync error: error starting client-server protocol (code 5) at main.c(1503) [sender=3.0.6]
rsync服務對應rsync虛擬用戶不存在了,從新建立便可。
password file must not be other-accessible [root@nfs01 tmp]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password password file must not be other-accessible continuing without password file Password: sending incremental file list sent 26 bytes received 8 bytes 5.23 bytes/sec total size is 349 speedup is 10.26
rsync客戶端的祕鑰文件也必須是600權限
2017/03/08 20:14:43 [3422] params.c:Parameter() - Ignoring badly formed line in configuration file: ignore errors 2017/03/08 20:14:43 [3422] name lookup failed for 172.16.1.31: Name or service not known 2017/03/08 20:14:43 [3422] connect from UNKNOWN (172.16.1.31) 2017/03/08 20:14:43 [3422] rsync to backup/ from rsync_backup@unknown (172.16.1.31) 2017/03/08 20:14:43 [3422] receiving file list 2017/03/08 20:14:43 [3422] sent 76 bytes received 83 bytes total size 349
2017/03/08 20:16:45 [3443] params.c:Parameter() - Ignoring badly formed line in configuration file: ignore errors 2017/03/08 20:16:45 [3443] connect from nfs01 (172.16.1.31) 2017/03/08 20:16:45 [3443] rsync to backup/ from rsync_backup@nfs02 (172.16.1.31) 2017/03/08 20:16:45 [3443] receiving file list 2017/03/08 20:16:45 [3443] sent 76 bytes received 83 bytes total size 349
異常問題解決
查看日誌進行分析
Connection refused (111) [root@CentOS ~]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup rsync: failed to connect to 172.16.1.41: Connection refused (111) rsync error: error in socket IO (code 10) at clientserver.c(124) [sender=3.0.6]
[root@CentOS ~]# rsync --daemon [root@CentOS ~]# ss -lntup |grep rsync tcp LISTEN 0 5 :::873 :::* users:(("rsync",1434,5)) tcp LISTEN 0 5 *:873 *:* users:(("rsync",1434,4)) [root@CentOS ~]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup Password: sending incremental file list hosts sent 196 bytes received 27 bytes 49.56 bytes/sec total size is 349 speedup is 1.57