实时备份工具之inotify+rsync

 1.inotify简介

  inotify 是一个从 2.6.13 内核开始,对 Linux 文件系统进行高效率、细粒度、异步地监控机制, 用于通知用户空间程序的文件系统变化。可利用它对用户空间进行安全、性能、以及其他方面的监控。Inotify 反应灵敏,用法非常简单,并且比 cron 任务的繁忙轮询高效得多。如果内核版本不低于 2.6.13,系统就支持 inotify。 如果存在
/usr/include/sys/inotify.h 文件, 表明内核支持 inotify。

[root@localhost ~]#  ls -l /proc/sys/fs/inotify/     #列出文件目录,出现下面的内容,说明服务器内核支持inotify
total 0
-rw-r--r-- 1 root root 0 Oct 13 05:39 max_queued_events
-rw-r--r-- 1 root root 0 Oct 13 05:39 max_user_instances
-rw-r--r-- 1 root root 0 Oct 13 05:39 max_user_watches

       2.inotify的作用

  inotify 可以监控文件,也可以监控目录。当监控目录时,它可以同时监控目录及目录中的各子目录及文件的。此外, inotify 使用文件描述符作为接口,因而可以使用通常的文件 I/O 操作 select、 poll 和 epoll 来监视文件系统的变化。

  

  3.inotify实现数据实时同步原理

  无论是手动执行 rsync 还是把 rsync 客户端发出的数据同步请求命令做成周期性任务计划, 每隔一段时间不管有没有数据变化都发出一次数据同步请求命令, 同步一次数据。 服务端和客户端都有时间差。所以, 使用内核提供的 inotify 机制,当数据发生改变时(删除、修改等)就触发 rsync 客户端发出数据 同步请求。 从而实现数据的实时传输。
rsync + inotify 机制实现的两台服务器数据同步如下图如示:

  4.inotify的安装与使用

[root@localhost ~]# yum install -y inotify-tools
[root@localhost ~]# inotifywait -mrq --timefmt '%d%m%Y %H:%M' --format '%T %w%f' -e create /backup  #创建对目录/backup的监控
17102017 00:02 /backup/1.txt
17102017 00:02 /backup/2.txt
17102017 00:02 /backup/3.txt
17102017 00:02 /backup/4.txt
17102017 00:02 /backup/5.txt

  5.inotify之inotifywait命令详解

参数详解:
-r:递归查询目录
-q:打印监控时间信息
-m:始终保持时间监听状态
--excludei: 排除文件或目录时,不区分大小写。
--timefmt: 指定时间输出的格式
--format: 打印使用指定的输出类似格式字符串
a、 %w:显示被监控文件的文件名;
b、 %f:如果发生某事件的对象是目录,则显示被监控目录的名字;默认显示为空串;
c、 %T:使用--timefmt 选项中自定义的时间格式;
d、 %e 表示发生的事件
e、 %Xe 事件以“X”分隔
-e:指定需要监控的事件
access: 文件或目录被读取
modify: 文件或目录内容被修改
attrib: 文件或目录属性被改变
close: 文件或目录封闭,无论读/写模式
open:文件或目录被打开
move_to:文件或目录被移动到另外一个目录
move:文件或目录被移动另一个目录或从另一个目录移动到当前目录
create:文件或目录被创建在当前目录
delete:文件或目录被删除
unmount:文件系统被卸载
常用组合:close_write,modify,delete,create,attrib 

  6.编写监控脚本

[root@nfs scripts]# vim inotify.sh
#!/bin/bash
/usr/bin/inotifywait -mrq '%w%f' -e close_write,modify,delete,create /backup \
| while read line
do
cd /backup && rsync -azP ./ rsync_bakup@192.168.0.175::backup/ --password-file=/etc/rsync.password >/dev/null 2>&1
done
exit 0
[root@nfs scripts]# sh inotify.sh &             #<==运行脚本监控/backup
[root@nfs scripts]# touch /backup/{1..10}.log           #<==NFS上创建文件进行测试    
[root@backup backup]# ll                    #<==备份服务上查看是否备份成功   
total 4
-rw-r--r-- 1 rsync rsync    0 Oct 17 00:28 10.log
drwxr-xr-x 2 rsync rsync 4096 Oct 12 21:43 192.168.0.165
-rw-r--r-- 1 rsync rsync    0 Oct 17 00:28 1.log
-rw-r--r-- 1 rsync rsync    0 Oct 17 00:28 2.log
-rw-r--r-- 1 rsync rsync    0 Oct 17 00:28 3.log
-rw-r--r-- 1 rsync rsync    0 Oct 17 00:28 4.log
-rw-r--r-- 1 rsync rsync    0 Oct 17 00:28 5.log
-rw-r--r-- 1 rsync rsync    0 Oct 17 00:28 6.log
-rw-r--r-- 1 rsync rsync    0 Oct 17 00:28 7.log
-rw-r--r-- 1 rsync rsync    0 Oct 17 00:28 8.log
-rw-r--r-- 1 rsync rsync    0 Oct 17 00:28 9.log
[root@nfs scripts]# echo "/bin/bash /server/scripts/inotify.sh &" >> /etc/rc.local  #<==设置开机启动

  7.修改inotify默认参数(inotify默认内核参数值太小)

