CentOS7 下使用 rsync+sersync 配置文件自动同步

为什么需要文件自动同步功能?

我们平时上传代码,可以通过 ftp、sftp 等将文件上传至服务器,耗时耗力,而且很容易出错。如果服务器数量少还好,一但服务器数量增加,压力可想而知。

这个时候我们可以使用各种工具进行文件同步,方法很多,这里推荐大家使用 rsync+sersync 进行文件同步。

这里使用服务器 A 和服务器 B 进行介绍,我们的目的是将 A 服务器指定的目录自动同步到 B 服务器指定的目录。

使用 rsync+sersync 的背景故事
撸了快 3 年的 Laravel 了,尽量这周分享本人使用的多台服务器集群部署方案

rsync 介绍

rsync 是 linux 下同步文件的一个高效算法,用于同步更新两处计算机的文件和目录,并适当利用查找文件中的不同块以减少数据传输。rsync 的主要特点就是增量传输,只对变更的部分进行传输。

sersync 介绍

sersync 利用 inotify 与 rsync 对服务器进行实时同步,其中 inotify 用于监控文件系统事件,其优点是只对文件不同的部分进行操作,所以其优势大大超过使用挂接文件系统的方式进行镜像同步。

正文

关闭服务器 selinux

$ vi /etc/selinux/config #编辑防火墙配置文件
#SELINUX=enforcing #注释掉  
#SELINUXTYPE=targeted #注释掉 
SELINUX=disabled #增加  
:wq!  #保存,退出

然后重启服务器生效

B 服务器安装 rsync

$ yum -y install rsync
$ systemctl start rsyncd.service #启动rsync服务
$ systemctl enable rsyncd.service #将rsync服务 加入开机自启

检查是否已经成功启动,使用 ps 命令

$ ps -ef | grep rsync

编辑 B 服务器 rsync 配置文件

$ vim /etc/rsyncd.conf

log file = /var/log/rsyncd.log #日志文件位置,启动rsync后自动产生这个文件,无需提前创建
#pid file = /var/run/rsyncd.pid #pid文件的存放位置
lock file = /var/run/rsync.lock #支持max connections参数的锁文件
secrets file = /etc/rsync.pass #用户认证配置文件,里面保存用户名称和密码,后面会创建这个文件
uid = root #设置rsync运行权限为root
gid = root #设置rsync运行权限为root
use chroot = no #默认为true,修改为no,增加对目录文件软连接的备份
max connections = 1200 #最大连接数
timeout = 600 #设置超时时间

[book]   #自定义名称
path = /data/book/  #rsync服务端数据目录路径
comment = book  #模块名称与[book]自定义名称相同
port=873  #默认端口
read only = no  #设置rsync服务端文件为读写权限
list = no #不显示rsync服务端资源列表
auth users = bookuser  #执行数据同步的用户名,可以设置多个,用英文状态下逗号隔开
hosts allow = A服务器IP  #允许进行数据同步的客户端IP地址,可以设置多个,用英文状态下逗号隔开
hosts deny = 192.168.0.1 #禁止数据同步的客户端IP地址,可以设置多个,用英文状态下逗号隔开

创建用户认证文件

 $ vi /etc/rsync.pass

设置用户名和密码,用户名和密码之间以英文冒号分隔

bookuser:123456

设置文件权限

$ chmod 600 /etc/rsyncd.conf  #设置文件所有者读取、写入权限
$ chmod 600 /etc/rsync.pass  #设置文件所有者读取、写入权限

重启 rsync

$ systemctl restart rsyncd

防火墙开启 873 端口

centos7 默认是 firewall,如果防火墙是 iptable,对应更换即可

$ firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="A服务器IP" port protocol="tcp" port="873" accept" #开放端口 
$ systemctl restart firewalld #重启防火墙
$ firewall-cmd --list-all #查看规则是否生效

A 服务器安装 rsync

参照 B 服务器安装 rsync

A 服务器创建密码认证文件

$ vi /etc/passwd.txt  #编辑文件,添加以下内容

123456 #密码 ,B服务器里设置的密码

:wq! #保存退出

$ chmod 600 /etc/passwd.txt #设置文件权限,只设置文件所有者具有读取、写入权限即可

到此,rsync 已经配置完毕

测试 A、B 服务器之间同步

