1.实时同步服务应用原因

  因为用户上传的数据信息需要实时备份保存.采用定时任务进行备份的话,只能备份每分钟的数据,分钟以内的数据会丢失,所以会引入实时同步服务

2.实时同步服务的原理

  01.需要部署好rsync守护进程服务.实现数据的传输备份

  02.需要部署好inotify服务,实现目录中数据变化实时监测

  03.需要将rsync和inotify服务建立联系,将变化的数据进行实时备份传输

  

  存储服务器和备份服务器之间利用rsync进行数据的传输备份,inotify负责监控指定存储目录的数据变化,sersync结合两者实现实时数据变化同步服务

3.实时同步服务部署

  1.部署好rsync守护进程服务

    服务端配置操作

      步骤一:下载安装软件 rsync  

[root@backup ~]#  rpm -qa rsync
[root@backup ~]#  yum install -y rsync
Loaded plugins: fastestmirror
Determining fastest mirrors
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
base                                                                                        | 3.6 kB  00:00:00     
epel                                                                                        | 4.7 kB  00:00:00     
extras                                                                                      | 2.9 kB  00:00:00     
updates                                                                                     | 2.9 kB  00:00:00     
(1/4): extras/7/x86_64/primary_db                                                           | 206 kB  00:00:00     
(2/4): epel/x86_64/updateinfo                                                               | 1.0 MB  00:00:00     
(3/4): updates/7/x86_64/primary_db                                                          | 3.8 MB  00:00:01     
(4/4): epel/x86_64/primary_db                                                               | 6.9 MB  00:00:01     
Resolving Dependencies
--> Running transaction check
---> Package rsync.x86_64 0:3.1.2-10.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

===================================================================================================================
 Package                  Arch                      Version                          Repository               Size
===================================================================================================================
Installing:
 rsync                    x86_64                    3.1.2-10.el7                     base                    404 k

Transaction Summary
===================================================================================================================
Install  1 Package

Total download size: 404 k
Installed size: 815 k
Downloading packages:
rsync-3.1.2-10.el7.x86_64.rpm                                                               | 404 kB  00:00:00     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Warning: RPMDB altered outside of yum.
** Found 1 pre-existing rpmdb problem(s), 'yum check' output follows:
git-1.8.3.1-13.el7.x86_64 has missing requires of rsync
  Installing : rsync-3.1.2-10.el7.x86_64                                                                       1/1 
  Verifying  : rsync-3.1.2-10.el7.x86_64                                                                       1/1 

Installed:
  rsync.x86_64 0:3.1.2-10.el7                                                                                      

Complete!

      步骤二:编写配置文件

[root@backup ~]#  vim /etc/rsyncd.conf
#ted by HQ at 2017
#rsyncd.conf start###     
uid=rsync
gid=rsync
port=873
fake super=yes
use chroot=no
max connections=200
timeout=300
pid file=/var/run/rsyncd.pid
lock file=/var/run/rsync.lock
log file =/var/log/rsyncd.log
ignore errors
read only=false
list=false
hosts allow=172.16.1.0/24
hosts deny=0.0.0.0/32
auth users=rsync_backup
secrets file=/etc/rsync.password
[backup]
comment="backup dir by oldboy"
path=/backup

       步骤三:创建rsync服务虚拟用户

[root@backup ~]#  id rsync
uid=2008(rsync) gid=2008(rsync) groups=2008(rsync)
[root@backup ~]#  useradd rsync -M -s /sbin/nologin  #创建虚拟用户
useradd: user 'rsync' already exists          #虚拟用户已创建
[root@backup ~]#  id rsync 
uid=2008(rsync) gid=2008(rsync) groups=2008(rsync)
[root@backup ~]#  grep rsync /etc/passwd
rsync:x:2008:2008::/home/rsync:/sbin/nologin
[root@backup ~]#  grep rsync /etc/shadow
rsync:!!:18450:0:99999:7:::
[root@backup ~]#  

      步骤四:创建备份目录,修改属主属组信息

[root@backup ~]#  mkdir /backup
mkdir: cannot create directory ‘/backup’: File exists
[root@backup ~]#  chown rsync.rsync /backup
[root@backup ~]#  ll -d /backup/
drwxr-xr-x 4 rsync rsync 56 Jul 14 22:54 /backup/

      步骤五:创建备份服务认证密码文件

