rsync+sersync文件实时同步
背景
在日常业务中,文件的同步特别是实时同步是一个关键的需求。无论是在开发环境、生产环境还是备份环境中,都需要确保多个系统之间的文件保持同步,以便及时共享最新的数据。
提到文件同步,必会想到使用rsync
命令,该命令在实现文件远程同步上有很好的性能表现,而想要实现实时同步就需要使用到相关的工具,以前常用的是inotify
工具,现在常用国人开发的工具sersync
,使用sersync+rsync
就可以完美的实现文件实时同步和文件的增量更新。
rsync 命令
rsync
是一个很经典的文件同步命令,该命令支持增量同步备份,只会传输差异文件,能够大大节省文件传输消耗,除此之外,rsync
还支持正则表达式过滤传输、断点续传等等强大的功能,rsync
底层支持两种传输协议:ssh
协议和rsync
协议。
使用rsync
协议的时候需要对备份机器进行相关的配置,并且需要将rsync
以守护进程的方式一直运行在备份服务器上(或者配置xinetd检测到请求端口请求时唤醒备份机器的rsync进程)。
rsync
常用远程备份参数和命令格式:
命令格式:
# 使用ssh协议和rsync协议的差别就是单个:和两个::,单个为ssh,两个为rsync
# 第一种格式是将本地文件复制到远程机器,使用ssh协议
# 第二种格式是将远程文件复制到本地,使用ssh协议
# 第三种和第一种相同,使用rsync协议
# 第四种和第二种相同,使用rsync协议
rsync [OPTION] SRC [USER@]HOST:DEST
[OPTION] [USER@]HOST:SRC DEST
[OPTION] SRC [USER@]HOST::DEST
[OPTION] [USER@]HOST::SRC DEST
# 这种方式是使用模块进行传输,这需要rsync服务端编写相应模块配置,后文会讲
# 下面两种方式分别是复制到本地和远程机器
rsync [OPTION] [USER@]HOST::MODULE/[file] [DEST]
rsync [OPTION] [SRC] [USER@]HOST::MODULE/[DEST]
# rsync也支持本地复制
rsync [OPTION] SRC DEST
OPTION:rsync命令可使用参数,SRC:数据源目录,USER:登录用户,不指定时默认使用本地登录用户,HOST:远程主机名,DEST:目标文件,MODULE:rsync模块名称
常用参数:
参数 | 作用 |
---|---|
-a(archive) | 这个参数等于-r,-p,-l,-t,-g,-o,-D的组合,这个参数是想要递归并想要保留几乎所有内容的快速方式 |
-r | 递归处理子目录 |
-p | 保持文件权限 |
-l | 保持软连接 |
-t | 保持文件时间信息 |
-g | 保持文件属组 |
-o | 保持文件属主 |
-D | 保持设备文件信息 |
-v(verbose) | 显示更多的输出信息,使用这个参数将会显示文件列表等 |
-H | 保持硬链接 |
–delete | 删除DEST中SRC没有的文件 |
–progress | 显示文件传输进度。 |
-z | 讲传输文件压缩 |
–password-file= | 指定密码文件,当需要密码验证时,使用此参数可以保证密码安全 |
sersync
sersync(也称为Synchronous Remote Sync)是一个基于rsync的开源工具,用于实时同步文件或目录到远程服务器。它使用了rsync算法的增量复制特性,能够快速而高效地同步文件变化,减少了网络传输的数据量。而且sersync安装使用很简单,基本不需要进行其他配置
搭建步骤
搭建环境:两台cenOS 7Linux机器(一台主/数据源服务器,一台从/备份服务器)
从/备份服务器配置步骤:
-
关闭Linux防火墙和seLinux
# 关闭防火墙 systemctl stop firewalld systemctl disable firewalld # 关闭selinux setenforce 0 sed -i '/SELINUX=/ s/enforcing/disabled/g' /etc/selinux/config
-
安装rsync
yum install rsync -y
-
修改rsync配置文件
我们需要备份服务器的rsync以守护进程的形式运行,以方便能让数据源服务器随时连接。而让rsync以守护进程的形式运行就需要修改rsync的配置文件。
rsync的配置文件目录:/etc/rsyncd.conf
这里列举一些rsync配置文件中的常用参数:
uid、gid:指定服务进程以哪个用户和组的身份运行 pid file:指定rsync守护进程的PID port:指定rsync服务器监听的端口号(默认873) motd file:指定欢迎信息文件 log file:指定日志文件路径 syslog facility:指定rysnc的日志级别 secrets file:指定认证文件路径,当客户端连接时认证所需的用户和密码 read/write only:设置rsync服务器是否为只读/仅写模式,值为yes或者no hosts allow/deny:可允许/禁止访问的主机 max connections:最大允许连接数 timeout:设置连接超时时间 use chroot:限制rsync的操作目录(限制在特定目录中运行),值为yes/no path:指定操作路径,和use chroot一同使用
在rsync的配置文件中还有一个概念:模块。
模块(module)用于定义要同步的数据存储位置和访问权限。每个模块表示一个独立的数据集或文件夹,客户端可以通过指定模块名来访问对应的数据。
这个意识就是将一些权限单独定义为模块,当用户使用模块的方式连接时,用户就会受到模块中额外的权限限制,这样就可以将不同的用户分开来。
定义方式如下:
[模块名称] # 模块的单独权限设置 path:指定要同步的数据存储路径。为了安全起见,一般会使用绝对路径。 comment:对模块的备注信息 auth users:允许访问该模块的授权用户列表。 read only:设置模块是否为只读模式。如果设置为yes,则禁止客户端在该模块上进行写入操作。 write only:设置模块是否为写入模式。如果设置为yes,则禁止客户端从该模块下载文件。 hosts allow、hosts deny:分别用于指定允许或拒绝连接到该模块的主机列表。 max connections:限制同时连接到该模块的最大客户端数量。 ignore errors: 忽视错误
示例配置文件
uid = root gid = root use chroot = yes max connections = 36 log file = /var/log/rsyncd.log pid file = /var/run/rsyncd.pid secrets file = /etc/rsync.pass motd file = /etc/rsyncd.Motd [daily_back] # 这里指定了目标备份的地址,记得将文件创建 path = /back comment = A directory in which data is stored ignore errors = yes read only = no
-
创建用户认证文件
上述示例配置文件中,将认证文件的路径设置为
/etc/rsync.pass
,那我们就创建一个这样的文件,内容如下# 格式为username:password,可以写多个 # 设置了一个认证用户,testUser,登录密码为123456 testUser:123456
建议更改这个文件和配置文件的权限,保证安全
chmod 600 /etc/rsyncd.conf chmod 600 /etc/rsync.pass
-
将rsync以守护进程运行并且设置开机启动
完成以上配置即可将rsync以守护进程运行
# rsync守护进程运行 /usr/bin/rsync --daemon --config=/etc/rsyncd.conf # 设置开机启动 echo "/usr/bin/rsync --daemon --config=/etc/rsyncd.conf" >> /etc/rc.d/rc.local chmod +x /etc/rc.d/rc.local
可不可以不让rsync以守护程序的形式一直运行?
让rsync以守护进程的形式一直运行,无非就是让rsync的进程一直存在以随时处理客户端发过来的备份请求,因为rsync自己无法自动读取该请求并唤醒自己,但是可以使用一个xinetd的程序来解决这个问题,从而让rsync不用守护进程一直运行(即省略第4步),不过使用这个程序还要进行另外的配置,所以反而会使配置过程更加复杂,个人不是很推荐。
xinetd的原理:xinetd是Linux的网络服务管理程序(需要单独安装),当别机器发送网络请求过来时,xinetd会自动调用网络请求中相应端口的服务来处理请求(前提是要将相关配置完成),这样有rsync的网络同步请求过来时,xinetd就会自动调用873的程序(即服务端rsync)来处理请求。
xinetd配置过程:先安装xinetd,然后在在
/etc/xinetd.d/
目录下创建一个名为rsync
或自定义名称的配置文件,配置内容如下:service rsync { disable = no flags = IPv4 socket_type = stream wait = no user = root server = /usr/bin/rsync server_args = --daemon log_on_failure = USERID port = 873 }
至此备份服务器配置完成。
主/数据源服务器配置步骤:
-
关闭Linux防火墙和seLinux
# 关闭防火墙 systemctl stop firewalld systemctl disable firewalld # 关闭selinux setenforce 0 sed -i '/SELINUX=/ s/enforcing/disabled/g' /etc/selinux/config
-
安装rsync
yum install rsync -y
-
创建密码验证文件
创建用来保存密码的验证文件,路径随意,名称随意,这里创建
/etc/password.txt
,文件内容为你备份数据库中验证文件设置的密码,我上面步骤设置的为123456
,所以内容为123456
-
验证能否连接上备份服务器的rsync服务进程
# 这里在根目录创建目录/testConn,并创建文件/testConn/test作为传输验证文件 mkdir /testConn echo "这是一个测试文件" > /testConn/test # 这里使用的命令的格式:rsync [OPTION] [SRC] [USER@]HOST::MODULE/[DEST] # OPTION:-avH, --progress, --delete # SRC: /testConn # 记得将HOST转换你的实际IP地址 # DEST: 未指定 # 还使用--password-file指定刚才创建的验证文件 # 使用了刚才创建的daily_back模块 rsync -avH --progress --delete /testConn testUser@HOST::daily_back --password-file=/etc/password.txt
发现能够传输文件即备份服务器设置成功,成功的输出如下:
-
安装sersync
# 使用wget下载安装文件,wget需要单独安装 wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/sersync/sersync2.5.4_64bit_binary_stable_final.tar.gz # 解压文件 tar xf sersync2.5.4_64bit_binary_stable_final.tar.gz # 将解压后得到的GNU-Linux-x86中的文件移入/usr/local/sersync中 mv ./GNU-Linux-x86/ /usr/local/sersync
-
修改sersync的配置文件
修改的配置文件为:confxml.xml
vim /usr/local/sersync/confxml.xml
修改内容:
第24行<localpath watch="/opt/tongbu">, 将/opt/tongbu改为你要监控的文件 第25行<remote ip="127.0.0.1" name="tongbu1"/>, 将remote ip改为你的备份数据库IP,name值为模块名(daily_back) 第31行<auth start="false" users="root" passwordfile="/etc/rsync.pas"/>,users改为验证文件中的内容(改为testUser),passwordfile改为 数据源服务器 的passwordfile(/etc/password.txt)
配置文件内容如下:
1 <?xml version="1.0" encoding="ISO-8859-1"?> 2 <head version="2.5"> 3 <host hostip="localhost" port="8008"></host> 4 <debug start="false"/> 5 <fileSystem xfs="false"/> 6 <filter start="false"> 7 <exclude expression="(.*)\.svn"></exclude> 8 <exclude expression="(.*)\.gz"></exclude> 9 <exclude expression="^info/*"></exclude> 10 <exclude expression="^static/*"></exclude> 11 </filter> 12 <inotify> 13 <delete start="true"/> 14 <createFolder start="true"/> 15 <createFile start="false"/> 16 <closeWrite start="true"/> 17 <moveFrom start="true"/> 18 <moveTo start="true"/> 19 <attrib start="false"/> 20 <modify start="false"/> 21 </inotify> 22 23 <sersync> 24 <localpath watch="/opt/tongbu"> 25 <remote ip="127.0.0.1" name="tongbu1"/> 26 <!--<remote ip="192.168.8.39" name="tongbu"/>--> 27 <!--<remote ip="192.168.8.40" name="tongbu"/>--> 28 </localpath> 29 <rsync> 30 <commonParams params="-artuz"/> 31 <auth start="false" users="root" passwordfile="/etc/rsync.pas"/> 32 <userDefinedPort start="false" port="874"/><!-- port=874 --> 33 <timeout start="false" time="100"/><!-- timeout=100 --> 34 <ssh start="false"/> 35 </rsync> 36 <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once--> 37 <crontab start="false" schedule="600"><!--600mins--> 38 <crontabfilter start="false"> 39 <exclude expression="*.php"></exclude> 40 <exclude expression="info/*"></exclude> 41 </crontabfilter> 42 </crontab> 43 <plugin start="false" name="command"/> 44 </sersync> 45 46 <plugin name="command"> 47 <param prefix="/bin/sh" suffix="" ignoreError="true"/> <!--prefix /opt/tongbu/mmm.sh suffix--> 48 <filter start="false"> 49 <include expression="(.*)\.php"/> 50 <include expression="(.*)\.sh"/> 51 </filter> 52 </plugin> 53 54 <plugin name="socket"> 55 <localpath watch="/opt/tongbu"> 56 <deshost ip="192.168.138.20" port="8009"/> 57 </localpath> 58 </plugin> 59 <plugin name="refreshCDN"> 60 <localpath watch="/data0/htdocs/cms.xoyo.com/site/"> 61 <cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx" passwd="xxxx"/> 62 <sendurl base="http://pic.xoyo.com/cms"/> 63 <regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/> 64 </localpath> 65 </plugin> 66 </head>
-
启动sersync
修改配置文件之后,即可启动sersync
nohup /usr/local/sersync/sersync2 -d -r -o /usr/local/sersync/confxml.xml
启动成功之后截图:
-
验证sersync的实时同步效果
修改/testConn下的数据查看数据备份服务器是否自动同步成功。