- Linxu服务器文件双向同步 rsync+sersync
- 基础信息
- 安装
- rsync
- 安装
- 配置
- 根据配置文件创建相应的目录、文件、防火墙规则
- 创建需要同步的目录
- 创建同步用户
- 防火墙
- 启动rsyncd服务
- 测试
- 异常处理
- sersync
- 安装
- sersync配置
- test21配置
- test22配置
- sersync启动
- test21启动
- test22启动
- 测试
- 新增文件
- 修改内容
- 删除文件
系统:Centos7.8
- 服务器信息
| 服务器 | IP |
|---|---|
| test21 | 10.8.10.21 |
| test22 | 10.8.10.22 |
- 软件版本信息
| 软件包 | 版本 |
|---|---|
| rsync | |
| sersync |
Rsync安装包下载地址:https://github.com/WayneD/rsync/releases
sersync下载地址:https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/sersync/sersync2.5.4_64bit_binary_stable_final.tar.gz
安装 rsync 安装查看是否已经安装
rpm -qa | grep rsync
安装
yum -y install rsync配置
- 修改test21服务器文件/etc/rsyncd.conf
# /etc/rsyncd: configuration file for rsync daemon mode # See rsyncd.conf man page for more options. # configuration example: uid = root # 指定运行rsync daemon的用户 gid = root # 指定运行rsync daemon的组 use chroot = no address = 10.8.10.21 # 指定监听地址 port = 873 # 默认监听端口 max connections = 0 #最大连接数,0为无限制 pid file = /var/run/rsyncd.pid # 指定pid文件 log file = /var/log/rsyncd.log # 指定日志文件 exclude = lost+found/ # 指定不同步的目录 ignore errors #transfer logging = yes #timeout = 900 #ignore nonreadable = yes #dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2 # [ftp] # path = /home/ftp # comment = ftp export area [update] # update模块 path = /root/updatedir # update模块需要同步目录 comment = test rsync + sersync # update模块的简要说明 read only = no # 是否只读 list = no # 当用户查询该服务器上的可用模块时,是否列出该模块 auth users = rsync_daemon # 同步文件使用到的虚拟用户 secrets file = /etc/rsync_update.passwd # 指定该虚拟用户对应的密码文件,该文件权限为(400) hosts allow = 10.8.10.22 # 指定可以连接该模块的主机(x.x.x.x x.x.x.x/x)
- 修改test22服务器文件/etc/rsyncd.conf
# /etc/rsyncd: configuration file for rsync daemon mode # See rsyncd.conf man page for more options. # configuration example: uid = root # 指定运行rsync daemon的用户 gid = root # 指定运行rsync daemon的组 use chroot = no address = 10.8.10.22 # 指定监听地址 port = 873 # 默认监听端口 max connections = 0 #最大连接数,0为无限制 pid file = /var/run/rsyncd.pid # 指定pid文件 log file = /var/log/rsyncd.log # 指定日志文件 exclude = lost+found/ # 指定不同步的目录 ignore errors #transfer logging = yes #timeout = 900 #ignore nonreadable = yes #dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2 # [ftp] # path = /home/ftp # comment = ftp export area [update] # update模块 path = /root/updatedir # update模块需要同步目录 comment = test rsync + sersync # update模块的简要说明 read only = no # 是否只读 list = no # 当用户查询该服务器上的可用模块时,是否列出该模块 auth users = rsync_daemon # 同步文件使用到的虚拟用户 secrets file = /etc/rsync_update.passwd # 指定该虚拟用户对应的密码文件,该文件权限为(400) hosts allow = 10.8.10.21 # 指定可以连接该模块的主机(x.x.x.x x.x.x.x/x)根据配置文件创建相应的目录、文件、防火墙规则 创建需要同步的目录
在两个服务器上分别创建需要同步的目录
[root@test21 ~]# mkdir /root/updatedir [root@test22 ~]# mkdir /root/updatedir创建同步用户
创建虚拟用户rsync_daemon使用的密码文件/etc/rsync_update.passwd
该文件的权限必须为400
[root@test21 ~]# echo "rsync_daemon:123456789" > /etc/rsync_update.passwd [root@test21 updatedir]# chmod 400 /etc/rsync_update.passwd [root@test22 ~]# echo "rsync_daemon:123456789" > /etc/rsync_update.passwd [root@test22 updatedir]# chmod 400 /etc/rsync_update.passwd防火墙
这里我是关闭了防火墙,如果防火墙开启,防火墙规则要将873端口加入
启动rsyncd服务[root@test21 ~]# systemctl start rsyncd [root@test22 ~]# systemctl start rsyncd
- 查看端口
[root@test21 /]# ss -antuple | grep 873
tcp LISTEN 0 5 10.8.10.21:873 *:* users:(("rsync",pid=14221,fd=3)) ino:72483 sk:ffff8800b7d75d00 <->
[root@test22 ~]# ss -antuple | grep 873
tcp LISTEN 0 5 10.8.10.22:873 *:* users:(("rsync",pid=1735,fd=3)) ino:29740 sk:ffff880226eb87c0 <->
测试
- test21向test22同步
[root@test21 updatedir]# ls
[root@test21 updatedir]# touch file{1..5}
[root@test21 updatedir]# rsync -av /root/updatedir/ rsync_daemon@10.8.10.22::update
Password:
sending incremental file list
./
file1
file2
file3
file4
file5
sent 314 bytes received 114 bytes 171.20 bytes/sec
total size is 0 speedup is 0.00
test22服务器查看
[root@test22 updatedir]# ls file1 file2 file3 file4 file5
- test22向test21同步
# 创建file6 - file10 空文件
[root@test22 updatedir]# touch file{6..10}
# 文件同步
[root@test22 updatedir]# rsync -av /root/updatedir/ rsync_daemon@10.8.10.21::update
Password:
sending incremental file list
./
file10
file6
file7
file8
file9
sent 388 bytes received 114 bytes 111.56 bytes/sec
total size is 0 speedup is 0.00
test21服务器查看
[root@test21 updatedir]# ls file1 file10 file2 file3 file4 file5 file6 file7 file8 file9
rsync数据同步成功,我们可以设置linxu定时任务crontab每隔一段时间自动双向同步文件。
异常处理- 提示权限不足
test22发送到test21可以正常发送,test21发送到test22无法发送
[root@test21 updatedir]# rsync -av /root/updatedir/ rsync_daemon@10.8.10.22::update Password: sending incremental file list rsync: failed to set times on "." (in update): Permission denied (13) ./ file1 file2 file3 file4 file5 rsync: mkstemp ".file1.PRynLL" (in update) failed: Permission denied (13) rsync: mkstemp ".file2.L3Zgd2" (in update) failed: Permission denied (13) rsync: mkstemp ".file3.t4KaFi" (in update) failed: Permission denied (13) rsync: mkstemp ".file4.PZF46y" (in update) failed: Permission denied (13) rsync: mkstemp ".file5.NOJYyP" (in update) failed: Permission denied (13)
报错后查看网上各种资料描述,说是目录权限改为755等,试了之后都不行
随后又增加了一台服务器做测试,发现新增的也不行
[root@test22 etc]# rsync -av /root/updatedir/ root@10.8.10.20::update Password: sending incremental file list rsync: failed to set times on "." (in update): Permission denied (13) rsync: recv_generator: failed to stat "123" (in update): Permission denied (13) ./ sent 59 bytes received 173 bytes 51.56 bytes/sec total size is 0 speedup is 0.00 rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1179) [sender=3.1.2]
后来在stackoverflow发现有大佬提示说selinux问题导致,我们查看服务器配置
参考文献:https://stackoverflow.com/questions/11039559/rsync-mkstemp-failed-permission-denied-13
[root@test21 etc]# getenforce Permissive [root@test20 updatedir]# getenforce Enforcing [root@test22 etc]# getenforce Enforcing
发现的确21和22,20配置不同
修改22,20配置
[root@test20 updatedir]# setenforce 0 [root@test20 updatedir]# getenforce Permissive [root@test22 etc]# setenforce 0 [root@test22 etc]# getenforce Permissive
setenforce 0为临时修改,永久修改vim /etc/sysconfig/selinux
SELINUX=enforcing 修改为 SELINUX=disable 或者 SELINUX=permissive
再次执行发现可以同步成功
[root@test22 etc]# rsync -av /root/updatedir/ root@10.8.10.20::update Password: sending incremental file list ./ 123 sent 102 bytes received 38 bytes 40.00 bytes/sec total size is 0 speedup is 0.00 [root@test22 etc]# rsync -av /root/updatedir/ root@10.8.10.20::update Password: sending incremental file list ./ 123 sent 102 bytes received 38 bytes 40.00 bytes/sec total size is 0 speedup is 0.00sersync
上面安装完成rsync,我们只能通过定时任务触发文件同步,sersync可以对文件的变更进行实时监听,并触发rsync对变更的文件进行实时同步。
安装下载:[点击下载]
将文件放在两台服务器中,并解压
[root@test22 sersync]# ll 总用量 712 -rw-------. 1 root root 727290 11月 10 13:11 sersync2.5.4_64bit_binary_stable_final.tar.gz [root@test22 sersync]# pwd /opt/sersync [root@test22 sersync]# tar -zxvf sersync2.5.4_64bit_binary_stable_final.tar.gz GNU-Linux-x86/ GNU-Linux-x86/sersync2 GNU-Linux-x86/confxml.xml [root@test22 sersync]# ls GNU-Linux-x86/ confxml.xml sersync2 [root@test21 sersync]# ll 总用量 712 -rw-------. 1 root root 727290 11月 10 13:11 sersync2.5.4_64bit_binary_stable_final.tar.gz [root@test21 sersync]# pwd /opt/sersync [root@test21 sersync]# tar -zxvf sersync2.5.4_64bit_binary_stable_final.tar.gz GNU-Linux-x86/ GNU-Linux-x86/sersync2 GNU-Linux-x86/confxml.xml [root@test21 sersync]# ls GNU-Linux-x86/ confxml.xml sersync2sersync配置 test21配置
内容过多只显示了修改的位置,其他都是默认的
[root@test21 GNU-Linux-x86]# vim confxml.xml ......
- watch 指定了监控的文件目录
- remote ip 指定远程rsync服务监听的ip,
- name 指定了远程rsync服务开启的模块
- start=“true” 说明远程rsync服务开启了用户密码验证
- users 指定了远程rsync服务用户密码验证指定的虚拟用户
- passwordfile 指定了连接远程rsync服务虚拟用户的密码文件,权限需为400,用户自己手动创建
创建密码文件
[root@test21 GNU-Linux-x86]# echo 123456789 > /etc/rsync.pas [root@test21 GNU-Linux-x86]# chmod 400 /etc/rsync.pastest22配置
[root@test22 GNU-Linux-x86]# vim confxml.xml ......
创建密码文件
[root@test22 GNU-Linux-x86]# echo 123456789 > /etc/rsync.pas [root@test22 GNU-Linux-x86]# chmod 400 /etc/rsync.passersync启动 test21启动
[root@test21 updatedir]# /opt/sersync/GNU-Linux-x86/sersync2 -d -r -o /opt/sersync/GNU-Linux-x86/confxml.xml set the system param execute:echo 50000000 > /proc/sys/fs/inotify/max_user_watches execute:echo 327679 > /proc/sys/fs/inotify/max_queued_events parse the command param option: -d run as a daemon option: -r rsync all the local files to the remote servers before the sersync work option: -o config xml name: /opt/sersync/GNU-Linux-x86/confxml.xml daemon thread num: 10 parse xml config file host ip : localhost host port: 8008 daemon start,sersync run behind the console use rsync password-file : user is rsync_daemon passwordfile is /etc/rsync.pas config xml parse success please set /etc/rsyncd.conf max connections=0 Manually sersync working thread 12 = 1(primary thread) + 1(fail retry thread) + 10(daemon sub threads) Max threads numbers is: 22 = 12(Thread pool nums) + 10(Sub threads) please according your cpu ,use -n param to adjust the cpu rate ------------------------------------------ rsync the directory recursivly to the remote servers once working please wait... execute command: cd /root/updatedir && rsync -artuz -R --delete ./ rsync_daemon@10.8.10.22::update --password-file=/etc/rsync.pas >/dev/null 2>&1 run the sersync: watch path is: /root/updatedir
- -d 以后台daemon的方式运行
- -r 第一次启动时,使用rsync将本地文件全部同步至远程服务器。
- -o 加载配置文件
[root@test22 updatedir]# /opt/sersync/GNU-Linux-x86/sersync2 -d -r -o /opt/sersync/GNU-Linux-x86/confxml.xml set the system param execute:echo 50000000 > /proc/sys/fs/inotify/max_user_watches execute:echo 327679 > /proc/sys/fs/inotify/max_queued_events parse the command param option: -d run as a daemon option: -r rsync all the local files to the remote servers before the sersync work option: -o config xml name: /opt/sersync/GNU-Linux-x86/confxml.xml daemon thread num: 10 parse xml config file host ip : localhost host port: 8008 daemon start,sersync run behind the console use rsync password-file : user is rsync_daemon passwordfile is /etc/rsync.pas config xml parse success please set /etc/rsyncd.conf max connections=0 Manually sersync working thread 12 = 1(primary thread) + 1(fail retry thread) + 10(daemon sub threads) Max threads numbers is: 22 = 12(Thread pool nums) + 10(Sub threads) please according your cpu ,use -n param to adjust the cpu rate ------------------------------------------ rsync the directory recursivly to the remote servers once working please wait... execute command: cd /root/updatedir && rsync -artuz -R --delete ./ rsync_daemon@10.8.10.21::tongbu1 --password-file=/etc/rsync.pas >/dev/null 2>&1 run the sersync: watch path is: /root/updatedir测试 新增文件
在test21上传一个文件,在test22查看也同时存在
[root@test21 updatedir]# ll 总用量 4 -rw-------. 1 root root 253 11月 10 11:12 1.sh [root@test22 updatedir]# ll 总用量 4 -rw-------. 1 root root 253 11月 10 11:12 1.sh修改内容
修改test22
[root@test22 updatedir]# ll 总用量 4 -rw-------. 1 root root 253 11月 10 11:12 1.sh [root@test22 updatedir]# echo 1 > 1.sh [root@test22 updatedir]# ll 总用量 4 -rw-------. 1 root root 2 11月 10 13:59 1.sh [root@test22 updatedir]# cat 1.sh 1
查看test21发现修改的内容同步成功
[root@test21 updatedir]# cat 1.sh 1删除文件
删除test21文件
[root@test21 updatedir]# rm 1.sh rm:是否删除普通文件 "1.sh"?y [root@test21 updatedir]# ll 总用量 0
在test22 查看发现文件也同步删除
[root@test22 updatedir]# ll 总用量 0