[root@backup ~]#  cat /etc/rsync.password            #echo "rsync_backup:oldboy123" > /etc/rsync.password 
rsync_backup:oldboy123
[root@backup ~]#  ll //etc/rsync.password            #chmod 600 /etc/rsync.password
-rw------- 1 root root 23 Jul  7 22:02 //etc/rsync.password
[root@backup ~]#  

       步骤六:启动rsync服务

root@backup ~]#  systemctl start rsyncd
[root@backup ~]#  systemctl enable rsyncd
Created symlink from /etc/systemd/system/multi-user.target.wants/rsyncd.service to /usr/lib/systemd/system/rsyncd.service. 

    客户端配置操作

       步骤一:下载安装软件

[root@nfs01 ~]#  rpm -qa rsync          # yum install -y rsync
rsync-3.1.2-4.el7.x86_64
 

       步骤二:创建传输时认证的密码文件

[root@nfs01 ~]#  cat /etc/rsync.password 
oldboy123
[root@nfs01 ~]#  ll /etc/rsync.password
-rw------- 1 root root 10 Jul  7 22:23 /etc/rsync.password
[root@nfs01 ~]# 

       步骤三:进行免交互数据传输备份

[root@nfs01 ~]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password

  2.部署inotify监控服务

    步骤一:下载安装软件

[root@nfs01 ~]#  yum install -y inotify-tools
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
base                                                                                        | 3.6 kB  00:00:00     
epel                                                                                        | 4.7 kB  00:00:00     
extras                                                                                      | 2.9 kB  00:00:00     
updates                                                                                     | 2.9 kB  00:00:00     
(1/2): epel/x86_64/updateinfo                                                               | 1.0 MB  00:00:00     
(2/2): epel/x86_64/primary_db                                                               | 6.9 MB  00:00:01     
Package inotify-tools-3.14-9.el7.x86_64 already installed and latest version
Nothing to do
[root@nfs01 ~]#  rpm -qa inotify
[root@nfs01 ~]#  rpm -ql inotify 
package inotify is not installed
[root@nfs01 ~]#  yum install -y inotify
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
No package inotify available.
Error: Nothing to do
[root@nfs01 ~]#  rpm -qa inotify-tools
inotify-tools-3.14-9.el7.x86_64

    步骤二:熟悉命令的使用

[root@nfs01 ~]#  rpm -ql inotify-tools
/usr/bin/inotifywait                  #监控目录数据信息变化
/usr/bin/inotifywatch                  #对监控的变化信息进行统计
/usr/lib64/libinotifytools.so.0
/usr/lib64/libinotifytools.so.0.4.1
/usr/share/doc/inotify-tools-3.14
/usr/share/doc/inotify-tools-3.14/AUTHORS
/usr/share/doc/inotify-tools-3.14/COPYING
/usr/share/doc/inotify-tools-3.14/ChangeLog
/usr/share/doc/inotify-tools-3.14/NEWS
/usr/share/doc/inotify-tools-3.14/README
/usr/share/man/man1/inotifywait.1.gz
/usr/share/man/man1/inotifywatch.1.gz

    inotifywait 命令使用方法:

      innotify [参数] 监控的目录    

[root@nfs01 ~]#  inotifywait -h-m|--monitor                   #实现一直监控目录的数据变化-r|--recursive                  #进行递归监控(监控子目录及以下目录数据变化)-q|--quiet                           #尽量减少信息的输出(-v相反)
    --format <fmt>                  #指定输出信息的格式--timefmt <fmt>                  #指定输出的时间信息格式-e                         #指定监控的时间信息

    创建文件进行数据监控:

[root@nfs01 /date]#  touch  01.txt
[root@nfs01 ~]#  inotifywait -m /date 
Setting up watches.
Watches established.
/date/ CREATE 01.txt            #创建文件
/date/ OPEN 01.txt              #打开文件
/date/ ATTRIB 01.txt              #修改文件属性
/date/ CLOSE_WRITE,CLOSE 01.txt        #保存并关闭文件

    删除文件进行数据监控:

[root@nfs01 /date]#  \rm -rf 01.txt

/date/ DELETE 01.txt             #相对于创建文件来说,删除文件步骤比较简单,直接删除即可

    修改文件进行数据监控:

[root@nfs01 /date]#  echo 123 > 02.txt

/date/ CREATE 02.txt             #创建文件
/date/ OPEN 02.txt               #打开文件
/date/ MODIFY 02.txt              #修改文件内容
/date/ CLOSE_WRITE,CLOSE 02.txt        #保存并关闭文件

    衍生:我们可以利用监控服务查看sed命令修改文件的原理(步骤)

[root@nfs01 /date]#  sed -i 's#123#321#g' 02.txt 

