RSYNC數據同步備份

   對於linux運維工程師來說,數據備份的重要性怎麼強調都不爲過。因此,一款好用的備份工具是必不可少的,選擇rsync——速度快、安全、高效,接下來就介紹如何配置通rsync同步備份服務器。

   一般來說,一臺linux服務器安裝之後,直接用rysnc命令就就可以備份,但這僅僅是client,我們現在要做的是建立一臺專門的備份服務器來接收客戶端的備份數據,所以我們需要配置rsync服務器,讓它常駐系統,通常有2種方法,自身的daemon功能和通過xinetd守護,但是無論哪種方法,都需要一個配置文件/etc/rsyncd.conf,需要我們自己創建。

客戶端配置:

客戶端1:test1.benet.com(192.168.0.1)
客戶端2:test2.benet.com(192.168.0.2)

服務器配置:

服務器ip:192.168.0.100
rsync配置文件:/etc/rsyncd.conf
備份文件存儲主目錄:/home/backup
客戶端1數據存儲目錄:/home/backup/test1.benet.com
客戶端2數據存儲目錄:/home/backup/test2.benet.com

接下來的操作,都是在備份服務器上進行的。

第一步,我們還是先檢查一下系統是否安裝了rsync。

# rpm -q rsync

rsync-3.0.6-9.el6_4.1.x86_64

看來我的系統已經安裝了,如果你沒安裝,請執行下面的命# yum -y install rsync,創建/etc/rsyncd.conf文件,內容如下。

主要全局參數

uid = root
gid = root
use chroot = yes #爲了安全考慮,讓rsync運行於chroot環境
log file = /var/log/rsyncd.log #rsync的日誌文件
pid file = /var/run/rsyncd.pid #rsync的pid文件
hosts allow = 192.168.0.0/24 #允許訪問的網絡(我還推薦你在系統防火牆裏也要設置)
hosts deny = * #除了允許的之外,默認禁止訪問

爲每個客戶端服務器專門配置

[test1.benet.com]
comment = backup for test1.benet.com
path = /home/backup/test1.benet.com
read only = no
hosts allow = 192.168.0.1

[test2.benet.com]
comment = backup for test2.benet.com
path = /home/backup/test2.benet.com
read only = no
hosts allow = 192.168.0.2

保存退出,如果你需要更多配置參數,請參照man rsyncd.conf

第三步,準備備份數據的存儲目錄

#mkdir -p /home/backup/{test1.benet.com,test2.benet.com}

注:如果你需要備份2層以上的主目錄,比如/var/lib/mysql/,最好事先在備份服務器上把要備份的多層主目錄創建好。

#mkdir -p /home/backup/test1.benet.com/var/lib/mysql

第四步,各種東西準備好了,現在我們該啓動rsync了,2種方法,你任選一種。

1.使用rsync的–daemon選項啓動,rsync服務默認使用873號端口。

#rsync --daemon
#lsof -i:873

COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
rsync 3464 root 3u IPv6 11515 TCP *:rsync (LISTEN)
rsync 3464 root 4u IPv4 11516 TCP *:rsync (LISTEN)

可以看到rsync已經啓動成功了。如果你要把他添加到開機啓動,可以通過/etc/rc.local文件,執行如下命令即可。

#echo '/usr/bin/rsync --daemon' >> /etc/rc.local

如果你需要終止它,執行

# pkill rsync
# lsof -i:873

可以看到已經關閉了。但是很多用戶可能希望,像別的程序一樣通過啓動腳本/etc/init.d/xxxx來啓動或者終止服務會更方
便,由於篇幅太長,我在後面的博文中再介紹。

2.xinetd守護
修改/etc/xinetd.d/rsync文件,把
disable = yes
改成
disable = no
然後重啓xinetd即可,

# /etc/init.d/xinetd restart

如果你的xinetd開機並沒自動啓動的話,需要執行

# chkconfig xinetd on

第五步,到此爲止,rsync服務器端已經完成了,接下來,我們以客戶端test1.benet.com(192.168.0.1)爲例,試試如何同
步文件。注意,該步操作時在客戶端服務器上進行的。

配置信息:
備份腳本路徑:/root/bin/backup.sh
需要備份的目錄:/etc/ /home/

1.創建一個簡單的備份腳本/root/bin/backup.sh,內容如下。

#!/bin/sh
#command

rsync=/usr/bin/rsync
echo=/bin/echo

#backup server info

remote_host=192.168.0.100
remote_path=test1.benet.com

#backup

backup_path=”/etc/ /home/”
for path in $backup_path;
do
date=date "+%D %H:%M:%S"
echo"StartBackup path date rsync -av --delete path remote_host::remotepath path
date=date "+%D %H:%M:%S"
echo"EndBackup path $date —-”
done
exit 0

2.好了,我們來執行一下看看備份情況。

# /root/bin/backup.sh

