Rsync+sersync实现数据实时同步
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rsync+sersync实现数据实时同步相关的知识,希望对你有一定的参考价值。
[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...] [[email protected]]HOST:SRC... [DEST]
推送: rsync [OPTION...] SRC... [[email protected]]HOST:DEST
通过rsync守护进程访问:
拉取: rsync [OPTION...] [[email protected]]HOST::SRC... [DEST]
rsync [OPTION...] rsync://[[email protected]]HOST[:PORT]/SRC... [DEST]
推送: rsync [OPTION...] SRC... [[email protected]]HOST::DEST
rsync [OPTION...] SRC... rsync://[[email protected]]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 = no 改为 disable = yes
#启动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 = no 改为 disable = yes
#启动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/目录下准备这些文件
[[email protected] nodejs]# ls
xxx0 xxx1 xxx2 yy0 yy1 yy2
rsync -avH --port=873 --progress --delete /home/nodejs/ [email protected]::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/
[[email protected] 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 下查看文件是否正常同步。
正常同步,说明配置成功了。
以上是关于Rsync+sersync实现数据实时同步的主要内容,如果未能解决你的问题,请参考以下文章
Linux Debian8 Rsync+Sersync实现数据实时同步
[转帖]sersync基于rsync+inotify实现数据实时同步