rsync+sersync实现两台web服务器的实时同步
- 一.环境准备
-
- 主服务器:
- 从服务器:
- 二.分别安装配置rsync,并测试手动免密备份
-
- 这里大概讲一下rsync的工作方式和原理
- 从服务器(备份端):
- 主服务器(数据端)
- 三.sersync的安装和配置
-
- 主web端(数据端)
- 从web服务器(备份端)
- 附件--编辑监控脚本
-
- 主服务器(数据端)
一.环境准备
服务器web为主要网站服务器,ip为192.168.8.141
[[email protected] ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:9f:3d:8c brd ff:ff:ff:ff:ff:ff
inet 192.168.8.141/24 brd 192.168.8.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::64db:1934:758e:9922/64 scope link noprefixroute
valid_lft forever preferred_lft forever
服务器web-bak为备份网站服务器,ip为192.168.8.142
[[email protected] ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:12:08:9b brd ff:ff:ff:ff:ff:ff
inet 192.168.8.142/24 brd 192.168.8.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::a3f3:eac0:1517:cf2/64 scope link noprefixroute
valid_lft forever preferred_lft forever
inet6 fe80::64db:1934:758e:9922/64 scope link tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever
分别安装apache,并测试正常
主服务器:
[[email protected] ~]# yum -y install httpd
[[email protected] ~]# yum -y install net-tools
[[email protected] ~]# echo "this is main" > /var/www/html/index.html
[[email protected] ~]# systemctl restart httpd
[[email protected] ~]# curl 192.168.8.141
this is main
从服务器:
[[email protected] ~]# yum -y install httpd
[[email protected] ~]# yum -y install net-tools
[[email protected] ~]# echo "this is backup" > /var/www/html/index.html
[[email protected] ~]# systemctl restart httpd
[[email protected] ~]# curl 192.168.8.142
this is backup
二.分别安装配置rsync,并测试手动免密备份
这里大概讲一下rsync的工作方式和原理
rsync是一个开源的文件同步软件,主要工作在linux,但是有跨windows平台的cwrsync.
主要同步方式为推和拉两种:
推,顾名思义,是作为数据产生端主动把需要同步的数据推送给备份端,这种方式主要用于和sersync搭配,实现实时自动同步数据,比如主从web服务器(本文主讲)
拉,一般是指数据备份端去拉,数据产生端数据,一般用于,周期性的同步(通过任务计划),数据同步即时性要求不是很高的场景
从服务器(备份端):
[[email protected] ~]# yum -y install rsync
[[email protected] ~]# useradd -M -s /sbin/nologin/ rsync #创建一个不能登陆,没有家目录的本地用户rsync,用于运行rsync进程
[[email protected] ~]# chown rsync:rsync -R /var/www/html #将备份目录,也是从web服务器的web目录的属主和属组改为rsync,此步不做,同步会报错
[[email protected] ~]# vim /etc/rsyncd.conf
[[email protected] ~]# cat /etc/rsyncd.conf
uid = rsync #启动rsync进程的属主
gid = rsync #启动rsync进程的属组
address = 192.168.8.142 #监听IP,如果是多IP主机,则只能通过该IP访问
port = 9873 #监听端口,建议改高位端口,以免被占用,默认为873
hosts allow = 192.168.8.0/24 #允许同步的网段
use chroot = yes #用户不能切出指定的备份目录
max connections = 5 #最大连接数
pid file = /var/run/rsyncd.pid #指定存储进程号的文件
lock file = /var/run/rsyncd.lock #指定锁定进程的文件
log file = /var/log/rsyncd.log #指定日志存放文件
motd file = /etc/rsyncd.motd #指定数据同步时的欢迎消息
list = yes #是否允许查看模块信息
[web-bak] #模块名,同步时需要和此处对应
path = /var/www/html #指定同步时存储到本地的路径
comment = web-bak #备注信息,自定义
read only = false #关闭只读
auth only = backuper #指定能同步的虚拟账户为backuper(非系统用户)
secrets file = /etc/rsyncd.passwd #指定存储虚拟用户及其密码的文件
[[email protected] ~]# echo "backuper:123" > /etc/rsyncd.passwd #创建同步时的用户名和密码
[[email protected] ~]# chmod 600 /etc/rsyncd.passwd #设定密码文件权限,只能设置600 或 700
[[email protected] ~]# echo "it's backuping" > /etc/rsyncd.motd #自定义同步时的欢迎消息
[[email protected] ~]# rsync --daemon --config=/etc/rsyncd.conf #--daemon为后台启动
# pkill -9 rsync && rm -rf /var/run/rsyncd.pid #此命令为关闭软件,如果不跟后面删除PID文件,下次启动会报错PID文件已存
[[email protected] ~]# netstat -anput |grep rsync #查看是否运行正常,监听端接口信息
tcp 0 0 192.168.8.142:9873 0.0.0.0:* LISTEN 3798/rsync
至此备份端已经配置启动完成,如果有防火墙和selinux,记得开对应的端口,这里就不多讲
主服务器(数据端)
[[email protected] ~]# yum -y install rsync
[[email protected] ~]# ls /var/www/html #查看确认需要备份的目录
index.html
[[email protected] ~]# echo "123" > /etc/rsyncd.passwd #创建并写入,备份时需要的用户密码文件
[[email protected] ~]# chmod 600 /etc/rsyncd.passwd #给用户密码文件赋权
[[email protected] ~]# rsync -rlvz --delete /var/www/html/ [email protected]::web-bak --password-file=/etc/rsyncd.passwd --port 9873
it's backuping
sending incremental file list
index.html
sent 108 bytes received 41 bytes 298.00 bytes/sec
total size is 13 speedup is 0.09
至此,主从服务器之间的免密传输已经完成
三.sersync的安装和配置
这是serync的64位下载地址,其他版本请自行搜索
主web端(数据端)
[[email protected] ~]# tar xvf sersync2.5.4_64bit_binary_stable_final.tar.gz
GNU-Linux-x86/
GNU-Linux-x86/sersync2
GNU-Linux-x86/confxml.xml
[[email protected] ~]# mv GNU-Linux-x86/ /opt/sersync
[[email protected] ~]# cd /opt/sersync/
[[email protected] sersync]# cp confxml.xml confxml_web1.xml #根据模板创建配置文件,如果是多web的服务器,就要创建多个配置文件
[[email protected] sersync]# vim confxml_web1.xml #修改24~32行对应参数
...
24 <localpath watch="/var/www/html">
25 <remote ip="192.168.8.142" name="web-bak"/>
26 <!--<remote ip="192.168.8.39" name="tongbu"/>-->
27 <!--<remote ip="192.168.8.40" name="tongbu"/>-->
28 </localpath>
29 <rsync>
30 <commonParams params="-rluz"/>
31 <auth start="true" users="backuper" passwordfile="/etc/rsyncd.passwd"/>
32 <userDefinedPort start="true" port="9873"/><!-- port=874 -->
...
[[email protected] sersync]# /opt/sersync/sersync2 -d -r -o /opt/sersync/confxml_web1.xml #运行sersync程序
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
option: -d run as a daemon
option: -r rsync all the local files to the remote servers before the sersync work
option: -o config xml name: /opt/sersync/confxml_web1.xml
daemon thread num: 10
parse xml config file
host ip : localhost host port: 8008
daemon start,sersync run behind the console
use rsync password-file :
user is backuper
passwordfile is /etc/rsyncd.passwd
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
------------------------------------------
rsync the directory recursivly to the remote servers once
working please wait...
execute command: cd /var/www/html && rsync -rluz -R --delete ./ --port=9873 [email protected]::web-bak --password-file=/etc/rsyncd.passwd >/dev/null 2>&1
run the sersync:
watch path is: /var/www/html
[[email protected] sersync]# ps aux |grep sersync
root 3805 0.0 0.0 92324 716 ? Ssl 18:56 0:00 /opt/sersync/sersync2 -d -r -o /opt/sersync/confxml_web1.xml
root 3822 0.0 0.0 112704 960 pts/0 R+ 18:57 0:00 grep --color=auto sersync
[[email protected] sersync]# touch /var/www/html/test.txt #创建一个测试文件,看从web服务器是否同步过去
从web服务器(备份端)
[[email protected] ~]# ls /var/www/html/ #看到已经同步过来
index.html test.txt
至此,sersync+rsync实时同步已经搭建完成
附件–编辑监控脚本
为了保证serysnc的随时运行,可以写一个监控sersync运行的脚本,利用任务计划,周期性的检查
主服务器(数据端)
[[email protected] ~]# vim check_sersync.sh
[[email protected] ~]# cat check_sersync.sh
#!/bin/bash
SERYNC="/opt/sersync/sersync2"
CONFFILE1="/opt/sersync/confxml_web1.xml"
STATUS=$(ps aux|grep 'confxml_web1.xml'|grep -v 'grep'|wc -l) #备注一下,如果多目录需要备份的话,则需要通过筛选配置文件的方式,不要通过进程名称筛选
if [ $STATUS -eq 0 ];then
$SERSYNC -d -r -o $CONFFILE
else
exit 0;
再提供一个多目录备份的脚本供大家参考
SERYNC="/opt/sersync/sersync2"
CONFFILE1="/opt/sersync/confxml_web1.xml"
CONFFILE2="/opt/sersync/confxml_web2.xml"
STATUS1=$(ps aux|grep 'confxml_web1.xml'|grep -v 'grep'|wc -l)
STATUS2=$(ps aux|grep 'confxml_web2.xml'|grep -v 'grep'|wc -l)
if [ $STATUS1 -eq 0 ];then
$SERSYNC -d -r -o $CONFFILE1
elif [ $STATUS2 -eq 0 ];then
$SERSYNC -d -r -o $CONFFILE2
else
exit 0;
将脚本写入计划任务
该任务计划意思是每小时的第一分钟运行一次脚本
[[email protected] ~]# echo "1 * * * * /usr/bin/sh /root/check_sersync.sh" > /var/spool/cron/root
[[email protected] ~]# crontab -l
1 * * * * /usr/bin/sh /root/check_sersync.sh