/date/ OPEN 02.txt               #打开文件
/date/ CREATE sed4bpGiW            #创建一个临时文件
/date/ OPEN sed4bpGiW              #打开临时文件
/date/ ACCESS 02.txt              #读取源文件的内容
/date/ MODIFY sed4bpGiW            #修改临时文件内容
/date/ ATTRIB sed4bpGiW            #修改临时文件属性
/date/ CLOSE_NOWRITE,CLOSE 02.txt      #不编辑直接关闭源文件
/date/ CLOSE_WRITE,CLOSE sed4bpGiW      #编辑关闭临时文件
/date/ MOVED_FROM sed4bpGiW          #将临时文件移出
/date/ MOVED_TO 02.txt             #移入到新的02.txt文件

    inotifywait监控命令操作演示:

[root@nfs01 /date]#  touch ./date1/{05..10}.txt
[root@nfs01 ~]#  inotifywait -mrq --timefmt "%F %T" --format "%T %w %f 事件信息:%e" /date -e CREATE
2020-08-09 21:24:20 /date/date1/ 05.txt 事件信息:CREATE
2020-08-09 21:24:20 /date/date1/ 06.txt 事件信息:CREATE
2020-08-09 21:24:20 /date/date1/ 07.txt 事件信息:CREATE
2020-08-09 21:24:20 /date/date1/ 08.txt 事件信息:CREATE
2020-08-09 21:24:20 /date/date1/ 09.txt 事件信息:CREATE

-r  实现了递归监控.子目录中的数据变化也监控了
-q  减少了监控信息中会出现的Setting up watches. Watches established.信息
--timefmt  调用了时间函数信息.在监控的信息中显示了日期和时间
--format  将目录和文件即输入的内容都显示在了监控信息中
-e  指定了要监控的事件,上述要将监控的事件是创建

    在实际应用中.我们只要监控以下事件就能满足需求

    create创建、delete删除、moved_to移入、close_write修改     

  企业应用:防止系统重要文件被破坏

  需要用到inotify进行实时监控. /etc   /etc/passwd   /var/spool/cron/root   等等重要文件

  3.部署sersync同步服务

    步骤一:下载安装软件,注意此软件通过yum是无法下载的,因为软件是个人开发者编写的一款实用工具,需要到特定网址下载https://github.com/wsgzao/sersync

    

      步骤二:创建一个目录,下载的软件都放到此目录中,通过rz 命令将软件上传到linux服务器上

[root@nfs01 ~]#  mkdir -p /server/tools
[root@nfs01 ~]#  cd /server/tools/
[root@nfs01 /server/tools]#  rz -y

[root@nfs01 /server/tools]#  ll 
total 1936
-rw-r--r-- 1 root root 1981010 Aug  9 21:48 sersync-master.zip
[root@nfs01 /server/tools]#  

     步骤三:解压软件压缩包,并保存数据

[root@nfs01 /server/tools]#  ll 
total 1936
-rw-r--r-- 1 root root 1981010 Aug  9 21:48 sersync-master.zip            #软件压缩包
[root@nfs01 /server/tools]#  unzip sersync-master.zip                  #zip的压缩包利用unzip命令进行解压缩
Archive:  sersync-master.zip
e6e4cda2583a73a5581d7015255838b5e68673c6
   creating: sersync-master/
  inflating: sersync-master/.gitattributes  
  inflating: sersync-master/.gitignore  
  inflating: sersync-master/README.md  
  inflating: sersync-master/inotify-tools-3.14.tar.gz  
 extracting: sersync-master/rsync-3.1.1.tar.gz  
  inflating: sersync-master/sersync2.5.4_64bit_binary_stable_final.tar.gz  
[root@nfs01 /server/tools]#  ll 
total 1936
drwxr-xr-x 2 root root     175 Aug 14  2015 sersync-master               #解压后的数据
-rw-r--r-- 1 root root 1981010 Aug  9 21:48 sersync-master.zip
[root@nfs01 /server/tools]#  tree sersync-master
sersync-master
├── inotify-tools-3.14.tar.gz
├── README.md
├── rsync-3.1.1.tar.gz
└── sersync2.5.4_64bit_binary_stable_final.tar.gz

