企业集群架构-05-Sersync

Sersync

sersync介绍请参阅github上的说明。

实时同步工具选择

  • rsync + inotify 适合少量文件同步,麻烦。同步大文件太慢,遍历扫描,非常影响效率。
  • sersync 适合大量小文件同步。配置简单,多线程同步,同步快。

实时同步案例

实现web上传视频文件,实际是写入NFS存储,当NFS数据更新时,会实时同步到备份服务器backup


分析:

  1. web上传视频至NFS存储/data目录
  2. 将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服务器配置

  1. 安装rsyncnfs-utils
[root@backup ~]# yum -y install rsync nfs-utils
  1. 配置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
  1. 根据配置文件创建对应需求:

    • 创建对应密码文件并授权
    • 创建对应用户
    • 创建对应目录并授权
[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
  1. 配置nfs共享
[root@backup ~]# cat /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
  1. 启动rsyncnfs服务,并加入开机自启
[root@backup ~]# systemctl restart nfs rsyncd
[root@backup ~]# systemctl enable nfs rsyncd
  1. 验证共享目录和端口
[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服务器配置

  1. 安装nfs-utilsinotify-toolsrsync
[root@nfs ~]# yum -y install rsync inotify-tools nfs-utils
  1. 根据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
  1. 测试手动推送
[root@nfs ~]# rsync -avz --password-file=/etc/rsync.password /data rsync_backup@172.16.1.41::data
  1. 配置nfs共享
[root@nfs ~]# cat /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
  1. 启动nfs服务,并加入开机自启
[root@nfs ~]# systemctl restart nfs
[root@nfs ~]# systemctl enable nfs
  1. 验证共享目录和端口
[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:*                           - 
  1. 安装sersync

    1. 创建文件存放目录并进入
    [root@nfs ~]# mkdir /usr/local/sersync
    [root@nfs ~]# cd /usr/local/sersync
    
    1. 下载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
        
    2. 解压软件包,每个监控目录创建一个对应的配置文件

    [root@nfs sersync]# tar xf sersync2.5.4_64bit_binary_stable_final.tar.gz
    [root@nfs sersync]# cp confxml.xml backupconf.xml
    
  2. 配置sersync详解

img

[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-->
  1. 查看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参数,则默认执行同步程序
  1. 启动sersync服务守护进程
[root@nfs ~]# /usr/local/sersync/sersync2 -dro /usr/local/sersync/backupconf.xml

注意: 如果需要同步多个目录,那么需要启动多个守护进程指定多套配置文件


web01服务器配置

  1. 安装httpdphpnfs-utils
[root@web01 ~]# yum -y install httpd php nfs-utils
  1. 挂载nfs服务器提供的共享目录
[root@web01 ~]# mount -t nfs 172.16.1.31:/data /var/www/html/
  1. 进入/var/www/html/目录,使用rz拉取Windows上事先准备的文件上传代码包到Linux,最后解压
[root@web01 ~]# cd /var/www/html/
[root@web01 html]# rz
[root@web01 html]# tar xf upload.tar.gz
  1. 启动httpd服务,并设为开机启动
[root@web01 ~]# systemctl start httpd
[root@web01 ~]# systemctl enable httpd
  1. 使用浏览器打开网页http://10.0.0.7/,测试文件上传功能
  2. 创建统一用户www
[root@web01 ~]# groupadd -g 666 www
[root@web01 ~]# useradd -u 666 -g 666 www
  1. 让httpd也使用www用户,修改httpd配置文件
[root@web01 ~]# vi /etc/httpd/conf/httpd.conf
... ...
User www    # 默认User apache
Group www   # 默认Group apache
... ...
  1. 默认上传文件最大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服务器共享目录


  1. 前提条件: nfs和backup两台服务器的nfs服务配置应该保持一样(nfs配置,nfs共享目录,nfs共享目录的权限,rpcbindnfs服务都启动)
  2. 进行一次数据推送,然后模拟nfs故障(挂起虚拟机)
  3. web01服务器强制卸载172.16.1.31:/data
[root@web01 ~]# umount -lf /var/www/html
  1. web01服务器挂载172.16.1.41:/data
[root@web01 ~]# mount -t nfs 172.16.1.41:/data /var/www/html
  1. 浏览器测试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海量文件实时同步

posted @ 2021-03-03 21:01  原因与结果  阅读(83)  评论(0编辑  收藏  举报