rsync + inotify 实现数据监控同步

一、rsync 数据同步

同步与复制的差异:

复制:完全拷贝源文件到目标文件(cp scp(远程复制))

同步:增量拷贝,只传输变化过的数据

  1. rsync的命令用法:

rsync [选项] 源目录 目标目录

  1. rsync常用的操作选项:

-n:测试同步过程,不做实际修改

--delete: 删除目标文件内多余的文件

-a: 归档模式,表示以递归方式传输文件,并保持所有文件属性,相当于-rlptgoD

-v: 显示详细的操作信息

-z: 传输过程中启用压缩/解压

  1. 本地同步实例

# 在 / 下创建两个目录
[root@web1 ~]# mkdir /socdir    /destdir

# 在socdir目录中存放两个文件
[root@web1 ~]# cp /etc/passwd   /socdir/
[root@web1 ~]# touch /socdir/1.txt
[root@web1 ~]# ls /socdir/     # 查看 socdir 目录中有两个文件
1.txt  passwd

# 同步目录到目标文件夹中   注意: /socdir 写法 和   /socdir/ 写法
[root@web1 ~]# rsync -av /socdir    /destdir/   # 将整个源目录socdir都同步到目标目录destdir中
[root@web1 ~]# rsync -av /socdir/  /destdir/    # 将源目录中的文件同步到目标目录中

# --delete 参数,删除目标文件中多余的参数
[root@web1 ~]# touch /destdir/2.txt
[root@web1 ~]# touch /socdir/3.txt
[root@web1 ~]# rsync -av --delete /socdir/   /destdir/

3.远程同步实例

与远程的ssh目录保持同步

上行: rsync [.. ] 本地目录 user@host:远程目录

下行: rsync [....] user@host:远程目录 本地目录

# 虚拟机A中/socdir目录内容与虚拟机B中/test进行同步
# 虚拟机A中执行:
[root@web1 ~]# rsync -av --delete /socdir/   [email protected]:/test
[email protected]'s password:

# 虚拟机B中查看
[root@web2 ~]# ls /test

二、实时数据同步

rsync 和 inotify工具共同使用,当监控到源目录中的数据有变化时,立刻将其同步到目标目录中

环境:虚拟机A中/socdir目录内容与虚拟机B中/test进行同步

1.实现ssh无密码验证(公钥与私钥)

# 虚拟机A,生成公钥与私钥
[root@web1 ~]# ssh-keygen         #一路回车
[root@web1 ~]# ls    /root/.ssh/
id_rsa(私钥)   id_rsa.pub(公钥)    known_hosts(记录曾经远程管理过的机器)

2.虚拟机A上操作,将公钥传递给虚拟机B
web1]# ssh-copy-id     [email protected]
web1]#  rsync -av --delete /socdir/   [email protected]:/test

2.源码编译安装inotify

  1. wget 下载

  1. 下载后安装源码包:解压缩

./configure配置

make编译

make install 安装

# 源码编译安装步骤
# 步骤一:安装开发工具
]# yum   -y   install   make
]# yum   -y   install   gcc

# 步骤二:进行tar解包  
]# tar  -xf  /root/tools.tar.gz  -C   /usr/local/
]# ls   /usr/local/
]# ls   /usr/local/tools/

]# tar -xf   /usr/local/tools/inotify-tools-3.13.tar.gz   -C /usr/local/
]# ls   /usr/local/

# 步骤三:运行configure脚本进行配置
# 作用1:检测系统是否安装gcc  
# 作用2:可以指定安装位置及功能
]# cd    /usr/local/inotify-tools-3.13/  # 要cd到源码所在目录
]# ./configure     --prefix=/opt/myrpm       #指定安装位置

# 步骤四:make进行编译,产生可以执行的程序
]# cd    /usr/local/inotify-tools-3.13/
]# make

# 步骤五:make   install进行安装
]# cd    /usr/local/inotify-tools-3.13/
]# make    install

]# ls  /opt/myrpm/ 
]# ls  /opt/myrpm/bin/    # 查看编译后的程序文件
  1. 基本用法

inotifywait [选项] 目标文件夹

