我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

在日常运维中,在服务器间保持文件同步,是非常常见的事情。这个时候,资深运维师一般会利用rsync来完成,文件夹间的同步问题。这个命令,可以在同一个服务器的不同目录间同步,也可以在不同服务器之间同步目录。在做服务器级群的时候,这个资料的同步问题,解决方案的重要一环,就是rsync命令。

苏南大叔:服务器间,如何利用 rsync 同步文件资料? - rsync
服务器间,如何利用 rsync 同步文件资料?(图2-1)

本文的测试环境是两台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

苏南大叔:服务器间,如何利用 rsync 同步文件资料? - rsync_version
服务器间,如何利用 rsync 同步文件资料?(图2-2)

slave服务器设置

在这个方案中,苏南大叔首先需要设置slave服务器的rsync。在slave上设置好rsync的远程用户名密码等信息后,然后master机上就可以凭借这些信息,随时主动来存储同步数据了。

这期间,需要个rsyncd的概念,也就是rsync后台服务的概念。然后需要个rsyncd.conf配置文件,和一个ryncd.password密码文件。注意,这两个文件名都是可以自定义的。大家高兴叫什么都可以,高兴放什么路径都是可以的。

master上面设置rsyncd服务,然后slave机定时执行rsync命令,也是可以做到文件夹同步的。这个操作的关键就是:rsync的参数的先后顺序而已。但是,为什么把rsyncd放置在slave上,而不是master上面呢?就是因为:master有着文件变化的优先感知权限。master主动起来,问题会更容易得到解决。

slaversyncd服务中,苏南大叔定义的这两个文件名称及路径,分别是:

  • /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]是否列出,可能意义也不大。不过保险起见,还是隐藏起来,比较好。
  • uidgid,这个就不说了。涉及到文件的相关权限,大家尽量设置一个合适的就好了。苏南大叔用的是宝塔面板,对于网站类文件来说,设置为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同步到slavenewsn模块下面的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资讯文章,请点击下面的文章。

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   centos    rsync