[toc]

背景

新公司需要我做代码发布的活,一开始觉得没什么,不就是把文件丢上去重启一下服务就好了嘛。结果每天发布的次数可以达到十几次。像nodejs的,有3台服务器,每次都要传3次,然后做3次重启操作。大好的青春不能浪费在这上面,于是动了文件同步的心思。
网上说当同步的目录数据量不大时,建议使用Rsync+Inotify-tools;当数据量很大(几百G甚至1T以上)、文件很多时,建议使用Rsync+sersync。于是直接上 Rsync+sersync

简介

1.什么是Rsync?

Rsync(Remote Synchronize)是一款开源的、快速的、多功能的、可以实现全量及增量的本地或远程数据同步备份的优秀工具,并且支持多种操作系统平台运行。

官网文档:https://rsync.samba.org/ftp/rsync/rsync.html

2.Rsync简介

Rsync具有本地与远程两台主机之间的数据快速复制同步镜像、远程备份等功能,该功能类似scp,但是优于scp功能,还具有本地不同分区目录之间全量及增量复制数据。

Rsync同步数据镜像时,通过“quick check”算法,仅同步大小或最后修改时间发生变化的文件或目录,当然也可以根据权限,属主等属性变化的同步,所以可以实现快速同步。

rsync 具有如下的基本特性:

可以镜像保存整个目录树和文件系统
可以很容易做到保持原来文件的权限、时间、软硬链接等
无须特殊权限即可安装
优化的流程,文件传输效率高
可以使用 rsh、ssh 方式来传输文件,当然也可以通过直接的 socket 连接
支持匿名传输,以方便进行网站镜象

3.Rsync命令格式

本地: rsync [OPTION...] SRC... [DEST]

通过shell远程访问:

拉取: rsync [OPTION...] [USER@]HOST:SRC... [DEST]

推送: rsync [OPTION...] SRC... [USER@]HOST:DEST

通过rsync守护进程访问:

拉取: rsync [OPTION...] [USER@]HOST::SRC... [DEST]

rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]

推送: rsync [OPTION...] SRC... [USER@]HOST::DEST

rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST

4.什么Sersync?

sersync是基于Inotify开发的,类似于Inotify-tools的工具;

sersync可以记录下被监听目录中发生变化的(包括增加、删除、修改)具体某一个文件或某一个目录的名字;

rsync在同步的时候,只同步发生变化的这个文件或者这个目录(每次发生变化的数据相对整个同步目录数据来说是很小的,rsync在遍历查找比对文件时,速度很快),因此,效率很高;
注:当同步的目录数据量不大时,建议使用Rsync+Inotify-tools;当数据量很大(几百G甚至1T以上)、文件很多时,建议使用Rsync+sersync。

Rsync安装及配置

环境
ip 系统版本 关系
192.168.153.12 CentOS6.9 源服务器
192.168.153.13 CentOS6.9 目标服务器
目的

把192.168.153.12这台源服务器上的/home/nodejs/目录实时同步到192.168.153.13目标服务器上的 /home/nodejs 。

具体操作

前提:两台机器都要关闭selinux,iptables。

在目标服务器 192.168.153.13 上操作。

#安装rsync,xinetd。CentOS下使用xinetd管理rsync
yum install rsync xinetd -y
#编辑rsync文件,设置rsync开机启动
vim /etc/xinetd.d/rsync
disable = yes 改为  disable = no
#启动xinetd服务的同时,rsync也启动了。
/etc/init.d/xinetd start
chkconfig xinetd on

#创建测试文件夹
mkdir -p /home/nodejs

#创建 rsync 配置文件
vim /etc/rsyncd.conf 
#日志文件
log file = /var/log/rsyncd.log
#pid文件
pidfile = /var/run/rsyncd.pid
#锁文件
lock file = /var/run/rsync.lock
#密码文件
secrets file = /etc/rsync.pass 

#自定义一个名称,认证模块名
[nodejs]
#要同步的目录  
path = /home/nodejs/
#注释,要与自定义名称一致
comment = nodejs
#设置rsync运行权限
uid = root
gid = root
#默认端口
port=873
#如果"use chroot"指定为true,那么rsync在传输文件以前首先chroot到path参数所指定的目录下。这样做的原因是实现额外的安全防护,但是缺点是需要以root权限,并且不能备份指向外部的符号连接所指向的目录文件。默认情况下chroot值为true.但是这个一般不需要,我选择no或false
use chroot = no
#是否允许可读可写
read only = no
#是否允许列表
list = no           
#最大连接数
max connections = 200
#超时时间
timeout = 600
#认证的用户名
auth users = xx 
#允许访问的ip,可填写192.168.153.0/24
hosts allow = 192.168.153.12
#默认的,不要动了。
hosts deny = 0.0.0.0/32

#创建用户认证文件
vim /etc/rsync.pass
#格式, 用户名:密码 ,可以设置多个,每行一个
xx:abc123

#设置文件权限
chmod 600 /etc/rsyncd.conf
chmod 600 /etc/rsync.pass