常用命令:

-m: 持续监控,捕获一个事件后不退出

-r: 递归监控,包括子目录及文件

-q: 减少屏幕输出信息

-e: 指定监控的modify, move, create, delete,attrib等事件类别

4.书写一个shell脚本,监控一个目录的变化,有内容变化时,即进行同步数据

[root@svr7 /]# vim   /etc/rsync.sh  # 监控变化时同步
while   /opt/myrpm/bin/inotifywait    -rqe    /mydir/
do
rsync -a  --delete   /mydir/    [email protected]:/opt
done
[root@svr7 /]# chmod   +x    /etc/rsync.sh    #赋予执行权限
[root@svr7 /]# /etc/rsync.sh   &     #运行脚本程序
[root@svr7 /]# jobs  -l
[1]+ 17707 运行中               /etc/rsync.sh &
[root@svr7 /]# kill  17707      #停止脚本

rsync 服务的配置文件解析

  1. 配置环境

主机

操作系统

IP地址

主要软件

master

CentOS7

192.168.154.19

rsync

slave

CentOS7

192.168.154.20

rsync / inotify-tools-3.14.tar.gz

  1. 将Master服务器的数据备份到slave端

Master(192.168.154.19):

systemctl stop firewalld
systemctl disable firewalld
setenforce 0
#关闭防火墙及安装机制
 
yum install -y httpd rsync
#rsync系统一般已默认安装,安装httpd是为了生成/var/www/html目录(后续会用到作为共享目录)
 
vim /etc/rsyncd.conf
#编辑rsync配置文件
uid = root
gid = root
use chroot = yes
address = 192.168.154.19
port 873
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
hosts allow = 192.168.154.0/24
[wwwroot]        
path = /var/www/html
comment = Document Root of www.fbc.com
read only = yes
dont comperss = *.gz *.bz2 *.tgz *.zip *.rar *.z
auth users = backuper    
secrets file = /etc/rsyncd_users.db
----详解----
uid = root                                            #用户id,表示共享权限能执行的身份
gid = root                                            #组id
use chroot = yes                                    #开启,禁锢在源目录,表示允许在访问我备份的目录或文件的时候,使用的角色是root,同时你访问本地目录时拥有的也是root权限
address = 192.168.154.19                            #监听地址
port 873                                            #默认端口号为873
log file = /var/log/rsyncd.log                        #日志文件存放位置
pid file = /var/run/rsyncd.pid                        #存放进程id的文件位置
hosts allow = 192.168.154.0/24                        #允许访问的主机网段,有点类似于黑白名单
[wwwroot]                                            #共享模块的名称,rsync默认调用该模块,默认我调用的路径是该模块指定的路径
path = /var/www/html                                #源目录路径
comment = Document Root of www.fbc.com                #
read only = yes                                        #是否为只读
dont comperss = *.gz *.bz2 *.tgz *.zip *.rar *.z    #同步时不再压缩的文件类型,因为同步时,-avz已经进行压缩
auth users = backuper                                    #授权用户,使用wwwroot模块的用户是哪个用户,多个账户以空格隔开
secrets file = /etc/rsyncd_users.db                    #存放账号信息的数据文件,一行一个
----
 
vim /etc/rsyncd_users.db
backuper:123456
#编辑用户账号文件,固定格式为[名称:密码],一行一个
 
chmod 600 /etc/rsyncd_users.db
#官方要求,最好只是赋权600!
 
rsync --daemon
#开启服务
netstat -natp | grep rsync
#检测端口号,确认服务是否成功开启
 
cd /var/www/html
#切换至共享目录下
touch 1.html 2.html
ls

(1)关闭防火墙及安装机制

(2)rsync系统一般已默认安装,安装httpd是为了生成/var/www/html目录(后续会用到作为共享目录)

(3)编辑rsync配置文件

(4)编辑用户账号文件,固定格式为[名称:密码],一行一组

(5)密码文件赋权,一般设置600

(6)启动rsyncd服务并查看服务开启状态

(7)切换到要共享的目录下,创建文件

3、配置salve端

(192.168.154.20)