$ rsync -avH --port=873 --progress --delete  /www/data/  bookuser@B服务器IP::book --password-file=/etc/passwd.txt  #在A服务器下运行

如果出现连接失败,基本是端口问题,检查阿里云安全组端口是否开启 \
成功的话,见下图

evernotecid://97CFF20F-9983-4C0A-BC5A-6B2E3E6658E1/appyinxiangcom/15428497/ENResource/p438

安装 sersync

链接:https://pan.baidu.com/s/1GcIlOIsyM8-E1INpQ...

提取码:p0df

解压文件

$ tar zxvf sersync2.5.4_64bit_binary_stable_final.tar.gz  #解压
$ mv GNU-Linux-x86  /usr/local/sersync  #移动目录到/usr/local/sersync

修改 inotify 默认参数(inotify 默认内核参数值太小)

$ vi /etc/sysctl.conf #添加以下代码

fs.inotify.max_queued_events=99999999
fs.inotify.max_user_watches=99999999
fs.inotify.max_user_instances=65535

:wq! #保存退出

配置 sersync

$ cd  /usr/local/sersync #进入sersync安装目录
$ cp confxml.xml confxml.xml-back  #备份原文件

$ vi confxml.xml  #编辑,修改下面的代码

<?xml version="1.0" encoding="ISO-8859-1"?>
    <head version="2.5">
        <host hostip="localhost" port="8008"></host>
        <debug start="false"/>
        <fileSystem xfs="false"/>
        <filter start="false">
            <exclude expression="(.*)\.svn"></exclude>
            <exclude expression="(.*)\.gz"></exclude>
            <exclude expression="^info/*"></exclude>
            <exclude expression="^static/*"></exclude>
        </filter>
        <inotify>
            <delete start="true"/>
            <createFolder start="true"/>
            <createFile start="false"/>
            <closeWrite start="true"/>
            <moveFrom start="true"/>
            <moveTo start="true"/>
            <attrib start="false"/>
            <modify start="false"/>
        </inotify>
        <sersync>
            <localpath watch="/data/book">
                <remote ip="192.168.1.200" name="book"/>
                <!--<remote ip="192.168.8.40" name="tongbu"/>-->
            </localpath>
            <rsync>
                <commonParams params="-artuz"/>
                <auth start="true" users="bookuser" passwordfile="/etc/passwd.txt"/>
                <userDefinedPort start="false" port="873"/><!-- port=873 -->
                <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="true" schedule="600"><!--600mins-->
                <crontabfilter start="false">
                    <exclude expression="*.php"></exclude>
                    <exclude expression="info/*"></exclude>
                </crontabfilter>
            </crontab>
            <plugin start="false" name="command"/>
        </sersync>
        <plugin name="command">
            <param prefix="/bin/sh" suffix="" ignoreError="true"/>  <!--prefix /opt/tongbu/mmm.sh suffix-->
            <filter start="false">
                <include expression="(.*)\.php"/>
                <include expression="(.*)\.sh"/>
            </filter>
        </plugin>
        <plugin name="socket">
            <localpath watch="/data/book">
                <deshost ip="192.168.138.20" port="8009"/>
            </localpath>
        </plugin>
        <plugin name="refreshCDN">
            <localpath watch="/data0/htdocs/cms.xoyo.com/site/">
                <cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx" passwd="xxxx"/>
                <sendurl base="http://pic.xoyo.com/cms"/>
                <regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/>
            </localpath>
        </plugin>
    </head>

参数说明:

<localpath watch="/data/book">  #源服务器同步目录
<remote ip="192.168.1.200" name="book"/> 
remote ip="23.225.218.182":  #目标服务器ip,每行一个 
name="book":   #目标服务器rsync同步目录模块名称
<auth start="true" users="bookuser" passwordfile="/etc/passwd.txt"/>
start="true"  #设置为true,每隔600分钟执行一次全盘同步
users="bookuser": #目标服务器rsync同步用户名
passwordfile="/etc/passwd.txt": #目标服务器rsync同步用户的密码在源服务器的存放路径
failLog path="/tmp/rsync_fail_log.sh"  #脚本运行失败日志记录

手动测试运行同步命令

/usr/local/sersync/sersync2 -d -r -o  /usr/local/sersync/confxml.xml

运行后,命令行输出:

