day 36期中架构实时复制
实时复制实践:
前提:backup rsync服务端部署好。
1)部署NFS客户端
[root@nfs01 ~]# echo 'export RSYNC_PASSWORD=oldboy' >>/etc/bashrc
[root@nfs01 ~]# source /etc/bashrc
[root@nfs01 ~]# echo $RSYNC_PASSWORD
oldboy
测试推送
[root@nfs01 ~]# rsync -avz /data [email protected]::backup/
sending incremental file list
sent 164 bytes received 25 bytes 126.00 bytes/sec
total size is 0 speedup is 0.00
2)查看inotify支持情况
[root@nfs01 ~]# uname -r
3.10.0-957.5.1.el7.x86_64
[root@nfs01 ~]# ls -l /proc/sys/fs/inotify/
总用量 0
-rw-r--r-- 1 root root 0 4月 19 09:45 max_queued_events
-rw-r--r-- 1 root root 0 4月 19 09:45 max_user_instances
-rw-r--r-- 1 root root 0 4月 19 09:45 max_user_watches
3)安装inotify-tools
yum install inotify-tools -y
yum install epel-release -y
[root@nfs01 ~]# rpm -ql inotify-tools|head -2
/usr/bin/inotifywait
/usr/bin/inotifywatch
[root@nfs01 ~]# rpm -qa inotify-tools
inotify-tools-3.14-8.el7.x86_64
inotify机制简介:
Inotify是一种异步的件系统事件监控机制, Linux内核从2.6.13起,加入了Inotify支持,通过Inotify可以监控文件系统中添加、删除,修改、移动等各种事件,
利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools正是实施这样监控的软件。
实际上inotify-tools是一个监控指定目录数据实时变化的软件程序。
Inotify程序原理是一种事件驱动机制,它为应用程序监控文件系统事件提供了实时响应事件的机制,可以做到对事件处理的实时响应。
inotify的实现有几款软件: inotify-tools, sersync.Irsyncd.
inotify优点:
inotify机制优点监控文件系统事件变化,通过复制工具实现实时数据复制。支持多线程实时复制
inotify缺点:
inotify机制缺点实测并发如果大于200个文件(10-100k) ,复制会有延迟。
利用man proc方式可以获取到以上inotify目录以及下面三个文件的说明信息,
根据说明信息,我们可以得知三个文件作用的详细说明:通过man proc获取内核中inotify信息说明:
/proc/sys/fs/inotify/目录包含了三个文件max_queued_events, max_user_instances, and max_user_watches
可以用来限制通过inotify接口消耗内核内存的数量;
更详细信息参见man手册7级别inotify说明上述三个文件的说明如下:
max_user_watches:设置inotifywait或inotifywatch命令可以监视的文件数量(单进程)
max_user_instances: 设置每个用户可以运行的inotifywait或inotifywatch命令的进程数
max_queued_events: 设置inotify实例事件(event)队列可容纳的事件数量
说明:实例概念就是,多个相同服务,启动运行多个进程
inotify工具命令介绍:
inotify-tools工具主要命令
在inotify-tools软件部署完毕后,主要应用两个命令实现数据信息的监控,
一个利用inotifywait命令实现对数据变化事件的监控,
另一个利用inotifywatch命令实现对数据事件信息统计。
这个两个命令是能够应用好 inotify-tools软件的关键,下面对这两个软件说明如下:
# inotifywait:在被监控的目录等待特定文件系统事件(open, close,delete等)发生,
执行后处于阻塞状态,适合在Shell脚本中使用,此命令是重点。
# inotifywatch:收集被监控的文件系统使用的统计数据,指文件系统事件发生的次数统计。
4)命令参数和事件知识
-m|--monitor 始终保持事件监听状态(重要参数)
-r 递归监控目录数据信息变化(重要参数)
-q|--quiet 输出信息少(只打印事件信息)
--excludei
-e 指定监听指定的事件,如果省略,表示所有事件都进行监听。(重要参数)
access 文件或目录内容被读取
modify 文件或目录内容被写入
attrib 文件或目录属性改变
close_write 文件或目录关闭,在写入模式打开之后关闭的。(重要参数)
close_nowrite 文件或目录关闭,在只读模式打开之后关闭的
close 文件或目录关闭,不管读或是写模式
open 文件或目录被打开
moved_to 文件或目录被移动到监控的目录中
moved_from 文件或目录被移动从监控的目录中
move 文件或目录不管移动到或是移动出监控目录都触发事件
create 文件或目录创建在监控的目录中(重要参数)
delete 文件或目录被删除在监控的目录中(重要参数)
delete_self 文件或目录被删除
unmount 文件系统包含的文件或目录不能卸载
5)测试实践:删除 创建 修改
[root@nfs01 ~]# inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e create,delete /data
6)思考:实现数据复制
[root@nfs01 ~]# inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e create,delete /data
7)编写脚本:
mkdir /server/scripts -p
rsync -az --delete /data/ [email protected]::backup
[root@nfs01 /server/scripts]# /bin/sh /server/scripts/monitor1.sh &
[2] 9199
[root@nfs01 /server/scripts]# tail -2 /etc/rc.local
########################
/bin/sh /server/scripts/monitor1.sh &
方法1:
[root@nfs01 /server/scripts]# cat monitor1.sh
#!/bin/sh
cmd="/usr/bin/inotifywait"
$cmd -mrq --format '%w%f' -e close_write,delete /data|\
while read line
do
cd /data&&\
rsync -az --delete ./ [email protected]::backup
done
[root@nfs01 /server/scripts]# sh -x monitor.sh #-------监控,在nfs创建,backup下看,监控显示。
方法2:【不常用】
[root@nfs01 /server/scripts]# cat monitor.sh
#!/bin/sh
cmd="/usr/bin/inotifywait"
$cmd -mrq --format '%w%f' -e close_write,delete /data|\
while read line
do
#删除事件发生
[ ! -e "$line" ] && cd /data &&\
rsync -az --delete ./ [email protected]::backup && continue
#处理增改事件
rsync -az --delete $line [email protected]::backup
done
sersync实践:
1)客户端推送成功
rsync -az /data [email protected]::backup
2)部署sersync服务(NFS)
wget https://github.com/wsgzao/sersync/blob/master/sersync2.5.4_64bit_binary_stable_final.tar.gz
sersync_oldboy_64bit_20160928.tar.gz
[root@nfs01 /server/tools]# mkdir /application -p
[root@nfs01 /server/tools]# mv application/sersync /application/
[root@nfs01 /server/tools]# tree /application/
/application/
下载安装包:直接拽进来
[root@nfs01 /server/tools]# ls
sersync_oldboy_64bit_实时复制软件下载到虚拟机.tar
[root@nfs01 /server/tools]# ll
total 712
-rw-r--r-- 1 root root 728419 Apr 19 11:50 sersync_oldboy_64bit_实时复制软件下载到虚拟机.tar
[root@nfs01 /server/tools]# tar -xf sersync_oldboy_64bit_实时复制软件下载到虚拟机.tar
[root@nfs01 /server/tools]# ls
application sersync_oldboy_64bit_实时复制软件下载到虚拟机.tar
[root@nfs01 /server/tools]# cd application/
[root@nfs01 /server/tools/application]# ls
sersync
[root@nfs01 /server/tools/application]# cd sersync/
[root@nfs01 /server/tools/application/sersync]# ls
bin conf logs readme.txt
[root@nfs01 /server/tools/application/sersync]# cd conf/
[root@nfs01 /server/tools/application/sersync/conf]# ls
confxml.xml confxml.xml.ori
[root@nfs01 /server/tools/application/sersync/conf]# ll
total 8
-rw-r--r-- 1 root root 2266 Sep 28 2016 confxml.xml
-rw-r--r-- 1 root root 2214 Sep 28 2016 confxml.xml.ori
[root@nfs01 /server/tools/application/sersync/conf]# vim confxml.xml
3)sersync配置文件:干两件事:
1)完成监控配置:
inotifywait -mrq --format '%w%f' -e createFolder,close_write,delete,moveFrom,moveTo /data
2)完整命令拼接:
rsync -az /data --timeout=100 [email protected]::backup
4)启动服务
[root@nfs01 /application/sersync/conf]# ../bin/sersync -h
[root@nfs01 /application/sersync/conf]# /application/sersync/bin/sersync -d -n 10 -o /application/sersync/conf/confxml.xml
最终
/application/sersync/bin/sersync -d
pkill sersync
二进制程序,不是yum安装的,所以不能systemctl start sersync
配置:systemctl start sersync启动方案
https://blog.51cto.com/oldboy/2155931
[root@nfs01 /data]# tail -1 /etc/rc.local
/application/sersync/bin/sersync -d
配置:systemctl start sersync启动方案
https://blog.51cto.com/oldboy/2155931
[root@nfs01 /data]# cat /etc/rc.d/init.d/sersync
#!/bin/bash
# chkconfig: 2345 21 81
# description: rsync service start and stop scripts
# Author: oldboy
# Organization: www.oldboyedu.com
start(){
/application/sersync/bin/sersync -d -o /application/sersync/conf/confxml.xml &>/dev/null
}
stop(){
killall sersync 2>/dev/null
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
sleep 2
start
;;
*)
echo $"Usage:$0 {start|stop|restart}"
exit 1
esac
chmod +x /etc/rc.d/init.d/sersync
[root@nfs01 /data]# cat /usr/lib/systemd/system/sersync.service
[Unit]
Description=sersyncd service
After=network.target
[Service]
Type=forking
ExecStart=/etc/rc.d/init.d/sersync start
ExecReload=/etc/rc.d/init.d/sersync restart
ExecStop=/etc/rc.d/init.d/sersync stop
PrivateTmp=true
[Install]
WantedBy=multi-user.target
chmod +x /usr/lib/systemd/system/sersync.service
[root@nfs01 /data]# systemctl enable sersync.service
Created symlink from /etc/systemd/system/multi-user.target.wants/sersync.service to /usr/lib/systemd/system/sersync.service.
[root@nfs01 /data]# systemctl status sersync.service
● sersync.service - sersyncd service
Loaded: loaded (/usr/lib/systemd/system/sersync.service; enabled; vendor preset: disabled)
Active: inactive (dead)
[root@nfs01 /data]# systemctl stop sersync
[root@nfs01 /data]# ps -ef|grep sersync|grep -v grep
[root@nfs01 /data]# systemctl start sersync