查看系统默认参数值
sysctl -a | grep max_queued_events
结果是:fs.inotify.max_queued_events = 16384
sysctl -a | grep max_user_watches
结果是:fs.inotify.max_user_watches = 8192
sysctl -a | grep max_user_instances
结果是:fs.inotify.max_user_instances = 128
修改参数:
sysctl -w fs.inotify.max_queued_events="99999999"
sysctl -w fs.inotify.max_user_watches="99999999"
sysctl -w fs.inotify.max_user_instances="65535"
vim /etc/sysctl.conf #添加以下代码
fs.inotify.max_queued_events=99999999
fs.inotify.max_user_watches=99999999
fs.inotify.max_user_instances=65535
:wq! #保存退出参数说明:
max_queued_events:
inotify队列最大长度,如果值太小,会出现"** Event Queue Overflow **"错误,导致监控文件不准确
max_user_watches:
设置inotifywait或inotifywatch命令可以监视的文件数量(单进程)
max_user_instances:
每个用户创建inotify实例最大值
【inotify在实际生产环境中,对于50-200KB的文件,inotify的最发并发量为200-300,如果客户端写入速度大于这个量,将会造成短暂的延迟】

  8.总结

1 rysnc+inotify实时备份流程:
2 a.实现从NFS客户端到rsync服务端的rsync的部署
3 b.实现从NFS客户端对NFS目录文件系统时间的实时监控
4 c.当监控到NFS目录文件系统事件变化后,触发rsync推送变化的文件

1 高并发数据实时同步方案:
2 (1)inotify(sersync)+rsync,是文件级别
3 (2)drbd文件系统级别,基于block块文件
4 (3)第三方软件的同步功能:
5 mysql同步,oracle,mongodb
6 (4)程序双写,直接写入两台服务器
7 (5)业务逻辑解决(读写分离,备读不到,读主)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/535370.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql主从延迟

在实际的生产环境中&#xff0c;由单台MySQL作为独立的数据库是完全不能满足实际需求的&#xff0c;无论是在安全性&#xff0c;高可用性以及高并发等各个方面 因此&#xff0c;一般来说都是通过集群主从复制&#xff08;Master-Slave&#xff09;的方式来同步数据&#xff0c…

16张图带你吃透高性能 Redis 集群

现如今 Redis 变得越来越流行&#xff0c;几乎在很多项目中都要被用到&#xff0c;不知道你在使用 Redis 时&#xff0c;有没有思考过&#xff0c;Redis 到底是如何稳定、高性能地提供服务的&#xff1f; 你也可以尝试回答一下以下这些问题&#xff1a; 我使用 Redis 的场景很…

Redis与MySQL双写一致性如何保证

谈谈一致性 一致性就是数据保持一致&#xff0c;在分布式系统中&#xff0c;可以理解为多个节点中数据的值是一致的。 强一致性&#xff1a;这种一致性级别是最符合用户直觉的&#xff0c;它要求系统写入什么&#xff0c;读出来的也会是什么&#xff0c;用户体验好&#xff0c;…

weblogic忘记console密码

进入 cd /sotware/oracle_ldap/Middleware/user_projects/domains/base_domain/security/ 目录 执行 java -classpath /sotware/oracle_ldap/Middleware/wlserver_10.3/server/lib/weblogic.jar weblogic.security.utils.AdminAccount weblogic(账号) weblogic123(密码) . …

Redis的AOF日志

如果 Redis 每执行一条写操作命令&#xff0c;就把该命令以追加的方式写入到一个文件里&#xff0c;然后重启 Redis 的时候&#xff0c;先去读取这个文件里的命令&#xff0c;并且执行它&#xff0c;这不就相当于恢复了缓存数据了吗&#xff1f; 这种保存写操作命令到日志的持久…

Redis 核心技术与实战

目录 开篇词 | 这样学 Redis&#xff0c;才能技高一筹 01 | 基本架构&#xff1a;一个键值数据库包含什么&#xff1f; 02 | 数据结构&#xff1a;快速的Redis有哪些慢操作&#xff1f; 键和值用什么结构组织&#xff1f; 为什么哈希表操作变慢了&#xff1f; 有哪些底层数…

plsql定时器

Oralce中的任务有2种&#xff1a;Job和Dbms_job&#xff0c;两者的区别有&#xff1a; 1&#xff0e; jobs是oracle数据库的对象&#xff0c; dbms_jobs只是jobs对象的一个实例&#xff0c; 就像对于tables&#xff0c; emp和dept都是表的实例。 2&#xff0e; 创建方式也有…

PL/SQL批处理语句:BULK COLLECT 和 FORALL