查看 execute,复制代码 cd xxxx .txt 手动运行一遍,无误后,基本可以确定成功
如果修改了配置文件,需要杀掉之前的近程再运行上述代码

$ killall sersync2 #杀掉全部近程

设置 sersync 监控开机自动执行

$ vi /etc/rc.d/rc.local  #编辑,在最后添加一行

/usr/local/sersync/sersync2 -d -r -o  /usr/local/sersync/confxml.xml  #设置开机自动运行脚本

:wq!  #保存退出

如果不起作用的话 \
进入 /etc/init.d 目录,创建脚本 sercync.sh\
编辑内容

#!/bin/bash
 # chkconfig: 2345 10 90
 # description: resind
 /usr/local/sersync/sersync2 -d -r -o  /usr/local/sersync/confxml.xml 

然后赋予执行权限

$ chmod  +x  sersync.sh

将脚本添加到系统服务

$ chkconfig --add  sersync.sh

设置开机自启动:

$ chkconfig  sersync.sh

至此,文件自动同步部署完成

rsync 常见问题及解决办法

附录:rsync 常见问题及解决办法(IP 以 10.10.10.10 代替)

错误一:
password file must not be other-accessible
continuing without password file
Password:
rsync客户端路径是否写错,权限设置不对,需要再次输入密码,客户端和服务端的密码文件都应该是600的权限才可以

错误二:
@ERROR: Unknown module ‘bak’
rsync error: error starting client-server protocol (code 5) at main.c(1522) [receiver= 3.0.3]
服务端server的配置中的[bak]名字和客户端client的10.10.10.10::bak不符

错误三:
rsync: failed to connect to 10.10.10.10: Connection timed out (110)
rsync error: error in socket IO (code 10) at clientserver.c(124) [receiver=3.0.6]
检查服务端server服务是否正常启动,检查端口防火墙,iptables打开873端口
如果服务端是windows server则在防火墙入站规则中增加873端口
如果服务端是Linux则先检查服务是否启动#ps aux | grep rsync
然后开启873端口#iptables -A INPUT -p tcp --dport 873 -j ACCEPT开启873端口
附:
安装rsync yum install rsync
启动服务/usr/bin/rsync --daemon
启动服务错误failed to create pid file /var/rsyncd.pid: File exists
看看提示服务错误的路径(这个路径不一定就是这个,看自己的报错路径)这里是/var/rsyncd.pid所以
rm -rf /var/rsyncd.pid;再重新启动Rsync服务
此时在看一下ps aux | grep rsync启动成功

错误四:
@ERROR: access denied to gmz88down from unknown (10.10.10.10)
rsync error: error starting client-server protocol (code 5) at main.c(1503) [receiver=3.0.6]
看看是不是服务端server hosts allow限制了IP,把这里的IP加入到服务端server的hosts allow白名单中,windows rsync不能写多个allow,可以在一个allow中加多个IP,例:hosts allow=10.10.10.10 20.20.20.20

错误五:
@ERROR: chdir failed
rsync error: error starting client-server protocol (code 5) at main.c(1503) [receiver=3.0.6]
服务端server的目录不存在或者没有权限(要同步的那个文件路径),安装windows rsync时候会创建一个SvcCWRSYNC用户,这个用户对要拷贝的目录没有权限,方法一,将这个用户给权限加入到目录中,方法二,修改这个用户隶属于的组,修改后要在管理中重启服务

错误六:
rsync error: error starting clie
nt-server protocol (code 5) at main.c(1524) [Receiver= 3.0.7 ]
/etc/rsyncd.conf配置文件内容有错误,检查下配置文件

错误七:
rsync: ch
own "" failed: Invalid argument (22)
权限无法复制,去掉同步权限的参数即可

错误八:
@ERROR: auth failed on module bak
rsync error: error starting client-server protocol (code 5) at main.c(1530) [receiver=3.0.6]
密码错误或服务器上是否有bak模块