0 directories, 4 files
[root@nfs01 /server/tools]#  cd sersync-master/
[root@nfs01 /server/tools/sersync-master]#  ll
total 1948
-rw-r--r-- 1 root root 358772 Aug 14  2015 inotify-tools-3.14.tar.gz
-rw-r--r-- 1 root root  10838 Aug 14  2015 README.md
-rw-r--r-- 1 root root 890124 Aug 14  2015 rsync-3.1.1.tar.gz
-rw-r--r-- 1 root root 727290 Aug 14  2015 sersync2.5.4_64bit_binary_stable_final.tar.gz
[root@nfs01 /server/tools/sersync-master]#  tar xvf sersync2.5.4_64bit_binary_stable_final.tar.gz     #解压sersync软件安装包
GNU-Linux-x86/
GNU-Linux-x86/sersync2
GNU-Linux-x86/confxml.xml
[root@nfs01 /server/tools/sersync-master]#  ll
total 1948
drwxr-xr-x 2 root root     41 Oct 26  2011 GNU-Linux-x86
-rw-r--r-- 1 root root 358772 Aug 14  2015 inotify-tools-3.14.tar.gz
-rw-r--r-- 1 root root  10838 Aug 14  2015 README.md
-rw-r--r-- 1 root root 890124 Aug 14  2015 rsync-3.1.1.tar.gz
-rw-r--r-- 1 root root 727290 Aug 14  2015 sersync2.5.4_64bit_binary_stable_final.tar.gz
[root@nfs01 /server/tools/sersync-master]#  tree GNU-Linux-x86/
GNU-Linux-x86/
├── confxml.xml
└── sersync2

0 directories, 2 files
[root@nfs01 /server/tools/sersync-master]#  cd GNU-Linux-x86/
[root@nfs01 /server/tools/sersync-master/GNU-Linux-x86]#  ll
total 1772
-rwxr-xr-x 1 root root    2214 Oct 26  2011 confxml.xml
-rwxr-xr-x 1 root root 1810128 Oct 26  2011 sersync2

     步骤三:创建sersync目录

[root@nfs01 ~]#  cd /server/tools/sersync-master/GNU-Linux-x86/
[root@nfs01 /server/tools/sersync-master/GNU-Linux-x86]#  mkdir /usr/local/sersync
[root@nfs01 /server/tools/sersync-master/GNU-Linux-x86]#  mkdir /usr/local/sersync/conf
[root@nfs01 /server/tools/sersync-master/GNU-Linux-x86]#  mkdir /usr/local/sersync/logs
[root@nfs01 /server/tools/sersync-master/GNU-Linux-x86]#  mkdir /usr/local/sersync/bin

     步骤四:移动文件到相应目录

[root@nfs01 /server/tools/sersync-master/GNU-Linux-x86]#  ll
total 1772
-rwxr-xr-x 1 root root    2214 Oct 26  2011 confxml.xml
-rwxr-xr-x 1 root root 1810128 Oct 26  2011 sersync2
[root@nfs01 /server/tools/sersync-master/GNU-Linux-x86]#  mv sersync2 /usr/local/sersync/bin/
[root@nfs01 /server/tools/sersync-master/GNU-Linux-x86]#  mv confxml.xml /usr/local/sersync/conf/
[root@nfs01 /server/tools/sersync-master/GNU-Linux-x86]#  cd 

[root@nfs01 /usr/local/sersync]#  cd ..
[root@nfs01 /usr/local]#  tree sersync/
sersync/
├── bin                          #sersync软件命令目录
│   └── sersync2
├── conf                          #sersync配置文件目录
│   └── confxml.xml
└── logs                            #sersync日志文件目录

      步骤五:编写配置文件

[root@nfs01 /usr/local]#  cd ./sersync/conf/
[root@nfs01 /usr/local/sersync/conf]#  vim confxml.xml

  6     <filter start="false">                #start="ture"即为开启排除功能
  7         <exclude expression="(.*)\.svn"></exclude>        以.svn结尾的信息
  8         <exclude expression="(.*)\.gz"></exclude>        以.gz结尾的信息
  9         <exclude expression="^info/*"></exclude>        以info开头的信息
 10         <exclude expression="^static/*"></exclude>      以static开头的信息
 11     </filter>
 说明配置:指定排除不进行实时传输同步的数据信息

 12     <inotify>
 13         <delete start="true"/>
 14         <createFolder start="true"/>
 15         <createFile start="false"/>
 16         <closeWrite start="true"/>
 17         <moveFrom start="true"/>
 18         <moveTo start="true"/>
 19         <attrib start="false"/>
 20         <modify start="false"/>             此项为关闭是因为closewrite开启了,closewrite也相当于修改,有一个即可
 21     </inotify>
说明配置:指定inotify程序需要监控的事件

