Rsync同步备份网站
之前一直想着利用软件在多个服务器之间同步数据,一来可以用来备份数据,二来如果之后想要实现负载均衡也要保证多台机器上的数据一致,今天了解了一下rsync,并在两台服务器上实践了一下。
配置ssh密钥登录
rsync可以在本地的两个文件夹之间同步数据,也可以将一台服务器上的数据同步到远程的另外一台服务器,可以经由ssh的方式传输,也可以使用rsync自己的daemon来传输(运行一个服务器端),我采用了第一种方案,而rsync里面是不能直接设置ssh的连接密码的,显然不利于自动化的同步,所以我们首先要为服务器配置好密钥登录。
使用ssh-keygen
生成密钥,分为公钥和私钥。我们需要将公钥中的内容复制到远程服务器(需要上传数据过去的),并把公钥加到要登陆的用户的用户目录下的authorized_keys文件中(如果是root就是/root/.ssh/authorized_keys 普通用户则是 /home/用户名/.ssh/authorized_keys)。配置好之后可以试着用ssh -i privkey root@example.com
登录一下,看看能否直接连接。
使用rsync同步站点文件
首先先考虑站点文件的备份,需要备份的有/var/www/html下的文件,使用下面的命令:
|
|
第一次同步会比较耗时,之后的同步就快了,因为rsync会采取增量同步的方式,只同步发生了变化的文件,更多的命令可以参考此文。
数据库同步
上面的命令已经同步了网站的文件,但是还有一个问题就是动态网站还需要将数据库进行同步。数据库的同步有一点麻烦,如果直接同步可能会在不同的数据库管理程序版本上出现问题。数据库没办法直接按文件同步的方式来进行同步(至少很麻烦)愿意折腾的可以参考这篇文章https://www.electricmonk.nl/log/2016/11/06/very-fast-mysql-slave-setup-with-zero-downtime-using-rsync/,使用mysql的主从复制。
考虑到个人网站数据不会有频繁的写入,并且数据库暂时出现一点差异影响也不是特别大,所以我采用了mysqldump配合rsync以及entr的同步方法,我的想法是远程服务器创建同名数据库和数据库用户,密码设置也一样,同步之前先在本地服务器mysqldump一下,然后rsync同步到远程,远程服务器检测到文件发生变化执行mysql导入的命令即可。
首先要解决的问题就是如何在目录发生变化的时候执行命令
google了一下linux execute command when file changes,找到了很多种解决方案,比如inotify-tool或者entr,这里我使用了entr命令,参考How to Run a Linux Command When a File Set Changes。
|
|
通过bash运行之后,尝试使用rsync同步文件看看反应如何。
|
|
实际测试之后,发现确实可以进行同步了。
参考
https://einverne.github.io/post/2017/07/rsync-introduction.html
https://www.ruanyifeng.com/blog/2020/08/rsync.html
https://docs.microsoft.com/zh-cn/azure/virtual-machines/linux/create-ssh-keys-detailed