企业集群架构-05-Sersync
Sersync
sersync
介绍请参阅github上的说明。
实时同步工具选择
rsync + inotify
适合少量文件同步,麻烦。同步大文件太慢,遍历扫描,非常影响效率。sersync
适合大量小文件同步。配置简单,多线程同步,同步快。
实时同步案例
实现web
上传视频文件,实际是写入NFS
存储,当NFS数据更新时,会实时同步到备份服务器backup
分析:
- web上传视频至NFS存储/data目录
- 将NFS的/data目录数据实时同步到备份服务器的/data目录
准备:
角色 | 外网IP(NAT) | 内网IP(LAN) | 安装工具 |
---|---|---|---|
web01 | eth0:10.0.0.7 | eth1:172.16.1.7 | nfs-utils + httpd + php |
nfs | eth0:10.0.0.31 | eth1:172.16.1.31 | nfs-utils + rsync + inotify-tools + sersync |
backup | eth0:10.0.0.41 | eth1:172.16.1.41 | rsync + nfs-utils |
注意: web01服务器需要上传文件代码一份
backup服务器配置
- 安装
rsync
和nfs-utils
[root@backup ~]# yum -y install rsync nfs-utils
- 配置
rsync
[root@backup ~]# cat /etc/rsyncd.conf
uid = www
gid = www
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = rsync_backup
secrets file = /etc/rsync.password
log file = /var/log/rsyncd.log
#####################################
[data]
comment = /var/www/html in 172.16.1.7
path = /data
-
根据配置文件创建对应需求:
- 创建对应密码文件并授权
- 创建对应用户
- 创建对应目录并授权
[root@backup ~]# echo "rsync_backup:123456" > /etc/rsync.password
[root@backup ~]# chmod 600 /etc/rsync.password
[root@backup ~]# groupadd -g 666 www
[root@backup ~]# useradd -u 666 -g 666 www
[root@backup ~]# mkdir -p /data
[root@backup ~]# chown -R www.www /data
- 配置nfs共享
[root@backup ~]# cat /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
- 启动
rsync
和nfs
服务,并加入开机自启
[root@backup ~]# systemctl restart nfs rsyncd
[root@backup ~]# systemctl enable nfs rsyncd
- 验证共享目录和端口
[root@backup ~]# cat /var/lib/nfs/etab
/data 172.16.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=666,anongid=666,sec=sys,rw,secure,root_squash,all_squash)
[root@backup ~]# netstat -4tupnl | grep "rpc\|-"
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:39976 0.0.0.0:* LISTEN 24969/rpc.statd
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 25446/rpcbind
tcp 0 0 0.0.0.0:20048 0.0.0.0:* LISTEN 25458/rpc.mountd
tcp 0 0 0.0.0.0:33718 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:2049 0.0.0.0:* LISTEN -
udp 0 0 0.0.0.0:111 0.0.0.0:* 25446/rpcbind
udp 0 0 0.0.0.0:48407 0.0.0.0:* -
udp 0 0 0.0.0.0:20048 0.0.0.0:* 25458/rpc.mountd
udp 0 0 0.0.0.0:47703 0.0.0.0:* 24969/rpc.statd
udp 0 0 0.0.0.0:604 0.0.0.0:* 25446/rpcbind
udp 0 0 127.0.0.1:977 0.0.0.0:* 24969/rpc.statd
udp 0 0 0.0.0.0:2049 0.0.0.0:* -
nfs服务器配置
- 安装
nfs-utils
,inotify-tools
和rsync
[root@nfs ~]# yum -y install rsync inotify-tools nfs-utils
- 根据backup服务器配置文件创建对应需求:
- 创建对应密码文件并授权,文件中只有密码!!
- 创建统一用户与backup服务器对应
- 创建共享目录并授权
[root@nfs ~]# echo "123456" > /etc/rsync.password
[root@nfs ~]# chmod 600 /etc/rsync.password
[root@nfs ~]# groupadd -g 666 www
[root@nfs ~]# useradd -u 666 -g 666 www
[root@nfs ~]# mkdir -p /data
[root@nfs ~]# chown -R www.www /data
- 测试手动推送
[root@nfs ~]# rsync -avz --password-file=/etc/rsync.password /data rsync_backup@172.16.1.41::data
- 配置nfs共享
[root@nfs ~]# cat /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
- 启动
nfs
服务,并加入开机自启
[root@nfs ~]# systemctl restart nfs
[root@nfs ~]# systemctl enable nfs
- 验证共享目录和端口
[root@nfs ~]# cat /var/lib/nfs/etab
/data 172.16.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=666,anongid=666,sec=sys,rw,secure,root_squash,all_squash)
[root@nfs ~]# netstat -4tupnl | grep "rpc\|-"
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:39976 0.0.0.0:* LISTEN 24969/rpc.statd
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 25446/rpcbind
tcp 0 0 0.0.0.0:20048 0.0.0.0:* LISTEN 25458/rpc.mountd
tcp 0 0 0.0.0.0:33718 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:2049 0.0.0.0:* LISTEN -
udp 0 0 0.0.0.0:111 0.0.0.0:* 25446/rpcbind
udp 0 0 0.0.0.0:48407 0.0.0.0:* -
udp 0 0 0.0.0.0:20048 0.0.0.0:* 25458/rpc.mountd
udp 0 0 0.0.0.0:47703 0.0.0.0:* 24969/rpc.statd
udp 0 0 0.0.0.0:604 0.0.0.0:* 25446/rpcbind
udp 0 0 127.0.0.1:977 0.0.0.0:* 24969/rpc.statd
udp 0 0 0.0.0.0:2049 0.0.0.0:* -
-
安装
sersync
- 创建文件存放目录并进入
[root@nfs ~]# mkdir /usr/local/sersync [root@nfs ~]# cd /usr/local/sersync
-
下载
sersync
到Linux-
可以使用wget在线下载软件包
[root@nfs sersync]# wget https://raw.githubusercontent.com/wsgzao/sersync/master/sersync2.5.4_64bit_binary_stable_final.tar.gz
-
也可以使用rz拉取Windows上事先下载的软件包
[root@nfs sersync]# rz
-
-
解压软件包,每个监控目录创建一个对应的配置文件
[root@nfs sersync]# tar xf sersync2.5.4_64bit_binary_stable_final.tar.gz [root@nfs sersync]# cp confxml.xml backupconf.xml
-
配置
sersync
详解
[root@nfs sersync]# vim backupconf.xml
5 <fileSystem xfs="true"/> <!-- 文件系统 -->
6 <filter start="false"> <!-- 排除不想同步的文件-->
7 <exclude expression="(.*)\.svn"></exclude>
8 <exclude expression="(.*)\.gz"></exclude>
9 <exclude expression="^info/*"></exclude>
10 <exclude expression="^static/*"></exclude>
11 </filter>
12 <inotify> <!-- 监控的事件类型 -->
13 <delete start="true"/>
14 <createFolder start="true"/>
15 <createFile start="true"/>
16 <closeWrite start="true"/>
17 <moveFrom start="true"/>
18 <moveTo start="true"/>
19 <attrib start="false"/>
20 <modify start="false"/>
21 </inotify>
22
23 <sersync>
24 <localpath watch="/data"> <!-- 监控的目录 -->
25 <remote ip="172.16.1.41" name="data"/> <!-- backup的IP以及模块 -->
26 <!--<remote ip="192.168.8.39" name="tongbu"/>-->
27 <!--<remote ip="192.168.8.40" name="tongbu"/>-->
28 </localpath>
29 <rsync> <!-- rsync的选项 -->
30 <commonParams params="-az"/>
31 <auth start="true" users="rsync_backup" passwordfile="/etc/rsync.password"/>
32 <userDefinedPort start="false" port="874"/><!-- port=874 -->
33 <timeout start="true" time="100"/><!-- timeout=100 -->
34 <ssh start="false"/>
35 </rsync>
<!-- 每60分钟执行一次同步-->
36 <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--def
ault every 60mins execute once-->
- 查看
sersync
启动参数
[root@nfs sersync]# ./sersync2 -h
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
_______________________________________________________
参数-d:启用守护进程模式
参数-r:在监控前,将监控目录与远程主机用rsync命令推送一遍
参数-n: 指定开启守护线程的数量,默认为10个
参数-o:指定配置文件,默认使用confxml.xml文件
参数-m:单独启用其他模块,使用 -m refreshCDN 开启刷新CDN模块
参数-m:单独启用其他模块,使用 -m socket 开启socket模块
参数-m:单独启用其他模块,使用 -m http 开启http模块
不加-m参数,则默认执行同步程序
- 启动
sersync
服务守护进程
[root@nfs ~]# /usr/local/sersync/sersync2 -dro /usr/local/sersync/backupconf.xml
注意: 如果需要同步多个目录,那么需要启动多个守护进程指定多套配置文件
web01服务器配置
- 安装
httpd
,php
和nfs-utils
[root@web01 ~]# yum -y install httpd php nfs-utils
- 挂载nfs服务器提供的共享目录
[root@web01 ~]# mount -t nfs 172.16.1.31:/data /var/www/html/
- 进入
/var/www/html/
目录,使用rz拉取Windows上事先准备的文件上传代码包到Linux,最后解压
[root@web01 ~]# cd /var/www/html/
[root@web01 html]# rz
[root@web01 html]# tar xf upload.tar.gz
- 启动httpd服务,并设为开机启动
[root@web01 ~]# systemctl start httpd
[root@web01 ~]# systemctl enable httpd
- 使用浏览器打开网页http://10.0.0.7/,测试文件上传功能
- 创建统一用户www
[root@web01 ~]# groupadd -g 666 www
[root@web01 ~]# useradd -u 666 -g 666 www
- 让httpd也使用www用户,修改httpd配置文件
[root@web01 ~]# vi /etc/httpd/conf/httpd.conf
... ...
User www # 默认User apache
Group www # 默认Group apache
... ...
- 默认上传文件最大2M,修改为2000M,需要修改php的配置文件
/etc/php.ini
[root@web01 ~]# vi /etc/php.ini
... ...
upload_max_filesize = 2000M # 上传文件最大限制,默认2M
... ...
post_max_size = 2000M # 端口数据最大限制,默认8M
... ...
提示: httpd服务出现问题,可以查看报错信息
[root@web01 ~]# cat /var/log/httpd/error_log
解决NFS单点故障
如果nfs服务器故障,将web客户端挂载的nfs服务器共享目录,替换成backup服务器共享目录
- 前提条件: nfs和backup两台服务器的nfs服务配置应该保持一样(nfs配置,nfs共享目录,nfs共享目录的权限,
rpcbind
和nfs
服务都启动) - 进行一次数据推送,然后模拟nfs故障(挂起虚拟机)
- web01服务器强制卸载
172.16.1.31:/data
[root@web01 ~]# umount -lf /var/www/html
- web01服务器挂载
172.16.1.41:/data
[root@web01 ~]# mount -t nfs 172.16.1.41:/data /var/www/html
- 浏览器测试web服务http://10.0.0.7/是否恢复
实时同步demo
用户上传文件-->web-->写入-->nfs存储-->inotify-->action-->rsync--->backup
用户上传文件-->web-->写入-->nfs存储(本地)--->实时的同步到-->存储(云端)
web-->卸载nfs存储(本地)--->重新挂载存储(云端)
graph TD
A[用户] --> |上传文件|B[web]
B[web] --> |写入|C[nfs存储]
C[nfs存储] --> D(inotify)
D(inotify) --> |action|E(rsync)
E(rsync) --> F[backup]
G[用户] --> |上传文件|H[web]
H[web] --> |写入|I[nfs存储-本地]
I[nfs存储-本地] --> |实时的同步到|J[存储-云端]
K[当nfs存储-本地故障]
L[用户] --> |上传文件|M[web]
M[web] --> |卸载|N[nfs存储-本地]
M[web] --> |重新挂载|O[存储-云端]
参考文章:基于sersync海量文件实时同步