— Start Backup /etc/ 05/16/16 07:48:36 —-
building file list … done
created directory /etc
傳送的每個文件的詳細信息省略……
sent 2960717 bytes received 1828 bytes 658343.33 bytes/sec
total size is 2954407 speedup is 1.00
— End Backup /home/ 05/16/16 07:50:26 —-
已經備份完畢了,你可以去備份服務器上去看看備份情況了。
到此爲止,一個簡單的rsync同步備份服務器的配置和備份測試都已經OK了,可是要是你的服務器是通過公網備份的話,確很危險的,接下來我再說明一下如何用ssh來加密我們備份數據的傳輸。

第六步,通過ssh加密傳輸。
配置:備份服務器在初始狀態是通過密碼認證登錄的並且root可以登錄。

1.接下來的操作是在客戶端上進行的,我們還是以test1.benet.com(192.168.0.1)爲例。

# ssh-keygen -t rsa

Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):直接回車
Created directory ‘/root/.ssh’.
Enter passphrase (empty for no passphrase):一定直接回車
Enter same passphrase again:一定直接回車
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
94:b7:51:5e:6b:6b:01:81:b2:e1:a6:6b:e8:56:a2:8c [email protected]

然後,把公鑰通過scp複製到備份服務器(192.168.0.100)上去。

# scp ~/.ssh/id_rsa.pub 192.168.0.100:/root/.ssh/

The authenticity of host ‘192.168.0.100 (192.168.0.100)’ can’t be established.
RSA key fingerprint is 3c:fe:7e:0a:35:79:a2:cf:13:55:ba:87:8b:62:e5:cb.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ‘192.168.0.100’ (RSA) to the list of known hosts.
[email protected]’s password:
id_rsa.pub 100% 404 0.4KB/s 00:00

修改前面我們創建的backup.sh文件,在第5行後追加2行:
ssh=/usr/bin/ssh
key=/root/.ssh/id_rsa
把第16行
rsyncavdelete path remotehost:: remote_pathpath rsync -av -e "sshi key" --delete path remote_host::remotepath path

2.接下來的操作在備份服務器端進行的,把剛剛複製到備份服務器的公鑰追加到/root/.ssh/authorized_keys末尾。

# cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
# chmod 600 /root/.ssh/authorized_keys

3.最後,通過1和2小步將所有客戶端的公鑰都上傳到備份服務器上之後,我們修改/etc/ssh/sshd_config
文件,禁止使用密碼登陸。這一步也是在備份服務器上進行的。
PasswordAuthentication yes
改成
PasswordAuthentication no
重啓sshd

#/etc/init.d/sshd restart

好了,現在你可以在你客戶端執行備份腳本來備份了,如果你再加上crontab計劃任務來執行,那麼就更方便了。比如我們追加每天早上3點30分備份,並把備份過程的信息和錯誤信息記錄到/var/log/backup.log,那麼修改/etc/crontab文件,追加如下一行。
30 03 * * * root /root/bin/backup.sh >> /var/log/backup.log 2>&1
當然如果時間長了,日誌文件/var/log/backup.log會很大,可以通過logrotate來管理日誌,我將在以後的博文中介紹如何用logrotate來管理日誌文件。

備註A:可能有人會發現,一遍一遍的在各個客戶端上生產公鑰和密鑰,然後把公鑰複製到備份服務器上去,而爲什麼不在備份服務器上生產公鑰和密鑰,然後把私鑰複製到客戶端去呢?這樣當然也是可以的,但是所有的客戶端都是用同一套密鑰和公鑰認證,安全性降低了。同樣我還推薦你定期更換密鑰和公鑰對。
備註B:關於備份腳本你可以根據你自己的需求去完善,而且rsync的功能遠不止這點。比如有的人想把/etc每天都備份,保存一個星期的,這樣我們可以先在本地創建一個專門的備份目錄/backup,以星期爲前綴打包/etc,然後再把備份目錄上傳到備份服務器上。

#backup for /etc

OLDLANG=$LANG
export LANG=”us_EN.UTF-8”
weekday=date +"%A"
tarczvf/backup/ {weekday}.etc.tar.gz /etc
export LANG=$OLDLANG

備註C:由於備份服務器打開了root登錄功能,建議你在防火牆裏設置只能是客服端和管理端的ip可以連接22號端口。
備註D:如果你總覺的打開了root登錄還是危險,那麼我們再在備份服務器端做如下限制,讓rsync用root登錄時只能執行我們允許的命令。

修改/etc/ssh/sshd_config

PermitRootLogin yes
改成
PermitRootLogin forced-commands-only
然後重啓sshd

創建一個檢查命令是否允許的腳本/root/.ssh/checkcmd.sh,內容如下:

#!/bin/sh
if [[ “SSHORIGINALCOMMAND= rsync server]]then SSH_ORIGINAL_COMMAND
else
echo “Reject”
fi

給腳本添加執行權限:

# chmod u+x /root/.ssh/checkcmd.sh

然後修改/root/.ssh/authorized_keys文件,在對應客戶端的公鑰前面追加選項,還是以test1.benet.com(192.168.0.1)的公鑰爲例。
from=”192.168.0.1”,command=”/root/.ssh/checkcmd.sh” ssh-rsa 密鑰其他內容省略== [email protected]
[完畢!]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章