实时备份工具之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,一经查实,立即删除!

相关文章

nginx proxy_cache缓存详解

目录 1. 关于缓冲区指令 1.1 proxy_buffer_size1.2 proxy_buffering1.3 proxy_buffers1.4 proxy_busy_buffers_size1.5 proxy_max_temp_file_size1.6 proxy_temp_file_write_size1.7 缓冲区配置实例2. 常用配置项 2.1 proxy_cache_path2.2 proxy_temp_path2.3 proxy_cache2.4 …

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(密码) . …

Mysql高性能优化技能总结

数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用mysql保留关键字&#xff08;如果表名中包含关键字查询时&#xff0c;需要将其用单引号括起来&#xff09; 数据库对象的命名要能做到见名识意&#xff0c;并且最后不要超过32个…

Redis的AOF日志

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

Redis 核心技术与实战

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

redis核心技术与实战(二)缓存应用篇

1.《旁路缓存&#xff1a;redis 在缓存中工作原理》 1.缓存的两个特征 1.什么是缓存&#xff0c;有什么特征&#xff1f; 磁盘->内存->cpu 之间读写速度差异巨大&#xff0c;为了平衡他们之间的差异&#xff0c;操作系统默认使用了两种缓存&#xff1b; CPU 里面的末级…

redis核心技术与实战(三) 性能篇

影响redis性能主要有以下部分&#xff1a; Redis 内部的阻塞式操作&#xff1b; CPU核和NUMA架构 Redis关键系统配置 Redis内存碎片 Redis缓冲区 下面一个个来介绍这些地方 1.《redis 有哪些阻塞点&#xff1f;》 redis实例主要交互的对象有以下几点&#xff0c;我们依据下面这…

redis核心与实战(一)数据结构篇

1.《redis数据结构概览》 1.数据结构概览 数据模型&#xff1a;一共5种&#xff0c;String&#xff08;字符串&#xff09;、List&#xff08;列表&#xff09;、Hash&#xff08;哈希&#xff09;、Set&#xff08;集合&#xff09;和 Sorted Set&#xff08;有序集合&#xf…

redis核心技术与实战(四)高可用高扩展篇

1.《redis架构组成》 1.redis学习维度 2.一个基本的键值型数据库包括什么&#xff1f; 1.访问框架 redis通过网络框架进行访问&#xff0c;使得 Redis 可以作为一个基础性的网络服务进行访问&#xff0c;扩大了redis应用范围&#xff1b; 过程&#xff1a;如果客户端发送“pu…

tomcat监控脚本

#!/bin/sh# func:自动监控tomcat脚本并且执行重启操作# 获取tomcat进程ID&#xff08;其中[grep -w .....]中的.....需要替换为实际部署的tomcat文件夹名&#xff0c;如下&#xff09; TomcatID$(ps -ef |grep tomcat |grep -w /usr/local/tomcat/apache-tomcat-8.5.31|grep -v…

weblogic命令行操作

启动和停止子节点&#xff1a; [rootoud bin]# cd /sotware/oracle_ldap/Middleware/user_projects/domains/base_domain/bin/ [rootoud bin]# ./startManagedWebLogic.sh Server-0 http://192.168.63.129:7001 -Dweblogic.management.usernameweblogic -Dweblogic.management…

Ansible系列--Copy模块

copy模块 copy模块在ansible里的角色就是把ansible执行机器上的文件拷贝到远程节点上。 与fetch模块相反的操作 常用参数 参数名是否必须默认值选项说明srcno 用于定位ansible执行的机器上的文件&#xff0c;需要绝对路径。如果拷贝的是文件夹&#xff0c;那么文件夹会整体…

ANSIBLE--handlers的概念

handlers可以理解成另一种tasks&#xff0c;handlers是另一种’任务列表’&#xff0c;handlers中的任务会被tasks中的任务进行”调用”&#xff0c;但是&#xff0c;被”调用”并不意味着一定会执行&#xff0c;只有当tasks中的任务”真正执行”以后&#xff08;真正的进行实际…

ansible--- tags

tags可以帮助我们对任务进行’打标签’的操作&#xff0c;当任务存在标签以后&#xff0c;我们就可以在执行playbook时&#xff0c;借助标签&#xff0c;指定执行哪些任务&#xff0c;或者指定不执行哪些任务。在实际的使用中&#xff0c;我们应该让tags的值能够见名知义。 当…

ANSIBLE---变量

注册变量 ansible的模块在运行之后&#xff0c;其实都会返回一些”返回值”&#xff0c;只是默认情况下&#xff0c;这些”返回值”并不会显示而已&#xff0c;我们可以把这些返回值写入到某个变量中&#xff0c;这样我们就能够通过引用对应的变量从而获取到这些返回值了&…

inux中限制用户进程CPU和内存占用率

#!/bin/sh PIDStop -bn 1 | grep "^ *[1-9]" | awk { if($9 > 50 || $10 > 25 && id -u $2 > 500) print $1} echo $PIDS for PID in $PIDS dorenice 10 $PIDecho "renice 10 $PID" done

按月拆分数据库表--oracle

生产有一张日志表&#xff0c;数据量很大&#xff0c;需要按月进行存储&#xff0c;存储过程如下&#xff1a; CREATE OR REPLACE PROCEDURE NEWLOG4_SUB_TABLE IStable_name1 VARCHAR2(50);create_table_sql VARCHAR2(4000);insert_data_sql VARC…