当前位置: 网站首页>>技术交流>>正文
rsync同步备份服务器
2017-10-11 09:20  

 

一般来说,一台linux服务器安装之后,直接用rysnc命令就就可以备份,但这仅仅是client,我们现在要做的是建立一台专门 

的备份服务器来接收客户端的备份数据,所以我们需要配置rsync服务器,让它常驻系统,通常有2种方法,自身的daemon功能 

和通过xinetd守护,但是无论哪种方法,都需要一个配置文件/etc/rsyncd.conf,需要我们自己创建。 

客户端约定: 

客户端1:test1.host1.com(192.168.0.1) 

客户端2:test2.host2.com(192.168.0.2) 

服务器端约定: 

服务器ip:192.168.0.100 

rsync配置文件:/etc/rsyncd.conf 

备份文件存储主目录:/home/backup 

客户端1数据存储目录:/home/backup/test1.host1.com 

客户端1数据存储目录:/home/backup/test2.host2.com 

接下来的操作,都是在备份服务器上进行的。 

第一步,我们还是先检查一下系统是否安装了rsync。 

[root@backup ~]# rpm -q rsync 

rsync-2.6.8-3.1 

看来我的系统已经安装了,如果你没安装,请执行下面的命令。 

[root@backup ~]# 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.host1.com] 

comment = backup for test1.host1.com 

path = /home/backup/test1.host1.com 

read only = no 

hosts allow = 192.168.0.1 

[test2.host2.com] 

comment = backup for test2.host2.com 

path = /home/backup/test2.host2.com 

read only = no 

hosts allow = 192.168.0.2 

保存退出,如果你需要更多配置参数,请参照man rsyncd.conf 

第三步,准备备份数据的存储目录 

[root@backup ~]# mkdir -p /home/backup/{test1.host1.com,test2.host2.com} 

注:如果你需要备份2层以上的主目录,比如/var/lib/mysql/,最好事先在备份服务器上把要备份的多层主目录创建好。 

[root@backup ~]# mkdir -p /home/backup/test1.host1.com/var/lib/mysql 

第四步,各种东西准备好了,现在我们该启动rsync了,2种方法,你任选一种。 

1.使用rsync的–daemon选项启动,rsync服务默认使用873号端口。 

[root@backup ~]# rsync --daemon 

[root@backup ~]# 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文件,执行如下命令即可。 

[root@backup ~]# echo '/usr/bin/rsync --daemon' >> /etc/rc.local 

如果你需要终止它,执行 

[root@backup ~]# pkill rsync 

[root@backup ~]# lsof -i:873 

[root@backup ~]# 

可以看到已经关闭了。但是很多用户可能希望,像别的程序一样通过启动脚本/etc/init.d/xxxx来启动或者终止服务会更方 

便,由于篇幅太长,我在后面的博文中再介绍。 

2.xinetd守护 

修改/etc/xinetd.d/rsync文件,把 

disable = yes 

改成 

disable = no 

然后重启xinetd即可, 

[root@backup ~]# /etc/init.d/xinetd restart 

如果你的xinetd开机并没自动启动的话,需要执行 

[root@backup ~]# chkconfig xinetd on 

第五步,到此为止,rsync服务器端已经完成了,接下来,我们以客户端test1.host1.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.host1.com 

#backup 

backup_path="/etc/ /home/" 

for path in $backup_path; 

do 

date=`date "+%D %H:%M:%S"` 

$echo "--- Start Backup $path $date ----" 

$rsync -av --delete $path $remote_host::$remote_path$path 

date=`date "+%D %H:%M:%S"` 

$echo "--- End Backup $path $date ----" 

done 

exit 0 

2.好了,我们来执行一下看看备份情况。 

[root@test1 ~]# /root/bin/backup.sh 

--- Start Backup /etc/ 02/22/11 09: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/ 02/22/11 09:50:20 ---- 

已经备份完毕了,你可以去备份服务器上去看看备份情况了。 

到此为止,一个简单的rsync同步备份服务器的配置和备份测试都已经OK了,可是要是你的服务器是通过公网备份的话,就是 

很危险的,接下来我再说明一下如何用ssh来加密我们备份数据的传输。 

