服务器间,如何利用 rsync 同步文件资料?
发布于 作者:苏南大叔 来源:程序如此灵动~在日常运维中,在服务器间保持文件同步,是非常常见的事情。这个时候,资深运维师一般会利用rsync
来完成,文件夹间的同步问题。这个命令,可以在同一个服务器的不同目录间同步,也可以在不同服务器之间同步目录。在做服务器级群的时候,这个资料的同步问题,解决方案的重要一环,就是rsync
命令。
本文的测试环境是两台centos7.5
,一个是master
,一个是slave
。苏南大叔的目的,是在两个服务器间同步文件。源头是:master
上的/wwwroot/newsn.net/
,目标是:slave
上的/wwwroot/newsn.net/
。本文的内容,只是方案中的一部分。文件的同步,是有inotify
+rsync
所组成的。本文描述的是:rsync
命令在服务器间同步的适合,rsync
基本使用方法。
查看rsync
的版本
正常情况下来说,rsync
命令是centos
自带的,所以,对于本文的测试环境centos7.5
来说,苏南大叔并不需要额外安装rsync
命令。其它的系统下,也许需要您额外安装rsync
。不过,不在本文的讨论范围内。下面的命令可以查看系统中rsync
的版本。
rsync --version
本文中的rsync
版本为:rsync version 3.1.2 protocol version 31
。
slave
服务器设置
在这个方案中,苏南大叔首先需要设置slave
服务器的rsync
。在slave
上设置好rsync
的远程用户名密码等信息后,然后master
机上就可以凭借这些信息,随时主动来存储同步数据了。
这期间,需要个rsyncd
的概念,也就是rsync
后台服务的概念。然后需要个rsyncd.conf
配置文件,和一个ryncd.password
密码文件。注意,这两个文件名都是可以自定义的。大家高兴叫什么都可以,高兴放什么路径都是可以的。
在master
上面设置rsyncd
服务,然后slave
机定时执行rsync
命令,也是可以做到文件夹同步的。这个操作的关键就是:rsync
的参数的先后顺序而已。但是,为什么把rsyncd
放置在slave
上,而不是master
上面呢?就是因为:master
有着文件变化的优先感知权限。master
主动起来,问题会更容易得到解决。
在slave
的rsyncd
服务中,苏南大叔定义的这两个文件名称及路径,分别是:
/etc/rsyncd.conf
,系统自带这个文件,但是实质上可以更改路径。/etc/rsyncd.password
/etc/rsyncd.password
这个密码文件就是个用户名密码的序列文件,比较简单,可以定义多个用户名。当然,基本上来说,一个用户名就足够用了。
<用户名1>:<密码明文1>
<用户名2>:<密码明文2>
注意这里的用户名,就和mysql
用户名是类似的概念。是对应软件专用的,和系统用户名是没有半毛钱关系的。千万别手欠添加一个同名同密码的系统用户。(网上有教程说,要添加到系统用户里面的,当然,这个是不对的。)
下面是个配置范例:
user:1111111111111111
这个配置就是说:rsync
的用户user
,密码是1111111111111111
。后面的这个密码看上去很吓人,其实这个密码是个明文,你懂的。
/etc/rsyncd.conf
这个文件是rsyncd
服务的配置文件,当然,名字和路径是可以随便定义的。文件的内容才是关键。里面的设置项目也是特别的多。本文中,也只涉及到某几项。更多的配置项目,如果以后用得到,苏南大叔会单独成文。这个文件其实是系统自带的配置文件,里面自带了一些范例。不过,苏南大叔是另外增加内容的,并没有修改默认的内容。
注意:最开始的节点名[newsn]
,这个是和其它服务器沟通的模块名称。
[newsn]
uid=www
gid=www
path=/home/wwwroot/newsn.net
read only=false
write only=false
list=false
hosts allow=192.168.1.1
hosts allow=192.168.1.2
auth users=user
secrets file=/etc/rsyncd.password
log file=/var/log/rsyncd.log
其实看起来,这些选项含义都挺明显的。需要特殊注意配置的就是权限部分了。
read only
,指定是否允许客户上传文件。若为 true 则不允许上传;若为 false 并且服务器目录也具有读写权限则允许上传。在本文中,master
要往里面写入文件,当然不能使read only
的了。write only
,指定是否允许客户下载文件。若为 true 则不允许下载;若为 false 并且服务器目录也具有读权限则允许下载。hosts allow
,允许哪个IP操作连接rsyncd
。有多个Ip的时候,就配置多个此条目即可。auth users
,允许的用户名,这个用户名就是rsyncd.password
里面的冒号前面的用户名。secrets file
,这个就是配置用户名密码配对信息的文件。path
,就指的是,slave
机器上对应的目录。master
眼里面的[newsn]
就指的是这个路径了。list
,指定当客户请求列出可以使用的模块列表时,该模块是否应该被列出。如果设置该选项为 false,可以创建隐藏的模块。对于普通人来说,这个模块[newsn]
是否列出,可能意义也不大。不过保险起见,还是隐藏起来,比较好。uid
和gid
,这个就不说了。涉及到文件的相关权限,大家尽量设置一个合适的就好了。苏南大叔用的是宝塔面板,对于网站类文件来说,设置为www
,就是最好不过的了。log file
,当遇到疑难杂症的时候,log
文件当然是最有用的。配置一下log
,总是有备无患的。
设置权限
这一点非常非常非常重要。很多时候,配置失败,都是因为这里没有设置权限,要给上述两个文件赋予600
权限。
chmod 600 /etc/rsyncd.password
chmod 600 /etc/rsyncd.conf
设置rsyncd
开机启动
下面的这条命令,不能吓执行,因为可能会导致多次初始化。请大家执行之前,先vi
查看一下/etc/rc.local
里面的内容。再做决定不迟。
echo "rsync --daemon --config=/etc/rsyncd.conf" >> /etc/rc.local
开放端口号873
如果是宝塔面板的话,可以在安全选项卡中,添加端口号873
。或者执行下面的命令。
firewall-cmd --permanent --add-port=873/tcp
当然,在centos
的世界里面,还有其它防火墙端口控制方式。大家找到适合自己的方式即可。
master
服务器
master
服务器设置上就相对简单了,要设置两个任意路径任意名称的文件如下,注意:这2个文件也要600
权限。而其它参数,比如rtvz
,这些暂时就不解释其含义了。大家可以认为是固定格式。
配置文件设置
--password-file
,放置slave
中的明文密码。直接是明文密码,没有用户名信息哦。--exclude-from
,放置不同步到slave
中的文件路径,即要排除的文件。
rsync -rtvz --progress ${src} ${user}@${ip1}::${des} --password-file=${rsync_passwd_file} --exclude-from=${exclude_file}
比如:--password-file=/home/system/rsync/pwd.txt
。内容如下:
1111111111111111
比如:--exclude-from=/home/system/rsync/exclude.txt
。内容如下:
default.php
.user.ini
这里要注意的是:不同步的文件列表中的单独文件名,就是文件名哦。而不是指带路径信息。也就是说,可能会出现:不同路径下的同名文件,都不同步的现象哦。(即使,你想要不同步的仅仅是根目录下面的那个文件)。这点上大家可以作为排查项目重点关注。
文件夹服务器间全量同步
下面的是个.sh
变量版本的文件:
src=/home/wwwroot/newsn.net/
des=newsn
rsync_passwd_file=/home/system/rsync/password.txt
exclude_file=/home/system/rsync/exclude.txt
ip1=192.168.1.9
user=user
rsync -rtvz --progress ${src} ${user}@${ip1}::${des} --password-file=${rsync_passwd_file} --exclude-from=${exclude_file}
其中,核心语句是这样的:
rsync -rtvz --progress /home/wwwroot/newsn.net/ user@192.168.1.9::newsn --password-file=/home/system/rsync/pwd.txt --exclude-from=/home/system/rsync/exclude.txt
这里面的参数,就不细讲了。上述命令,就是把master
上面的目录/home/wwwroot/newsn.net/
,使用用户名user
同步到slave
上newsn
模块下面的path
上去。就是传说中的全目录同步的概念。
千万注意:
/home/wwwroot/newsn.net/
和user@192.168.1.9::newsn
的前后顺序,源头在前,目标在后。搞错的话,问题是异常巨大的,千万要小心。- 上述命令中,没有
--delete
参数,是因为加上这个参数之后,目标目录中的文件,会发生被删除的现象,这个也是要千万注意的。 - 为了稳妥起见,除了文件更新触发的小范围文件同步外。这种全量更新,也应该定期执行。苏南大叔,在宝塔面板里面,设置了每2小时,执行一下全量更新。
同步单独一个文件
下面说的是单独同步一个文件的命令:
rsync -rtvz --delete --password-file=${rsync_passwd_file} --exclude-from=${exclude_file} ${INO_FILE} ${user}@${ip}::${des}/$(dirname ${INO_FILE})/
比如:
rsync -rtvz --delete --progress config.php user@192.168.1.9::newsn/config/ --password-file=/home/system/rsync/pwd.txt --exclude-from=/home/system/rsync/exclude.txt
上述操作,实际上操作的文件是:/home/wwwroot/newsn.net/config/config.php
。
和全目录有所区别的就是:在模块${des}
名之后,带有当前文件的相对项目的跟路径。一定不能搞错后面的路径,否则所有的文件,都会被更新到slave
的根目录下面。
错误排查
您可能会碰到下面类似的各种错误:
Connection refused (111)
@ERROR: auth failed on module newsn
ERROR: password file must not be other-accessible
rsync error: syntax or usage error (code 1) at authenticate.c(196) [Receiver=3.1.2]
rsync error: error starting client-server protocol (code 5) at main.c(1648) [Receiver=3.1.2]
rsync: [sender] write error: Broken pipe (32)
rsync error: error in socket IO (code 10) at io.c(820) [sender=3.1.2]
您需要仔细检查下面的几点:
- 检查放置
syncd
服务的服务器,端口号873是否开放。 - 检查密码等配置信息是否正确。
syncd
的密码配置中,是有用户名的。sync
的密码配置中,仅仅是明文密码。 - 相关配置文件是否是600权限,777权限是不行的,必须600权限。
- 检查是否允许访问(host_allow),在
syncd
这边是可以指定,只有谁可以操作的。 - 检查
syncd
的服务,是否启动了,rc.local
文件是否设置正确?是否重启过了?
结论
本篇文章仅仅是rsync
功能的基本应用场景,要想完美使用,还需要配置inotify
等功能。当然,这个rsync
也可以在同一个服务器内部同步文件,使用方法就是类似下面这样的了。不用设置密码,目标ip组合信息,也换成一个目录。
rsync -rtvz --delete --progress /source_folder/ /target_folder/ --exclude-from=/home/system/rsync/exclude.txt
更多rsync
资讯文章,请点击下面的文章。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。