前言:
需求:3台服务器,其中1主2备,实现主服务器实时推送文件至2台备份服务器
一、为什么要用Rsync+sersync架构?
1、sersync是基于Inotify开发的,类似于Inotify-tools的工具
2、sersync可以记录下被监听目录中发生变化的(包括增加、删除、修改)具体某一个文件或某一个目录的名字,然后使用rsync同步的时候,只同步发生变化的这个文件或者这个目录。
二、Rsync+Inotify-tools与Rsync+sersync这两种架构有什么区别?
1、Rsync+Inotify-tools
(1):Inotify-tools只能记录下被监听的目录发生了变化(包括增加、删除、修改),并没有把具体是哪个文件或者哪个目录发生了变化记录下来;
(2):rsync在同步的时候,并不知道具体是哪个文件或者哪个目录发生了变化,每次都是对整个目录进行同步,当数据量很大时,整个目录同步非常耗时(rsync要对整个目录遍历查找对比文件),因此,效率很低。
2、Rsync+sersync
(1):sersync可以记录下被监听目录中发生变化的(包括增加、删除、修改)具体某一个文件或某一个目录的名字;
(2):rsync在同步的时候,只同步发生变化的这个文件或者这个目录(每次发生变化的数据相对整个同步目录数据来说是很小的,rsync在遍历查找比对文件时,速度很快),因此,效率很高。
小结:当同步的目录数据量不大时,建议使用Rsync+Inotify-tools;当数据量很大(几百G甚至1T以上)、文件很多时,建议使用Rsync+sersync。
三、sersync安装配置
3.1sersync同步逻辑图
当前版本的sersync依赖于rsync进行数据同步;
原理步骤:
在同步服务器(主服务器Master)上开启sersync服务,sersync负载监控配置路径中的文件系统事件变化;
调用rsync命令把更新的文件同步到目标服务器(S1 和 S2);
需要在主服务器配置sersync,在同步目标服务器配置rsync server(注意:是rsync服务)
同步原理:
1. 用户实时的往sersync服务器(M)上写入更新文件数据;
2. 此时需要在同步主服务器(M)上配置sersync服务;
3. 在S1 和S2上开启rsync守护进程服务,以同步拉取来自sersync服务器(M)上的数据;
通过rsync的守护进程服务后可以发现,实际上sersync就是监控本地的数据写入或更新事件;然后,在调用rsync客户端的命令,将写入或更新事件对应的文件通过rsync推送到目标服务器(S1 和S2),如此简单;
3.2 安装环境准备
1.系统资源列表
角色 |
服务器配置 |
操作系统版本 |
IP |
机器名 |
sersync服务(M) |
VM |
CentOS6.6 |
172.16.1.28 |
sersync |
rsync服务(S1) |
VM |
CentOS6.6 |
172.16.1.25 |
WEB1 |
rsync服务(S2) |
VM |
CentOS6.6 |
172.16.1.26 |
WEB2 |
2.系统环境 64位centos 6.5
3.3 配置同步服务器
1.slave上(备机)部署rsync服务 yum -y install rsync 多台目标服务器要求版本一样 3.0.6
2.部署rsync服务
确定S1和S2服务器版本一致,(S1,S2)上配置如下,yum安装完没有配置文件,需要添加如下:
vim /etc/rsyncd.conf #Rsync server uid = root gid = root use chroot = no # 安全相关 max connections = 2000 # 并发连接数 timeout = 600 # 超时时间(秒) pid file =/var/run/rsyncd.pid # 指定rsync的pid目录 lock file =/var/run/rsync.lock # 指定rsync的锁文件【重要】 log file = /var/log/rsyncd.log # 指定rsync的日志目录 ignore errors read only = false list = false hosts allow = 223.1.1.84 hosts deny = 0.0.0.0/32 auth users = rsync_backup secrets file =/etc/rsync.password ################################################# [mofiweb] # 模块 comment = mofiweb path = /wqdata/mofibak ################################################# #[bbs] #comment = bbs #path = /data/bbs/ ################################################# #[blog] #comment = blog #path = /data/blog/ #rsync_config____________end
特别提示: S1,S2的机器 同时部署上述服务;
上 面rsync服务的配置文件,表面允许sersync主服务器(ip:223.1.1.84)访问rsync同步模块名为 [mofiweb] ,将同步过来的文件分别放入对应的path指定的目录/wqdata/mofibak 下面; 如果有多台目标服务器,则每一台都需要进行类似的rsync服务配置,上面的uid、gid要换成您服务器的相应的同步用户;注意,rsync服务账户 (本文用的是root)要有对被同步目录(/data/)的写入更新权限;
3.创建rsync同步密码文件,并设置权限为600
echo "rsync_backup:lntz">/etc/rsync.password cat /etc/rsync.password chmod 600 /etc/rsync.password
4.启动守护进程,并写入开机自启动
[root@web1 ~]# rsync --daemon [root@web1 ~]# lsof -i:873 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rsync 1070 root 4u IPv4 17190189 0t0 TCP *:rsync (LISTEN) [root@web1 ~]# [root@web1 ~]# netstat -nulpt| grep rsync tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 1070/rsync 设置开机自启动【写入到/etc/rc.local里面】 [root@web1 ~]# vim /etc/rc.local # rsync server progress /usr/bin/rsync --daemon
5. 创建相关待同步的目录
mkdir -p /wqdata/mofibak 提示: 此步骤在S1,S2都要执行,否则rsync服务会因为没有PATH路径而无法启动
3.4 Master(主服务器)上配置rsync客户端
在master上配置rsync客户端相关权限认证:
echo "lntz">/etc/rsync.password chmod 600 /etc/rsync.password ll /etc/rsync.password
3.4.1 master(主服务器)上 手工测试rsync同步情况
特别提示:此步非常关键,如果测试不成功,后面的sersync配好了也不会同步数据;
1)分别创建待同步数据
mkdir -p /wqdata/mofi
里面随便建点文件或文件夹
2)执行同步命令
rsync -avzP /wqdata/mofi/ [email protected]::mofiweb/ --password-file=/etc/rsync.password sending incremental file list welcome_重命名_2015-4-7-16-20-49.html 345 100% 0.00kB/s 0:00:00 (xfer#1, to-check=1075/1110) sent 1877487 bytes received 555 bytes 751216.80 bytes/sec total size is 3215058996 speedup is 1711.92 提示: 在后面进行部署sersync之前,sersync主服务器上必须要确保手工可以把文件推送到S1,S2上, 这样后续sersync才能调用这些命令来自动推送 在推送前关闭iptables或打开873端口
3)推送的命令是在 master端(也就是 sersync服务器上)操作的,同步后查看S1,S2
进备份服务器S1备份文件夹查看,或用du 命令对比大小 ,或者直观点用xftp看列表
3.5Mster上开始部署sersync服务
1、下载sersync sersync2
.5.4_64bit_binary_stable_final.
tar
.gz
百度或
wget http://dd.jb51.net:81/201111/tools/sersync_64bit_binary_stable_final.tar.gz
2、配置sersync tar包解压并改名放到/usr/local/sersync
更改优化sersync配置文件:
a) 修改24--28行
24 <localpathwatch="/opt/tongbu"> # 定义本地要同步的目录 25 <remote ip="127.0.0.1"name="tongbu1"/> 26 <!--<remoteip="192.168.8.39" name="tongbu"/>--> # 同步到哪台机器上 tongbu模块rsync端模块名字 27 <!--<remoteip="192.168.8.40" name="tongbu"/>--> # 同步到哪台机器上 tongbu模块 28 </localpath>
b)修改31--34行,认证部分【rsync密码认证】
修改后的内容如下:
<rsync> <commonParamsparams="-artuz"/> <auth start="true"users="rsync_backup" passwordfile="/etc/rsync.password"/> <userDefinedPortstart="false" port="874"/><!-- port=874 --> <timeout start="true" time="100"/><!--timeout=100 --> <sshstart="false"/> </rsync> # ***这块注意,密码文件和几个true开关,否则后面同步不了。 修改内容为 rsync的密码文件以及 同步所使用的账号类似: rsync -avzP /data/www/[email protected]::www/ --password-file=/etc/rsync.password
c)修改37行
修改后如下:
<failLog path="/usr/local/sersync/logs/rsync_fail_log.sh"timeToExecute="60"/> <!--default every 60mins execute once--># 当同步失败后,日志记录到/usr/local/sersync/logs/rsync_fail_log.sh文件中, 并且每60分钟对失败的log进行重新同步
修改后的配置文件为:所有修改部分
<sersync> <localpath watch="/wqdata/mofi"> <remote ip="218.24.71.26" name="mofiweb"/> <!--<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_backup" passwordfile="/etc/rsync.password"/> <userDefinedPort start="false" port="874"/><!-- port=874 --> <timeout start="true" 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>
3、开启sersync守护进程同步数据
启动命令
/usr/local/sersync/sersync2 -d -r -o /usr/local/sersync/confxml.xml echo"PATH=$PATH:/usr/local/sersync/" >> /etc/profile source /etc/profile sersync2 如果执行不了进目录里执行
启动命令后返回结果如下为正常:
[root@localhost sersync]# sersync2 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 daemon thread num: 10 parse xml config file host ip : localhost host port: 8008 use rsync password-file : user is rsync_backup passwordfile is /etc/rsync.password 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 run the sersync: watch path is: /wqdata/mofi
补充: 多实例情况
1、配置多个confxml.xml文件(比如:www、bbs、blog....等等)
2、根据不同的需求同步对应的实例文件
/usr/local/sersync/sersync2
-d -o
/usr/local/sersync/www_confxml
.xml
/usr/local/sersync/sersync2
-d -o
/usr/local/sersync/bbs_confxml
.xml
/usr/local/sersync/sersync2
-d -o
/usr/local/sersync/blog_confxml
.xml
# 多实例初始化同步命令:
/usr/local/sersync/sersync2
-r-d -o
/usr/local/sersync/www_confxml
.xml
/usr/local/sersync/sersync2
-r-d -o
/usr/local/sersync/bbs_confxml
.xml
/usr/local/sersync/sersync2
-r-d -o
/usr/local/sersync/blog_confxml
.xml
/bin/cp
/etc/rc
.
local
/etc/rc
.local_$(data +%F)
cat
>>
/etc/rc
.
local
<<EOF
#sync data to 25 26
/usr/local/sersync/sersync2
-d -o
/usr/local/sersync/www_confxml
.xml
/usr/local/sersync/sersync2
-d -o
/usr/local/sersync/bbs_confxml
.xml
/usr/local/sersync/sersync2
-d -o
/usr/local/sersync/blog_confxml
.xml
EOF
优化与监控脚本 见 http://www.osyunwei.com/archives/7447.html
本文主要参考 http://liubao0312.blog.51cto.com/2213529/1677586