实时双向同步实现

环境:

linux :内核3.0以上

同步工具:

rsync&sersync

资料:https://rsync.samba.org/examples.html

要求:须以root实现一下操作,否则容易失败

rsync是文件或目录同步的常用工具,尤其在分布式系统下进行同步,可以通过自写脚本调用该命令的方式实现,但现在有更加容易实现的方法,通过以上工具以配置文件的形式实现实时双向同步。

第一步:安装rsync

yum -y install xinetd rsync   

xinetd --是用来管理rsync的

rsync--同步工具

sersync--监控目录

 调整内核参数:

sysctl -w fs.inotify.max_queued_events="99999999"   #inotify队列最大长度,如果值太小,会出现"** Event Queue Overflow **"错误,导致监控文件不准确
sysctl -w fs.inotify.max_user_watches="99999999"       #要同步的文件包含多少目录,可以用find /opt/tongbu1 -type d | wc -l 统计,必须保证max_user_watches值大于统计结果
sysctl -w fs.inotify.max_user_instances="65535"    #每个用户创建inotify实例最大值

二 安装rsync
在AB服务器各自安装rsync:
yum -y install xinetd rsync(用root权限)
mkdir -p /cmiot/File_Receive(用root用户)

第一步:配置rsync的配置文件
vi /cmiot/File_Receive
#===========================
#主机A的配置文件
uid = root
gid = root
port=873
use chroot = yes
max connections = 5
syslog facility = local5
pid file = /var/run/rsyncd.pid
lock file=/var/run/rsync.lock
log file=/var/log/rsyncd.log
transfer logging = yes
address=192.168.106.205 #服务器A
hosts allow=192.168.106.206 #服务器B
hosts deny = * #禁止同步的ip
read only=false
list=yes
ignore errors #忽略一些IO错误
auth users = rsyncuser
secrets file = /etc/rsync.passwd
################################
[backup]
path = /cmiot/File_Receive/  #必须是完整路径,某位的'/'必须加上
comment = welcome to oldboyedu backup! #解释
#===========================
#建立虚拟账户对应的用户名与密码(用于客户端连接的账户和密码)
#A主机密码验证文件
vim /etc/rsync.passwd
rsyncuser:123456
chmod 600 /etc/rsync.passwd
B主机登录密码文件--用于登录B主机使用
vim /etc/rsync_bak.passwd
123456
chmod 600 /etc/rsync_bak.passwd
#===========================
#主机B的配置文件
uid = root
gid = root
port=873
use chroot = yes
max connections = 5
syslog facility = local5
pid file = /var/run/rsyncd.pid
lock file=/var/run/rsync.lock
log file=/var/log/rsyncd.log
transfer logging = yes
address=192.168.106.206 #服务器B
hosts allow=192.168.106.205 #服务器A:修改一下允许访问的网段,根据实际情况填写
hosts deny = * #禁止同步的ip
read only=false
list=yes
ignore errors #忽略一些IO错误
auth users = rsyncuser_bak
secrets file = /etc/rsync_bak.passwd
################################
[backup_bak] #模块名称
path = /cmiot/File_Receive/  #备份目录,必须是完整路径,某位的'/'必须加上
comment = welcome to oldboyedu backup! #解释
#===========================
#建立虚拟账户对应的用户名与密码(用于客户端连接的账户和密码)
B主机密码验证文件
vim /etc/rsync_bak.passwd
rsyncuser_bak:123456
chmod 600 /etc/rsync_bak.passwd
A主机密码登陆了文件
vim /etc/rsync.passwd
123456
chmod 600 /etc/rsync.passwd
#注意:密码验证文件与登录密码文件密码必须一致
第二步:开启873端口
netstat -antup|grep 873
防火墙开机启动:systemctl enable firewalld.service
查看防火墙状态:firewall-cmd --state
开启防火墙:systemctl start firewalld.service
开放873端口:firewall-cmd --zone=public --add-port=873/tcp --permanent
重启:systemctl restart firewalld.service
重新加载载:firewall-cmd --reload
#===========================
第三步: 查看rsync进程
ps -ef | grep rsync | grep -v grep
检查启动用户并kill掉进程,删除进程文件
kill -9 pid
rm -rf /var/run/rsyncd.pid
rm -rf /var/run/rsync.lock
rm -rf /var/run/rsyncd_bak.pid
rm -rf /var/run/rsync_bak.lock
#===========================
第三步:启动rsync进程:rsync --daemon --config=/etc/rsyncd.conf
echo -ne rsync –daemon --config=/etc/rsyncd.conf   >> /etc/rc.local #开机自启
#===========================
第四步:测试同步--采取
备用服务器创建同步目录:mkdir -p /cmiot/File_Receive
rsync -avz /cmiot/File_Receive/ rsyncuser@Bip::backup
输入密码成功同步后修改:echo"123456">/etc/rsync.passwd
如下命令就可以自动登录:
rsync -avz /cmiot/File_Receive/* rsyncuser@s206::backup --password-file=/etc/rsync.passwd
 
第四步:配置sersync
在AB服务器上传压缩文件sersync2.5.4_64bit_binary_stable_final.tar 至/usr/local/ 目录下,
用tar xvf sersync2.5.4_64bit_binary_stable_final.tar.gz进行解压,然后执行mv GNU-Linux-x86 sersync,
然后执行vim /usr/local/sersync/confxml.xml进行修改
vi /usr/local/sersync/confxml.xml
对如下内容进行修改:
<host hostip="localhost" port="8008"></host>
 
# 开启DUBUG模式
   #注:设置为true,开启debug模式,会在sersync正在运行的控制台,打印inotify事件与rsync同步命令。

<debug start="true"/>
# 设置要监控的事件
  #注:对于大多数应用,可以尝试把createFile(监控文件事件选项)设置为false来提高性能,减少 rsync通讯。因为拷贝文件到监控目录会产生create事件与close_write事件,所以如果关闭create事件,只监控文件拷贝结束时的事 件close_write,同样可以实现文件完整同步。
#如果将createFolder设为false,则不会对产生的目录进行监控,该目录下的子文件与子目录也不会被监控。
#默认情况下对创建文件(目录)事件与删除文件(目录)事件都进行监控,如果项目中不需要删除远程目标服务器的文件(目录),则可以将delete 参数设置为false,则不对删除事件进行监控。
<inotify>
<delete start="true"/>
<createFolder start="false"/>
<createFile start="false"/>
<closeWrite start="true"/>
<moveFrom start="true"/>
<moveTo start="true"/>
<attrib start="true"/>
<modify start="false"/>
</inotify>
<sersync>
 # 本地同步的目录路径
<localpath watch="/cmiot/File_Receive/">
  # 远程IP和rsync模块名
    <remote ip="对方ip" name="rsync_bak"/>
</localpath>
<rsync>
    <commonParams params="-artuz"/>
    <auth start="true" users="对方配置用户" passwordfile="本机登录对方密码"/>
    <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>
#=====================================================
启动sersync:/usr/local/sersync/sersync2 -d -r -o /usr/local/sersync/confxml.xml
1)在主服务器开启sersync守护进程,使sersync在后台运行,开启实时同步
./sersync -d
2)在开启实时监控之前对主服务器目录与远程目标机目录进行一次整体同步
./sersync -r
如果设置了过滤器,即在xml文件中,filter为true,则暂时不能使用-r参数进行整体同步。-r参数将会无效。
3)指定配置文件
./sersync -o XXX.xml
对于sersync使用可执行文件目录下的默认配置文件confxml.xml,如果需要使用另一个配置文件,可以使用-o参数指定其它配置文件。也可开启多个sersync守护进程分别使用不同的配置文件。
自启动:vim /etc/rc.d/rc.local在最后一行增加/usr/local/sersync/sersync2 -d -r -o  /usr/local/sersync/confxml.xml
 #==============================================================
同步测试:
在开启rsync和sersync进程后,在A或B其中一台服务器上从其他目录文件随意复制一个文件或文件夹,在被同步机上查看其文件大小或文件夹大小,文件个数
命令:

显示硬盘占用空间
du -h
lsblk

查看指定目录大小
du -sh /opt
查看各个目录大小
du -h --max-depth=1

当前目录的全部文件个数(包含子文件夹的文件)
ls -lR | grep "^-" | wc -l

按文件大小排序 由大到小 
ls -Slh

包含子目录文件

du -sh * | sort -n

posted @ 2019-11-04 12:58  星辰大海-sdifens  阅读(816)  评论(0编辑  收藏  举报