服务器数据同步备份是常见的容灾需求,我的实验室一台Web服务器需要定时备份网站相关数据至备份服务器上。今天谈谈同步备份的实现。介绍中我们将待备份的Web服务器视作ClientA,存储备份数据的服务器称作ServerB

SSH免密码登录设置

在介绍同步实现细节之前,我们有必要讨论一下如何实现SSH免密码登录。在周期运行的脚本中(crontab),实现远程登录时手动输入登录口令是不可取的。在我们的同步脚本中,ClientA需要远程无密码的登录至ServerB。首先,在ClientA上生成用户sjd_backup登录用的公、私密钥,并将公钥传输给ServerB

#创建新的密钥
[clientA_backup@localhost ~]$ ssh-keygen
#对于出现的选项,一直回车,使用默认设置创建密钥。
	
#查看密钥是否创建成功
[clientA_backup@localhost ~]$ ls -ld ~/.ssh; ls -l ~/.ssh
drwx------ 2 clientA_backup clientA_backup 4096 130 02:36 /home/sjd_backup/.ssh
-rw------- 1 clientA_backup clientA_backup 1679 130 02:36 id_rsa
-rw-r--r-- 1 clientA_backup clientA_backup 410 130 02:36 id_rsa.pub

id_rsa是私钥,用户sjd_backup自己拥有读写权限;id_rsa.pub是公钥,将被传输给ServerB。注意创建的密钥文件权限需要正确,~/.ssh/目录应该是700。下面需要将id_rsa.pub传给ServerB即可:

[clientA_backup@localhost ~]$ sftp serverB_backup@xxx.xxx.xxx.xxx  <==ServerB的IP地址。
> put ~/.ssh/id_rsa.pub

接下来我们登录到ServerB,更具它的sshd_config中的AuthorizedKeysFile配置选项,找到authorized_keys文件,并将ClientA传递过来的公钥id_rsa.pub内容附加到authorized_keys中。

#查看ssh配置文件,确定authorized_keys位置
[serverB_backup@localhost ~]$ vim /etc/ssh/sshd_config
	
#如果是新用户,不存在authorized_keys文件,需要手动创建.ssh目录存放authorized_keys文件
[serverB_backup@localhost ~]$ mkdir .ssh; chmod 700 .ssh
	
#确认ClientA发来的公钥id_rsa.pub是否已经收到
[serverB_backup@localhost ~]$ ls -l *pub
-rw-r--r-- 1 serverB_backup serverB_backup 410 130 02:36 id_rsa.pub <==确实有存在
	
#将公钥id_rsa.pub内容附加到authorized_keys中。
[serverB_backup@localhost ~]$ cat id_rsa.pub >> .ssh/authorized_keys
[serverB_backup@localhost ~]$ chmod 644 .ssh/authorized_keys

完成上面ServerB的设置后,确认权限是否正确。此时,回到ClientA切换到clientA_backup身份即可实现无需密码SSH登录到ServerB

[clientA_backup@localhost ~]$ ssh serverB_backup@xxx.xxx.xxx.xxx  <==ServerB的IP地址。
Last login: .............          <==确认可以无密码登录

同步备份

我们将使用rsync配合crontab进行两台机器间的数据备份。rsync的基本用法如下,具体的选项和参数可以参考man中的说明:

[clientA_backup@localhost ~]$ rsync [-avrlptgoD] [source] [destination]

我们将备份ClientA中文件夹/var/www/html下所有的文件,以及mysql数据库文件,备份脚本参考下面

[clientA_backup@localhost ~]$ vim backup_www.sh

#!/bin/bash
remotedir=/var/www
localdir=/var/www/html
remoteip="xxx.xxx.xxx.xx"      <==根据自己的情况设置
	
mysqldump -uuser -ppassword sjd > /var/www/html/sjd.sql  <==导出数据库文件
#同步备份命令
rsync -avl --delete ${localdir} serverB_backup@${remoteip}:${remotedir}

运行脚本,查看是否可以成功将ClientA中文件夹/var/www/html下所有的文件,备份至ServerB下的/var/www/html中。需要主要的是,rsync中涉及的用户应该是对应同步目录的拥有者,可以避免备份时时间修改存在的权限问题。

验证脚本正常后,运行crontab -e将脚本设置为每天凌晨循环执行的作业。

0 1 * * * /home/clientA_backup/backup_www.sh

OK!大功告成,一切都可以正常的运行,数据可以正常的容灾备份啦!