错误九:
rsync: connection unexpectedly closed (5 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(600) [sender=3.0.6]
模块read only = no设置为no false

错误十:
@ERROR: invalid uid nobody
rsync error: error starting client-server protocol (code 5) at main.c(1503) [sender=3.0.6]
设置
uid =0
gid = 0

错误十一:
rsync: failed to connect to 10.10.10.10: No route to host (113)
rsync error: error in socket IO (code 10) at clientserver.c(124) [receiver=3.0.6]
防火墙原因

错误十二:
rsync: read error: Connection reset by peer (104)
rsync error: error in rsync protocol data stream (code 12) at io.c(759) [receiver=3.0.6]
/etc/rsyncd.conf配置文件不存在

错误十三:
rsync: Failed to exec ssh: No such file or directory (2)
rsync error: error in IPC code (code 14) at pipe.c(84) [receiver=3.0.6]
rsync: connection unexpectedly closed (0 bytes received so far) [receiver]
rsync error: error in IPC code (code 14) at io.c(600) [receiver=3.0.6]
需要在客户端安装yum install -y openssh-clients即可
Image placeholder
dragonsz
未设置
  0人点赞

没有讨论,发表一下自己的看法吧

推荐文章
Linux 文件同步工具之 rsync

学习背景 1.最近公司的项目在使用jenkins做自动化构建,因为jenkins在构建时是比较耗性能的,便单独使用了一台服务器做构建服务器。但是个人觉得这样成本过高,单独拿一台服务器来构建并且该服务器

Rust 标准库中的 async/await (async-std)

Rust对齐标准库中的async/await(async-std)简介现在的rust生态中,async/await在rust1.39中已经stable,其他库还有futures已经到0.3.x,还有就

CentOS7 Docker CE 安装

前言最近想要搭建一个Jenkins用于持续集成,查阅了官网文档后,发现Docker镜像安装十分便利。一直久仰Docker大名,直到2020年才接触实在是落后了太多。那么,就先拆解一下接下来的内容:一、

Onvif/RTSP海康大华网络安防摄像机网页无插件直播方案EasyNVR如何使用Excel将通道配置简单化?

进入移动互联网时代以来,企业微信公众号已成为除官网以外非常重要的宣传渠道,当3.2亿直播用户与9亿微信用户的势能累加,在微信上开启直播已成为越来越多企业的必然选择。EasyNVR核心在于摄像机的音视频

三丰云CentOS7.3服务器上安装Docker

下面分享一下如何在自己购买的三丰云服务器(CentOS7.3版本)上安装Docker大神可直接看如下命令进行安装,菜鸟可按后面给出的傻瓜式安装步骤进行操作:更新Yum包:yumupdate安装所需的包

ORACLE11.2.0.4 RAC+ ASM安装方法 (操作系统CENTOS7.6)

前言网上的各种文章,尝试过后,发现有很多错漏的地方,还有很多细节没有写,或者是遇到各种报错如何处理,都没写,这里是我自己整理的安装步骤和解决报错的方法,因为有部分是从自己以前的笔记里截取的截图之类的,

viper 读取配置文件

viper 项目地址:github.com/spf13/viper viper是什么 go开发工具,主要是用于处理各种格式的配置文件,简化程序配置的读取问题 viper支持:设置默认配置 支持读取

安防摄像头网页无插件直播流媒体服务器EasyNVR在IE浏览器下的 pointer-events- none前端兼容性调试

背景说明由于互联网的飞速发展,传统安防摄像头的视频监控直播与互联网直播相结合是大势所趋。传统安防的直播大多在一个局域网内,在播放的客户端上也是有所限制,一般都需要OCXWeb插件进行直播。对于安防监控

利用 consul+nginx-upsync 实现动态负载

如果Nginx遇到大流量和高负载,修改配置文件重启可能并不总是那么方便,因为恢复Nginx并重载配置会进一步增加系统负载,并很可能暂时降低性能。而一个个修改配置文件也是很容易出错和费时间的操作。 这时

利用 consul+nginx-upsync 实现动态负载

这是前一段时间学习的课程上面的,自己实际操作了一下,详细操作及说明如下。如果Nginx遇到大流量和高负载,修改配置文件重启可能并不总是那么方便,因为恢复Nginx并重载配置会进一步增加系统负载,并很可

死磕Synchronized底层实现,面试你还怕什么?

关于 synchronized 的底层实现,网上有很多文章了。但是很多文章要么作者根本没看代码,仅仅是根据网上其他文章总结、照搬而成,难免有些错误;要么很多点都是一笔带过,对于为什么这样实现没有一个说

深入了解JavaScript async/await !

Asyncfunctions让我们以async这个关键字开始。它可以被放置在任何函数前面,像下面这样:asyncfunctionf(){ return1; }在函数前面的「async」这个单词表达了一

ES6问答-async函数

async函数 async是什么?它和Genernator函数外观上的区别是什么? constasyncReadFile=asyncfunction(){ constf1=awaitreadFile

配置 Horizon 的 queue, balance, processes 参数以及 Redis 中的优先级

我假设你正在使用redis和 LaravelHorizon,要开始配置horizon,仅需用我下面的命令清空所有进程队列任务中horizon的仪表盘。我也曾在本系列的a教程中描述过 链接:phpar

Mac 下使用 pecl 安装 PHP 的 swoole 扩展实践

一、背景前段时间把Mac系统重装了,PHP的一些扩展都没了,昨天需要调试一个swoole开发的项目,发现命令行中的PHP是系统自带的,如果安装swoole扩展很不方便;需要自己手动去下载swoole的

Onvif/RTSP海康大华网络安防摄像机网页无插件直播方案EasyNVR中直播页面和视频列表页面的区别介绍

背景分析随着平安城市、智慧城市、雪亮工程、智能交通等各项建设的持续开展,安防逐渐得到普及,面对如此广阔的市场,对安防企业来说不仅仅是机遇更多的是挑战。现今大多数摄像头一直没能摆脱人工监控的传统监控方式

Onvif/RTSP海康大华网络安防摄像机网页无插件直播方案EasyNVR登陆用户名密码失效问题解决方案

背景分析随着互联网基础设施建设的发展,4G/5G/NB-IoT各种网络技术的大规模商用,视频随时随地可看、可控的诉求越来越多,互联网思维、架构和技术引入进传统监控行业里,成为新形势下全终端监控的基础需

RTSP、RTMP网络摄像头互联网无插件直播视频流媒体服务器EasyNVR在windows上无法启动问题排查

背景需求随着雪亮工程、明厨亮灶、手机看店、智慧幼儿园监控等行业开始将传统的安防摄像头进行互联网、微信直播,我们知道摄像头直播的春天了。将安防摄像头或NVR上的视频流转成互联网直播常用的RTSP、RTM

RTSP-ONVIF协议安防视频监控流媒体服务解决方案EasyNVR在Windows重启时提示“进程意外终止”问题解析

什么是ONVIFOpenNetworkVideoInterfaceForum,开放型网络视频接口论坛,以公开、开放的原则共同制定开放性行业标准。是一个提供开放网络视频接口的论坛组织。ONVIF规范描述

安防摄像头RTSP/Onvif协议网页无插件直播视频流媒体服务器EasyNVR之按需直播如何有效利用最大上行带宽

介绍一般情况下,直播默认的播放方式是非按需直播,但很多情况下,不少用户会选择按需直播。按需直播能够减少带宽流量和服务器性能占用,最优的提高服务器的使用效率。下面我们来系统介绍下EasyNVR中按需直播

RTSP网络摄像头/海康大华硬盘录像机网页无插件直播方案EasyNVR如何实现RTMP/FLV/HLS/RTSP直播流分发

背景需求对于摄像机直播,客户反馈的最多就是实现web直播、摆脱插件,可以自定义集成等问题。我们熟悉的EasyNVR已经完美的解决了这些问题。然而对于web播放也存在一些问题,通常我们web播放RTMP

vue引入swiper vue使用swiper vue脚手架使用swiper /引入js文件/引入css文件

vue引入swipervue使用swipervue脚手架使用swiper/引入js文件/引入css文件欢迎加入前端交流群来获取视频资料以及前端学习资料:749539640转载文章请注明出处! 如果只是

微信支付退款解析 对加密串 B 做 AES-256-ECB 解密(PKCS7Padding)

微信支付退款解析对加密串B做AES-256-ECB解密(PKCS7Padding)1.微信支付文档 https://pay.weixin.qq.com/wiki/doc/api/H5....解密方式解

css如何设置文字描边效果?

想要使用CSS给文字添加描边效果,主要有两种方法:使用text-stroke属性或text-shadow属性。方法1:使用text-shadow属性text-shadow属性用于向文本添加字体边框或阴

Java 8 并发教程:同步和锁

出于简单的因素,这个教程的代码示例使用了定义在这里的两个辅助函数sleep(seconds)和stop(executor)。 同步 在上一章中,我们学到了如何通过执行器服务同时执行代码。当我们编写这种