PL/SQL程序中运行SQL语句是存在开销的&#xff0c;因为SQL语句是要提交给SQL引擎处理&#xff0c;这种在PL/SQL引擎和SQL引擎之间的控制转移叫做上下文却换&#xff0c;每次却换时&#xff0c;都有额外的开销 请看下图&#xff1a; 但是&#xff0c;FORALL和BULK COLLEC…

redis-full-check

https://github.com/alibaba/RedisFullCheck/releases redis-full-check是阿里云Redis&MongoDB团队开源的用于校验2个redis数据是否一致的工具。   redis-full-check通过全量对比源端和目的端的redis中的数据的方式来进行数据校验&#xff0c;其比较方式通过多轮次比较&a…

Docker目录挂载

Docker容器启动的时候&#xff0c;如果要挂载宿主机的一个目录&#xff0c;可以用-v参数指定。 譬如我要启动一个centos容器&#xff0c;宿主机的/test目录挂载到容器的/soft目录&#xff0c;可通过以下方式指定&#xff1a; # docker run -it -v /test:/soft centos /bin/ba…

Redis主从复制原理学习

Redis主从复制原理学习总结 - 运维笔记 和Mysql主从复制的原因一样&#xff0c;Redis虽然读取写入的速度都特别快&#xff0c;但是也会产生读压力特别大的情况。为了分担读压力&#xff0c;Redis支持主从复制&#xff0c;Redis的主从结构可以采用一主多从或者级联结构&#xff…

Redis哨兵模式(sentinel)学习总结及部署记录(主从复制、读写分离、主从切换)

Redis的集群方案大致有三种&#xff1a;1&#xff09;redis cluster集群方案&#xff1b;2&#xff09;master/slave主从方案&#xff1b;3&#xff09;哨兵模式来进行主从替换以及故障恢复。 一、sentinel哨兵模式介绍 Sentinel(哨兵)是用于监控redis集群中Master状态的工具&…

Redis之Redis内存模型

Redis是目前最火爆的内存数据库之一&#xff0c;通过在内存中读写数据&#xff0c;大大提高了读写速度&#xff0c;可以说Redis是实现网站高并发不可或缺的一部分。 我们使用Redis时&#xff0c;会接触Redis的5种对象类型&#xff08;字符串、哈希、列表、集合、有序集合&…

Redis监控指标

监控指标 •性能指标&#xff1a;Performance•内存指标: Memory•基本活动指标&#xff1a;Basic activity•持久性指标: Persistence•错误指标&#xff1a;Error 性能指标&#xff1a;Performance NameDescriptionlatencyRedis响应一个请求的时间instantaneous_ops_per_s…

MHA高可用

manager 组件 masterha_manger # 启动MHA masterha_check_ssh # 检查MHA的SSH配置状况 masterha_check_repl # 检查MySQL复制状况&#xff0c;配置信息 masterha_master_monitor # 检测master是否宕机 masterha_check_status # 检测当…

MySQL Replication需要注意的问题

主库意外宕机 如果没有设置主库的sync_binlog选项&#xff0c;就可能在奔溃前没有将最后的几个二进制日志事件刷新到磁盘中。备库I/O线程因此也可一直处于读不到尚未写入磁盘的事件的状态中。当主库从新启动时&#xff0c;备库将重连到主库并再次尝试去读该事件&#xff0c;但…

update和delete操作忘加where条件导致全表更新的处理方法

在数据库日常维护中&#xff0c;开发人员是最让人头痛的&#xff0c;很多时候都会由于SQL语句写的有问题导致服务器出问题&#xff0c;导致资源耗尽。最危险的操作就是在做DML操作的时候忘加where条件&#xff0c;导致全表更新&#xff0c;这是作为运维或者DBA的我们改如何处理…

Innodb结构

从MySQL5.5版本开始默认使用InnoDB作为引擎&#xff0c;它擅长处理事务&#xff0c;具有自动崩满恢复的特性&#xff0c;在日常开发中使用非常广泛&#xff0c;下面是言方的InnoDB引擎美构图&#xff0c;主要分为内存结构和磁盘结构两大部分。 内存结构主要包括Buffer Pool、C…

innodb_flush_method理解【转】

innodb_flush_method这个参数控制着innodb数据文件及redo log的打开、刷写模式&#xff0c;对于这个参数&#xff0c;文档上是这样描述的&#xff1a; 有三个值&#xff1a;fdatasync(默认)&#xff0c;O_DSYNC&#xff0c;O_DIRECT 默认是fdatasync&#xff0c;调用fsync()去…

Docker容器间网络通信

自从Docker容器出现以来&#xff0c;容器网络通信就一直是被关注的焦点&#xff0c;也是生产环境的迫切需求。容器网络通信又分为两大方面&#xff1a;单主机容器上的相互通信&#xff0c;和跨主机的容器相互通信。 一、Docker单主机容器通信 基于对net namespace的控制&#…