systemctl stop firewalld
systemctl disable firewalld
setenforce 0
#关闭防火墙及安装机制
 
yum install -y rsync
#安装rsync
 
mkdir /fbc
cd /fbc/
#创建一个目录/fbc,用来同步
 
rsync -avz [email protected]::wwwroot /abc
#使用rsync同步备份源的同步文件
 
ls 
#查看同步是否成功
 
 
vim /etc/server.pass
123456
#编辑免交互密钥文件,第一行为密码
 
 
chmod 600 /etc/server.pass
#给密钥文件赋权600
 
rsync -az --delete --password-file=/etc/server.pass [email protected]::wwwroot /abc
#rsync,使用密钥文件/etc/server/pass对应backuper用户,IP地址为192.168.59.111的共享模块文件进行压缩,并归档同步至当前服务器的/abc目录下,同时删除差异内容,如果原目标有的,会增加,原目标没有的,会删除。保持一致性。
 
ls /fbc
#查看下行同步是否成功

(1)关闭防火墙及安装机制

(2)安装rsync

(3)创建一个目录/fbc,用来做同步 目录

(4)使用rsync同步备份源的同步文件,并查看是否完成

(5)编辑免交互密钥文件,第一行为密码

(6)密钥文件赋权600

(7)验证结果

rsync -az --delete --password-file=/etc/server.pass [email protected]::wwwroot /fbc
 
 
#rsync,
使用密钥文件/etc/server/pass对应backuper用户,IP地址为192.168.154.19的共享模块文件进行压缩,并归档同步至当前服务器的/fbc目录下,同时删除差异内容,如果原目标有的,会增加,原目标没有的,会删除。保持一致性。

四、inotify简介

可以监控文件系统的变动情况,并做出通知响应

#调整inotify内核参数(优化)
letc/ sysctl.conf(内核参数配置文件)
inotifywait:    #用于持续监控,实时输出结果
inotifywatch:   #用于短期监控,任务完成后再输出结果
max_queue_events   #监控事件队列大小
max_user instances      #最多监控实例数,可以看成最多可以监控多少个实例
max_user_watches        #每个实例最多监控文件数

五、配置Rsync+Inotify 实时同步

使用inotify通知接口,可以用来监控文件系统的各种变化情况,如文件存取、删除、移动、修改等。利用这一机制,可以非常方便地实现文件异动告警、增量备份,并针对目录或文件的变化及时作出响应。

将inotify机制与rsync工具相结合,可以实现触发式备份(实时同步),即只要原始位置的文档发生变化,则立即启动增量备份操作;否则处于静默等待状态。

因为 inotify 通知机制由 Linux 内核提供,因此主要做本机监控,在触发式备份中应用时更适合上行同步

1、host1关闭只读模式并为共享目录赋权

vim /etc/rsyncd.conf
read only = no
#关闭只读模式,否则将不可写入
 
 
kill `cat /var/run/rsyncd.pid`
#修改完配置文件需要重启服务,这里采用直接杀掉进程号的方式
 
netstat -natp | grep rsync
#检查一下服务是否已被终止
 
rsync --daemon
netstat -natp | grep rsync
#再次开启服务并检查端口号确认
 
 

(1)关闭只读模式否则将不可写入

(2)修改完配置文件需要重启服务,这里采用直接啥进程号的方式 。杀完检测服务是否已被终止

(3)开启服务,并查看服务状态

2、优化 host2 内核参数

host2(192.168.154.20)

cat /proc/sys/fs/inotify/max_queued_events      #监控事件队列
cat /proc/sys/fs/inotify/max_user_instances     #最多监控实例数
cat /proc/sys/fs/inotify/max_user_watches       #每个实例最多监控文件数
 
vim /etc/sysctl.conf         #加大每个参数
fs.inotify.max_queued_events = 16384
fs.inotify.max_user_instances = 1024
fs.inotify.max_user_watches = 1048576
#当要监控的目录、文件数据量较多或者变化频繁时,建议加大参数值
 
sysctl -p
#刷新

(1)查看参数

(2)加大参数

刷新

3、host2