第六步,通过ssh加密传输。 

约定:备份服务器在初期状态是通过密码认证登录的并且root可以登录。 

1.接下来的操作是在客户端上进行的,我们还是以test1.host1.com(192.168.0.1)为例。 

[root@test1 ~]# 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 root@test1.host1.com 

然后,把公钥通过scp复制到备份服务器(192.168.0.100)上去。 

[root@test1 ~]# 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. 

root@192.168.0.100'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行 

$rsync -av --delete $path $remote_host::$remote_path$path 

改成 

$rsync -av -e "$ssh -i $key" --delete $path $remote_host::$remote_path$path 

2.接下来的操作在备份服务器端进行的,把刚刚复制到备份服务器的公钥追加到/root/.ssh/authorized_keys末尾。 

[root@backup ~]# cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys 

[root@backup ~]# chmod 600 /root/.ssh/authorized_keys 

3.最后,通过1和2小步将所有客户端的公钥都上传到备份服务器上之后,我们修改/etc/ssh/sshd_config 

文件,禁止使用密码登陆。这一步也是在备份服务器上进行的。 

PasswordAuthentication yes 

改成 

PasswordAuthentication no 

重启sshd 

[root@backup ~]#/etc/init.d/sshd restart 

好了,现在你可以在你客户端执行备份脚本来备份了,如果你再加上crontab计划任务来执行,那么就更方便了。 

比如我们追加每天早上4点30分备份,并把备份过程的信息和错误信息记录到/var/log/backup.log,那么修改/etc/crontab文 

件,追加如下一行。 

30 04 * * * root /root/bin/backup.sh >> /var/log/backup.log 2>&1 

当然如果时间长了,日志文件/var/log/backup.log会很大,可以通过logrotate来管理日志,我将在以后的博文中介绍如何用logrotate来管理日志文件。 

注1:可能有人会发现,一遍一遍的在各个客户端上生产公钥和密钥,然后把公钥复制到备份服务器上去, 

而为什么不在备份服务器上生产公钥和密钥,然后把私钥复制到客户端去呢?这样当然也是可以的,但是所有的客户端都是用 

同一套密钥和公钥认证,安全性降低了。同样我还推荐你定期更换密钥和公钥对。 

注2:关于备份脚本你可以根据你自己的需求去完善,而且rsync的功能远不止这点。比如有的人想把/etc每天都备份,保存一个 

星期的,这样我们可以先在本地创建一个专门的备份目录/backup,以星期为前缀打包/etc,然后再把备份目录上传到备份服务器上。 

#backup for /etc 

OLDLANG=$LANG 

export LANG="us_EN.UTF-8" 

weekday=`date +"%A"` 

$tar -czvf /backup/${weekday}.etc.tar.gz /etc 

export LANG=$OLDLANG 

注3:由于备份服务器打开了root登录功能,建议你在防火墙里设置只能是客服端和管理端的ip可以连接22号端口。 

注4:如果你总觉的打开了root登录还是危险,那么我们再在备份服务器端做如下限制,让rsync用root登录时只能执行我们允 

许的命令。 

修改/etc/ssh/sshd_config 

把 

PermitRootLogin yes 

改成 

PermitRootLogin forced-commands-only 

然后重启sshd 

创建一个检查命令是否允许的脚本/root/.ssh/checkcmd.sh,内容如下: 

#!/bin/sh 

if [[ "$SSH_ORIGINAL_COMMAND" =~ "rsync\ --server*" ]] 

then 

$SSH_ORIGINAL_COMMAND 

else 

echo "Reject" 

fi 

给脚本添加执行权限: 

[root@backup ~]# chmod u+x /root/.ssh/checkcmd.sh 

然后修改/root/.ssh/authorized_keys文件,在对应客户端的公钥前面追加选项, 

还是以test1.host1.com(192.168.0.1)的公钥为例。 

from="192.168.0.1",command="/root/.ssh/checkcmd.sh" ssh-rsa密钥其他内容省略== root@test1.host1.com 

上一条:Excel表格中新增数据自动添加边框的设置方法
下一条:WiFi热点难开?用这个就行了
关闭窗口