將數據同步到其它服務器這裏使用Linux同步文件工具rsync來進行文件的同步
1. rsync
rsync是類unix系統下的數據鏡像備份工具——remote sync。一款快速增量備份工具 Remote Sync,遠程同步 支持本地複製,或者與其他SSH、rsync主機同步
2. 用法
rsync src dest
這是最簡單的用法,表示同步src,dest文件。(即,執行之後,dest的文件與src的相同,以src的爲準)
常用選項
-a: 等價於-rlptgoD,歸檔式
-r: 遞歸
-l: 複製軟件鏈接
-p: 保留權限信息
-t: 將src的修改時間,同步到dest
-g: 同步組信息(group)
-o: 同步擁有者信息(own)
-D: 保持字符與塊設備文件
-z: 啓用壓縮傳輸
–delete:如果src沒有此文件,那麼dest也不能有,即在dest刪除src裏沒有的文件。(如果你使用這個選項,就必須搭配-r選項一起)
例如:
## 將本地/bak/mysqlbak/文件同步到 遠程服務器 /bak/mysql/bak 目錄下面 排除 mysqlbak/index目錄 通過ssh端口
rsync -vzacu /bak/mysqlbak/ [email protected]:/bak/mysqlbak --exclude "mysqlbak/index" -e "ssh -p 22"
# 將遠程目錄 /bak/mysqlbak下的文件同步到本地 /bak/mysqlbak/目錄下
rsync -vzrtopg --progress --delete [email protected]:/bak/mysqlbak /bak
client連接SERVER
向SERVER端上傳文件
/usr/bin/rsync -vzrtopg --progress --password-file=/root/rsync.pas /home/backup [email protected]::backup
從SERVER端取文件
/usr/bin/rsync -vzrtopg --progress --delete [email protected]::backup /home/backup --password-file=/etc/rsync.pas
3. rsync安裝
rsync 服務器安裝比較簡單,但是安裝好rsync後,我們並沒有發現配置文件,以及rsync服務器啓動程序,不要着急,那是因爲每個管理員可能對rsync 用途不一樣,所以發行版只是讓安裝好軟件就可以了,配置文件都是讓管理員來根據自己的用途和方向來自己設置的。
1) 檢查rsycn是否安裝
檢查方法:
rpm -qa rsync
出現rsync 包名就是安裝了
如果是以下提示,表示沒有安裝rsync
2) 安裝rsycn
rsync的安裝可以使用yum直接安裝:yum install rsync
3) 檢查rsycn是否安裝成功
檢查方法:
rpm -qa rsync
出現rsync 包名就是安裝成功了
4. 啓用rsync服務器端同步遠程文件
rsycn的服務端爲服務器的文件接收端,rsycn的客戶端爲服務器的文件推動端。
5. rsycn的服務端/文件接收端配置
1) 先創建備份目錄
2) 服務端需要開啓rsyncd服務
(1) 添加配置文件rsyncd.conf
vi /etc/rsyncd.conf
#以下是全局配置
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
lock file = /var/lock/rsyncd
[zentaobak] #模塊名,在源服務器指定這個名字
comment = sync rsync/home #描述信息
path = /home/zentao_bak #備份目錄
use chroot=yes #使用chroot,用root權限
read only = no #設置本地備份目錄爲讀寫權限
uid=root
gid=root
max connections=10 #客戶端最大連接數
auth users = root #指定數據同步用戶
secrets file = /etc/rsyncd.pass #指定數據同步用戶信息文件
hosts allow=10.250.151.233 #允許連接的客戶端
ignore errors = yes #忽略出現I/O錯誤
timeout = 600
(2) 創建認證文件
vi /etc/rsyncd.pass
##代碼
root:glong@123 #格式是用戶名:密碼
#屬主要有權限讀這個文件,否則會報沒權限
chmod 600 /etc/rsyncd.pass
(3) 修改/etc/xinetd.d/rsync文件,disable 改爲 no
service rsync
{
disable = no
socket_type = stream
wait = no
user = root
server = /usr/bin/rsync
server_args = --daemon
log_on_failure += USERID
}
(4) 啓動服務端
rsync --daemon --config=/etc/rsyncd.conf
注:重啓時記得刪除rsyncd.pid:rm -rf /var/run/rsyncd.pid
rsync默認端口是873,防火牆要放開該端口,否則客戶端會無法連接的
#開放873端口
sudo firewall-cmd --zone=public --add-port=873/tcp --permanent
#重啓防火牆服務
sudo systemctl restart firewalld.service
6. rsycn的客戶端/文件發送端配置
客戶端配置簡單 只需要配置密碼既可
vi /etc/rsync_client.pwd
##代碼
glong@123 #只需要填寫rsync服務的密碼
#屬主要有權限讀這個文件,否則會報沒權限
chmod 600 /etc/rsync_client.pwd
7. 客戶端同步測試
## 將本地/root/hjl/文件同步到 10.250.151.231遠程服務器 zentaobak 目錄下面,命令如下:
rsync -auvrtzopgP --progress --password-file=/etc/rsync_client.pwd /root/hjl [email protected]::zentaobak
注:zentaobak就是服務端/etc/rsyncd.conf裏的配置
在服務端檢查數據是否傳送成功
rsync只是一次性同步,如果需要實時同步就需要引入另一個工具inotify了
8. crontab定時備份
1) 備份場景說明
該路徑下每天都會新增3個文件,分別是*code.zip.php、*file.zip.php、*sql.zip.php。我們只需將每天新增3個文件備份到另一個服務器上即可
2) 編寫運行腳本
vi back.sh
腳本代碼:
#!/bin/sh
#備份目錄
BACK_HOME="/opt/zbox/app/zentaopro/tmp/backup"
newfile="aa"
#獲取最新文件夾名
code_newfile=`ls -t $BACK_HOME/*code.zip.php | head -1`
file_newfile=`ls -t $BACK_HOME/*file.zip.php | head -1`
sql_newfile=`ls -t $BACK_HOME/*sql.php | head -1`
#將最新文件夾下的包遠程到服務端取
rsync -auvrtzopgP --progress --password-file=/etc/rsync_client.pwd $code_newfile [email protected]::zentaobak
rsync -auvrtzopgP --progress --password-file=/etc/rsync_client.pwd $file_newfile [email protected]::zentaobak
rsync -auvrtzopgP --progress --password-file=/etc/rsync_client.pwd $sql_newfile [email protected]::zentaobak
腳本說明:
code_newfil:獲取最新的*code.zip.php文件
file_newfile:獲取最新的* file.zip.php文件
sql_newfile:獲取最新的* sql.zip.php文件
3) 爲腳本添加執行權限
chmod 777 back.sh
4) 驗證腳本準確性
執行客戶端的備份sh腳本,成功如下
檢查服務端的數據如下:
5) 設置crontab定時執行
vi /etc/crontab
#在最後一行中加入:
00 3 * * * root /opt/zbox/back.sh
#表示每天3點00分執行備份
注:crontab配置文件格式如下:
分 時 日 月 周 命令
6) 重啓crontab
service crond restart
這樣每天就可以執行備份啦
9. crontab定時清理
由於磁盤大小受限制,爲了避免磁盤空間爆炸,往往需要做定期自動清理,具體清理多少天前的數據,根據實際情況來定
1) 清理場景說明
該路徑下每天都會新增3個文件,分別是*code.zip.php、*file.zip.php、*sql.zip.php。每天大概新增5G的數據量,長年累計下,數據量會比較大。所以需要做定期清理,建議只保留7天的數據即可
2) 編寫運行腳本
vi clear.sh
腳本代碼:
#!/bin/sh
#禪道備份目錄
zentao_BACK_HOME="/mnt/main_back/zentao_bak"
#SVN備份目錄
SVN_BACK_HOME="/mnt/main_back/svn_bak"
#刪除7天前備份的所有文件(包括文件夾)
find /mnt/main_back/zentao_bak/* -mtime +7 -exec rm -rf {} \;
find /mnt/main_back/svn_bak/* -mtime +7 -exec rm -rf {} \;
注:
/*
#查找10天前的所有文件(不包括文件夾)
find /home/Busines/version/new_version_back/* -type f -mtime +10 -exec ls -l {} \;
#刪除10天前的所有文件(不包括文件夾)
find /home/Busines/version/new_version_back/* -type f -mtime +10 -exec rm {} \;
#查找10天前的所有文件(包括文件夾)
find /home/Busines/version/new_version_back/* -mtime +10 -exec ls -l {} \;
#刪除10天前的所有文件(包括文件夾)
find /home/Busines/version/new_version_back/* -mtime +10 -exec rm -rf {} \;
*/
3) 爲腳本添加執行權限
chmod 777 clear.sh
4) 驗證腳本準確性
執行sh腳本,成功如下
由於這裏不會打印信息,所以具體還得到對應的目錄下檢查
5) 設置crontab定時執行
vi /etc/crontab
#在最後一行中加入:
0 1 * * 0 root /mnt/main_back/clear.sh
#表示每週日1點0分執行清除
注:crontab配置文件格式如下:
分 時 日 月 周 命令
6) 重啓crontab
service crond restart
這樣數據每週就可以清理一次了。
10. 常見問題
(1) 客服端連接不上服務端
問題分析:
通過再三確定,配置的沒有問題的,後來才發現rsync默認的端口是873,初步懷疑端口在防火牆沒有開放,被防火牆給限制了。
解決方案:
放開rsync端口,操作如下
#開放873端口
sudo firewall-cmd --zone=public --add-port=873/tcp --permanent
#重啓防火牆服務
sudo systemctl restart firewalld.service
放開端口之後,傳送成功
(2) @ERROR: chroot failed
@ERROR: chroot failed
rsync error: error starting client-server protocol (code 5) at main.c(1503) [sender=3.0.6]
原因:
服務器端的目錄不存在或無權限,創建目錄並修正權限可解決問題。
通過分析,我在服務端的/etc/rsyncd.conf文件裏,路徑使用了`date +%Y%m%d`變量,可/etc/rsyncd.conf裏又不能跟shell一樣很好使用變量,所以導致chroot failed錯誤,就是找不到路徑。
可我要每天進行備份的,所以必須要有日期作爲代表。
解決方案一:
直接指定服務端路徑,結果又報The --password-file option may only be used when accessing an rsync daemon.錯誤
網上說這個報錯是服務器端沒有執行rsync --daemon命令(沒有啓動服務),可服務器是有啓這個服務的,結果這個錯誤一直無法解決,只能用方案二了。
解決方案二:
置換法,即之前是客戶端是作爲服務端,之前是服務端的作爲客戶端。
從SERVER端取文件,由於SERVER端文件路徑是固定的,備份路徑可以做變量了