#启动rsync
/etc/init.d/xinetd restart

在源服务器192.168.153.12 上操作

#安装rsync,xinetd。CentOS下使用xinetd管理rsync
yum install rsync xinetd -y
#编辑rsync文件,设置rsync开机启动
vim /etc/xinetd.d/rsync
disable = yes 改为  disable = no
#启动xinetd服务的同时,rsync也启动了。
/etc/init.d/xinetd start
chkconfig xinetd on

#创建测试文件夹
mkdir -p /home/nodejs
#创建密码认证文件
vim /etc/passwd.txt
#源服务器就只设置密码,不需要填用户
abc123
#设置权限
chmod 600 /etc/passwd.txt

#测试源服务器192.168.153.12 到目标服务器192.168.153.13的数据同步
#在/home/nodejs/目录下准备这些文件
[root@cs6 nodejs]# ls
xxx0  xxx1  xxx2  yy0  yy1  yy2

rsync -avH --port=873 --progress --delete  /home/nodejs/ xx@192.168.153.13::nodejs --password-file=/etc/passwd.txt

#然后到目标服务器192.168.153.13 /home/nodejs 目录下查看是否同步了这些文件夹,如果有,rsync同步完成。

sersync安装及配置

在源服务器上操作。

#查看服务器内核是否支持inotify,其实这一步可以省略,基本没有不通过的
ll /proc/sys/fs/inotify
total 0
-rw-r--r-- 1 root root 0 May 23 16:11 max_queued_events
-rw-r--r-- 1 root root 0 May 23 16:11 max_user_instances
-rw-r--r-- 1 root root 0 May 23 16:11 max_user_watches

#修改inotify参数,默认内核参数值太小
vim /etc/sysctl.conf
#inotify
fs.inotify.max_queued_events=99999999
fs.inotify.max_user_watches=99999999
fs.inotify.max_user_instances=65535

参数说明:

max_queued_events:

inotify队列最大长度,如果值太小,会出现"** Event Queue Overflow **"错误,导致监控文件不准确

max_user_watches:

要同步的文件包含多少目录,可以用:find /home/www.osyunwei.com -type d | wc -l 统计,必须保证max_user_watches值大于统计结果(这里/home/www.osyunwei.com为同步文件目录)

max_user_instances:

每个用户创建inotify实例最大值

#安装sersync
http://sersync.sourceforge.net/ 软件官网
下载需要×××,我给上传到百度云了,欢迎下载。
链接:https://pan.baidu.com/s/1-NcvYkyWBb7k3Gln8KZxlA 密码:ovd9

把 sersync2.5.4_64bit_binary_stable_final.tar.gz 上传到 /usr/src/目录下。
cd /usr/src/
tar zxvf sersync2.5.4_64bit_binary_stable_final.tar.gz
mv GNU-Linux-x86/ /usr/local/sersync

#配置 sersync
cd /usr/local/sersync/
[root@cs6 sersync]# ls
confxml.xml   sersync2
# 编辑xml文件,先备份
cp confxml.xml{,.bak20180523}
vim confxml.xml

24     <sersync>
25         <localpath watch="/home/nodejs/">
26             <remote ip="192.168.153.13" name="nodejs"/>

32             <auth start="true" users="xx" passwordfile="/etc/passwd.txt"/>

 38         <crontab start="true" schedule="600"><!--600mins-->

参数说明:
localpath wath="/home/nodejs" #源服务器同步目录
<remote ip="192.168.153.13" name="nodejs"/> # 目标服务器ip,同步模块
<auth start="true" users="xx" passwordfile="/etc/passwd.txt"/> # users="xx" #使用xx去同步
passwordfile="/etc/passwd.txt" #使用的目标服务器密码文件为
start="true" schedule="600"
设置为true,每隔600分钟全盘同步一次

#设置开机启动
vim /etc/rc.d/rc.local
/usr/local/sersync/sersync2 -d -r -o  /usr/local/sersync/confxml.xml

#添加监控脚本
vim /home/check_sersync.sh
#!/bin/bash

sersync="/usr/local/sersync/sersync2"
confxml="/usr/local/sersync/confxml.xml"
status=$(ps aux|grep 'sersync2'|grep -v grep|wc -l)

if [[ $status -eq 0 ]]; then
    $sersync -d -r -o $confxml &
else
    exit 0;
fi

#添加执行权限
chmod +x /home/check_sersync.sh

#设置定时任务
crontab -e 
#每隔两分钟执行一次
*/2 * * * * /bin/bash /home/check_sersync.sh > /dev/null 2>&1 

#重启定时任务
/etc/init.d/crond restart

测试同步

在源服务器上 /home/nodejs/ 下放置一个redis的安装包及解压包。

ls -l 
total 1628
drwxrwxr-x  6 root root    4096 Dec 18  2015 redis-3.0.6
-rw-r--r--  1 root root 1372648 May  8 17:52 redis-3.0.6.tar.gz
等两分钟以后去目标服务器 /home/nodejs 下查看文件是否正常同步。
正常同步,说明配置成功了。