(192.168.154.20):编译安装 inotify-tools

yum install -y gcc gcc-c++ make
#安装gcc gcc-c++ make
 
cd /opt
#切换至/opt上传inotify-tools安装包
 
tar zxf inotify-tools-3.14.tar.gz 
#解压
 
cd /opt/inotify-tools-3.14/
./configure
make -j 4 && make install
#编译安装

(1)安装gcc gcc-c++ make

(2)切换到/opt上传inotify-tools安装包

(3)解压 inotify-tools包

cd 进入inotify-tools-3.14.tar.gz

ls查看文件使用tar命令解压

(4)编译安装

4、客户端启动监听

#持续监听对/abc的modify,create,move,delete操作
inotifywait -mrq -e modify,create,delete /fbc

5、编写触发同步脚本

vim /opt/inotify.sh
#!/bin/bash
INOTIFY_CMD="inotifywait -mrq -e create,delete,move,modify,attrib /opt/fbc/"
RSYNC_CMD="rsync -azH --delete --password-file=/etc/server.pass /opt/fbc/ [email protected]::wwwroot"
 
$INOTIFY_CMD | while read DIRECTORY EVENT FILE
do
    if [ $(pgrep rsync | wc -l) -le 0 ] ; then
        $RSYNC_CMD
    fi
done
----详解----
#!/bin/bash
INOTIFY_CMD="inotifywait -mrq -e create,delete,move,modify,attrib /opt/fbc/"
#INOTIFY_CMD变量:持续监控 /opt/abc目录中的创建,删除,移动,修改,改变时间的操作
RSYNC_CMD="rsync -azH --delete --password-file=/etc/server.pass /opt/fbc/ [email protected]::wwwroot"
#RSYNC_CMD变量:使 xixi 用户,/etc/server.pass 密钥文件,将 /opt/xcf1 目录下的文件进行压缩,归档,保留硬链接文件同步至 192.168.154.19 的共享模块定义的目录 /var/www/html 下,并删除差异性内容,保持一致性
 
$INOTIFY_CMD | while read DIRECTORY EVENT FILE        #持续监控...
do
    if [ $(pgrep rsync | wc -l) -le 0 ] ; then        #如果服务并未启动,则执行同步
        $RSYNC_CMD
    fi
done
----
 
cd /opt/
chmod +x inotify.sh
#给脚本赋权
 
chmod +x /etc/rc.d/rc.local 
echo "/opt/inotify.sh" >> /etc/rc.d/rc.local 
#设置开机自启动
 
sh -x inotify.sh
#执行脚本
 
cd /opt/abc
touch jingjing.html
rm -rf jiang.html
#创建一个新的html文件并删除之前的qwe
ls
#再次确认一下

(1)编写脚本

(2)给脚本赋权

(3)设置开机自启动

(4)执行脚本

6、测试

(1)运行脚本

(2)在host2下的/fbc目录下创建文件88888.txt和文件 4.txt

(3)在host1下面/var/www/html/目录下查看文件是否被复制了

六、总结

1、增量同步

2、备份/迁移:可以作为辅助工具(mysql 主从复制 rsync +inotify ——》趋于一致 双向同步——MM,但是只能在并发量不大的时候可以用)

3、假设mysql 从主机A迁移到主机B(一主两从模式)

一主两从模式迁移方案

①确定迁移的时间、业务线停止的时间、要写文档描述具体操作,要发邮件审批

②确认迁移后的节点的环境问题(资源环境 + 系统依赖环境 + mysql内部的格式环境 ------1)例如自增长,自增长可能会导致主从复制不一致的情况 2)版本迁移问题,比如说低版本向高版本迁移。两个版本中的差异比较大,数据迁移比较重要,需要和研发沟通,让研发开发一个工具,让低版本可以转成高版本工具格式,使用工具迁移)

③ 如果数据库是相同版本,可以用rsync + inotify持续同步

④ 测试、之前还要编写回滚方案

————————————————

版权声明:本文为CSDN博主「上单carrry」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/weixin_67510296/article/details/125707402

猜你喜欢

转载自blog.csdn.net/ysy910203/article/details/129186773