Linxu服务器文件双向同步-rsync+sersync

本文涉及的产品
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时计算 Flink 版,5000CU*H 3个月
实时数仓Hologres,5000CU*H 100GB 3个月
简介: Linxu服务器文件双向同步-rsync+sersync

Linxu服务器文件双向同步 rsync+sersync

[toc]

基础信息

系统: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 <->

测试

  • test21test22同步
[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
  • test22test21同步
# 创建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.00

sersync

上面安装完成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  sersync2

sersync配置

test21配置

内容过多只显示了修改的位置,其他都是默认的

  1. <remote ip="10.8.10.22" name="update"/>

  2. <auth start="true" users="rsync_daemon" passwordfile="/etc/rsync.pas"/>

[root@test21 GNU-Linux-x86]# vim confxml.xml
...
<sersync>
        <localpath watch="/opt/updatedir">
            <remote ip="10.8.10.22" name="update"/>
            <!--<remote ip="192.168.8.39" name="tongbu"/>-->
            <!--<remote ip="192.168.8.40" name="tongbu"/>-->
        </localpath>
        <rsync>
            <commonParams params="-artuz"/>
            <auth start="true" users="rsync_daemon" passwordfile="/etc/rsync.pas"/>
            <userDefinedPort start="false" port="874"/><!-- port=874 -->
            <timeout start="false" time="100"/><!-- timeout=100 -->
            <ssh start="false"/>
        </rsync>
        <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
        <crontab start="false" schedule="600"><!--600mins-->
            <crontabfilter start="false">
                <exclude expression="*.php"></exclude>
                <exclude expression="info/*"></exclude>
            </crontabfilter>
        </crontab>
        <plugin start="false" name="command"/>
    </sersync>
...
  • 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.pas

test22配置

[root@test22 GNU-Linux-x86]# vim confxml.xml
...
<sersync>
        <localpath watch="/opt/updatedir">
            <remote ip="10.8.10.21" name="update"/>
            <!--<remote ip="192.168.8.39" name="tongbu"/>-->
            <!--<remote ip="192.168.8.40" name="tongbu"/>-->
        </localpath>
        <rsync>
            <commonParams params="-artuz"/>
            <auth start="true" users="rsync_daemon" passwordfile="/etc/rsync.pas"/>
            <userDefinedPort start="false" port="874"/><!-- port=874 -->
            <timeout start="false" time="100"/><!-- timeout=100 -->
            <ssh start="false"/>
        </rsync>
        <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
        <crontab start="false" schedule="600"><!--600mins-->
            <crontabfilter start="false">
                <exclude expression="*.php"></exclude>
                <exclude expression="info/*"></exclude>
            </crontabfilter>
        </crontab>
        <plugin start="false" name="command"/>
    </sersync>
...

创建密码文件

[root@test22 GNU-Linux-x86]# echo 123456789 > /etc/rsync.pas
[root@test22 GNU-Linux-x86]# chmod 400 /etc/rsync.pas

sersync启动

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 加载配置文件

test22启动

[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
目录
相关文章
|
28天前
|
缓存 监控 网络安全
因服务器时间不同步引起的异常
因服务器时间不同步引起的异常
69 1
|
1月前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
69 9
|
3月前
|
存储 UED Windows
Windows服务器上大量文件迁移方案
Windows服务器上大量文件迁移方案
206 1
|
4月前
|
存储 监控 固态存储
【vSAN分布式存储服务器数据恢复】VMware vSphere vSAN 分布式存储虚拟化平台VMDK文件1KB问题数据恢复案例
在一例vSAN分布式存储故障中,因替换故障闪存盘后磁盘组失效,一台采用RAID0策略且未使用置备的虚拟机VMDK文件受损,仅余1KB大小。经分析发现,该VMDK文件与内部虚拟对象关联失效导致。恢复方案包括定位虚拟对象及组件的具体物理位置,解析分配空间,并手动重组RAID0结构以恢复数据。此案例强调了深入理解vSAN分布式存储机制的重要性,以及定制化数据恢复方案的有效性。
107 5
|
2月前
|
Python
Flask学习笔记(三):基于Flask框架上传特征值(相关数据)到服务器端并保存为txt文件
这篇博客文章是关于如何使用Flask框架上传特征值数据到服务器端,并将其保存为txt文件的教程。
34 0
Flask学习笔记(三):基于Flask框架上传特征值(相关数据)到服务器端并保存为txt文件
|
3月前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
57 4
|
2月前
|
前端开发 Docker 容器
主机host服务器和Docker容器之间的文件互传方法汇总
Docker 成为前端工具,可实现跨设备兼容。本文介绍主机与 Docker 容器/镜像间文件传输的三种方法:1. 构建镜像时使用 `COPY` 或 `ADD` 指令;2. 启动容器时使用 `-v` 挂载卷;3. 运行时使用 `docker cp` 命令。每种方法适用于不同场景,如静态文件打包、开发时文件同步及临时文件传输。注意权限问题、容器停止后的文件传输及性能影响。
445 0
|
4月前
|
Linux
Linux 服务器下载百度网盘文件
本教程指导如何使用 `bypy` 库从百度网盘下载文件。首先通过 `pip install bypy` 安装库,接着运行 `bypy info` 获取登录链接并完成授权,最后将文件置于指定目录并通过 `bypy downdir /Ziya-13b-v1` 命令下载至本地。
438 1
Linux 服务器下载百度网盘文件
|
4月前
|
存储 安全 文件存储
【服务器数据恢复】Apple苹果Xsan文件系统卷宗误操作导致文件丢失数据恢复案例
客户因误操作删除了macOS服务器上的重要图片和视频文件,需紧急恢复。Xsan文件系统作为苹果专为高负载环境设计的64位簇文件系统,在未有专门恢复工具的情况下,常规RAW恢复仅能提取小部分连续存储的小文件,且无目录结构。通过专业的数据恢复流程,包括安全挂载、阵列重组,并使用专用工具解析文件系统以恢复目录结构,最终成功恢复丢失的文件。此案例突显了Xsan文件系统的特点及其恢复难度。
42 1
|
4月前
|
数据可视化 Python
通过python建立一个web服务查看服务器上的文本、图片、视频等文件
通过python建立一个web服务查看服务器上的文本、图片、视频等文件
78 0