23     <sersync>
 24         <localpath watch="/date">              #指定监控的目录
 25             <remote ip="172.16.1.41" name="backup"/>  #备份服务器的地址 指定备份服务器模块信息
 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="-artuz"/>        rsync命令使用的参数
 31             <auth start="ture" users="rsync_backup" passwordfile="/etc/rsync.password"/> rsync认证用户
 32             <userDefinedPort start="false" port="874"/><!-- port=874 -->           rsync密码认证文件
 33             <timeout start="false" time="100"/><!-- timeout=100 -->
 34             <ssh start="false"/>
 35         </rsync>
需要编写的配置文件

      

      步骤六:配置环境变量.

      由于sersync命令是下载得来的,它的路径不在环境变量中,每次执行命令需要输绝对路径,所以我们添加环境变量

临时添加环境变量

root@nfs01 /usr/local/sersync/conf]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin [root@nfs01 /usr/local/sersync/conf]# export PATH="$PATH:/usr/local/sersync/bin/" [root@nfs01 /usr/local/sersync/conf]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/sersync/bin/

永久添加环境变量

[root@nfs01 /usr/local/sersync/conf]#  vim /etc/profile
#sersync
export PATH="$PATH:/usr/local/sersync/bin/"
                                                                
[root@nfs01 /usr/local/sersync/conf]#  source /etc/profile
[root@nfs01 /usr/local/sersync/conf]#  echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/sersync/bin/

      步骤七:启动sersync服务程序

[root@nfs01 ~]#  sersync2 -dro /usr/local/sersync/conf/confxml.xml               运行配置文件,启动服务
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:  /usr/local/sersync/conf/confxml.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    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
------------------------------------------
rsync the directory recursivly to the remote servers once
working please wait...
execute command: cd /date && rsync -az -R --delete ./ rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password >/dev/null 2>&1     #这条命令是sersync执行的监控命令
移动到/date目录,且执行rsync命令. --delete 含义是无差异同步 这就实现了实时同步功能
run the sersync: ,
watch path is: /date                                                    #实时同步监控指定目录,服务部署成功


[root@nfs01 ~]#  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命令推送一遍
c参数-n: 指定开启守护线程的数量,默认为10个
参数-o:指定配置文件,默认使用confxml.xml文件
    -o /usr/local/sersync/conf/confxml.xml
      -o /usr/local/sersync/conf/confxml02.xml          如果有其他配置文件,也可以单独指定

设置服务开机自启:由于服务是第三方下载软件,所有不能利用命令进行开机自启,需要将启动命令添加到自启文件中
[root@nfs01 ~]#  echo "sersync2 -dro /usr/local/sersync/conf/confxml.xml" >>/etc/rc.local
[root@nfs01 ~]#  cat /etc/rc.local
~
sersync2 -dro /usr/local/sersync/conf/confxml.xml


sersync服务需要停止的时候直接执行kill命令即可,此时我们需要一个命令即killall,停止服务的全部进程
[root@nfs01 ~]#  yum provides killall                                #查找killall属于哪个软件包
   
psmisc-22.20-16.el7.x86_64 : Utilities for managing processes on your system
Repo        : base
Matched from:
Filename    : /usr/bin/killall

[root@nfs01 ~]#  yum install -y psmisc                                #下载软件包
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile

Installed:
  psmisc.x86_64 0:22.20-16.el7                                                                                     

Complete!
停止服务进程
[root@nfs01 ~]#  killall sersync2

        步骤七:验证实时同步服务

在存储服务器上创建100个文件,查看备份服务器监控状态
[root@nfs01 ~]#  cd /date
[root@nfs01 /date]#  touch {1..100}.txt
[root@nfs01 /date]#  ll |wc -l
103
[root@backup ~]#  cd /backup/
[root@backup /backup]#  ll |wc -l
103                            #文件数一样,说明实时同步监控服务正常

在存储服务器上删除创建的100个文件,查看备份服务器监控状态
[root@nfs01 /date]#  \rm -rf ./*
[root@nfs01 /date]#  ll
total 0
[root@nfs01 /date]#  
[root@backup /backup]#  ll
total 0
[root@backup /backup]# 

04 实时同步服务概念总结
    1)实现实时同步的原理
        监控目录数据变化        inotify
        将数据进行传输            rsync
        将监控和传输进行整合    sersync
    2)实现实时同步部署方法
        1.部署rsync守护进程
        2.部署inotify软件    只要下载好软件即可sersync会自己调用命令来执行任务
        3.部署sersync软件