Rsync 概述
Rsync 是一个开源的快速备份工具, 可以在不同主机之间镜像同步整个目录树, 支持增量备份, 保持链接和权限, 且采用优化的同步算法, 在传输钱执行压缩, 因此非常适用于异地备份, 镜像服务器等应用.
Rsync 的官方网站是 http://rsync.samba.org/ , 由 Wayne Davison 进行维护. 作为一种最常见的文件备份工具, Rsync 往往是 Linux 和 UNIX 系统默认安装的基本组件之一.
Rsync 的优点
Rsync 与传统的 cp,tar 备份方式相比, 具有安全性高, 备份迅速, 支持增量备份等优点, 通过 rsync 可以解决对实时性要求不高的数据备份需求, 例如定期的备份文件服务器数据到远端服务器, 对本地磁盘定期做数据镜像等.
Rsync 的缺点
随着应用系统规模的不断扩大, 对数据的安全性和可靠性也提出的更好的要求, rsync 在高端业务系统中也逐渐暴露出了很多不足, 首先, rsync 同步数据时, 需要扫描所有文件后进行比对, 进行差量传输. 如果文件数量达到了百万甚至千万量级, 扫描所有文件将是非常耗时的. 而且正在发生变化的往往是其中很少的一部分, 这是非常低效的方式. 其次, rsync 不能实时的去监测, 同步数据, 虽然它可以通过 Linux 守护进程的方式进行触发同步, 但是两次触发动作一定会有时间差, 这样就导致了服务端和客户端数据可能出现不一致, 无法在应用故障时完全的恢复数据. 基于以上原因, rsync+inotify 组合出现了!
inotify 概述
inotify 是一种强大的, 细粒度的, 异步的文件系统事件监控机制, Linux 内核从 2.6.13 起, 加入了 inotify 支持, 通过 Inotify 可以监控文件系统中添加, 删除, 修改, 移动等各种细微事件, 利用这个内核接口, 第三方软件就可以监控文件系统下文件的各种变化情况, 而 inotify-tools 就是这样的一个第三方软件.
Rsync 可以实现触发式的文件同步, 但是通过 Crontab 守护进程方式进行触发, 同步的数据和实际数据会有差异, 而 Inotify 可以监控文件系统的各种变化, 当文件有任何变动时, 就触发 Rsync 同步, 这样刚好解决了同步数据的实时性问题.
部署环境
主机 | 操作系统 | IP 地址 | 用于同步的目录 | 主要软件包 |
---|---|---|---|---|
Server1 | CentOS 7.4 x86_64 | 192.168.125.117 | /test | rsync-3.0.9-18.el7.x86_64、inotify-tools-v3.14-8.le7.x86_64 |
Server2 | CentOS 7.4 x86_64 | 192.168.125.118 | /test | rsync-3.0.9-18.el7.x86_64、inotify-tools-v3.14-8.le7.x86_64 |
开始部署
在此我们部署服务使主机 Server1 的数据推向主机 Server2 , 而双向同步即在此基础上在主机 Server2 上部署服务使数据推向主机 Server1 . 至此, 我们只要在两台服务器的任意一台更改数据都会同步到另外一台, 从而实现双机同步.
数据从 Server1 上同步到 Server2
两台机器配置 rsync 服务 (配置文件要修改为对方主机)
安装 Rsync 软件包
- tar zxvf rsync-3.1.3.tar.gz -C /opt
- cd /opt/rsync_3.1.3
- ./configure
- make && make install
修改 rsync 配置文件
# VIM /etc/rsyncd.conf
...... 省略部分信息......
- uid = nobody
- gid = nobody
- use chroot = yes // 禁锢在源目录
- address = 192.168.125.117 // 监听地址
- port 873 // 监听端口
- log file = /var/log/rsyncd.log // 日志文件路径
- pid file = /var/run/rsyncd.pid // 进程 ID 文件路径
- hosts allow = 192.168.125.0/24 // 允许访问的客户机地址
- [wwwroot] // 共享模块名称
- path = /web1/wwwroot // 源目录的实际地址
- comment = www.wzn.cn
- read only = no // 是否为只读
- dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2 // 同步时 不再压缩的文件类型
- auth users = web1user // 授权账户
- secrets file = /etc/rsyncd_users.db // 存放账户信息的数据文件
为备份账户创建数据文件, 源目录
- # VIM /etc/rsyncd_users.db
- backuper:abc123
- # chmod 600 /etc/rsyncd_users.db
- # mkdir -p /web1/wwwroot
- # chmod 777 /web1/wwwroot
- # chown -R nobody:nobody /web1/wwwroot
启动 rsync, 并加入系统自启动文件
- # rsync --daemon #运行参数为 --daemon
- # ps -ef | grep rsync
- # echo "/usr/local/bin/rsync --daemon">> /etc/rc.local
Rsync 命令的基本用法
-a 归档模式, 表示以递归方式传输文件, 并保持所有文件属性, 等于 - rlptgoD.
-z 对备份的文件在传输时进行压缩处理.
-H 保留硬链结.
-D 保持设备文件信息.
-A 保留 ACL 属性信息
--delete 删除那些目标位置有而原始位置没有的文件.
--checksum 打开校验开关, 强制对文件传输进行校验.
安装 inotify-tools(需要 gcc,gcc-c++ 软件包支持)
- # tar zxvf inotify-tools-3.14.tar.gz -C /opt
- # cd /opt/inotify-tools-3.14
- # ./configure
- # make && make install
Inotify 命令的基本用法
-m 表示持续监控
-r 表示递归整个目录
-q 简化输出信息
inotifywait 可监控: modify 修改, create 创建, move 移动, delete 删除
编写 shell 脚本配置内容发布节点
- # VIM /Web/inotifyrsync.sh
- #!/bin/bash
- host1=192.168.125.117
- src=/Web/wwwroot/
- dst1=web1
- user1=web1user
- /usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e close_write,delete,create,attrib $src | while read files
- do
- /usr/bin/rsync -vzrtopg --delete --progress --password-file= /etc/rsyncd_users.db $src $user1@$host1::$dst1> /dev/null 2>&1
- echo "${files} was rsynced.">> /tmp/rsync.log 2>&1
- done
为脚本指定可执行权限, 放入后台执行, 并加入系统自启动文件
- chmod 755 /Web/inotifyrsync.sh
- /Web/inotifyrsync.sh &
- echo "/Web/inotifyrsync.sh &">> /etc/rc.local
调整 inotify 内核参数
# VIM /etc/sysctl.conf
fs.inotify.max_queued_events = 16384 监控事件队列 (16384)
fs.inotify.max_user_instances = 1024 最多监控实例数 (1024)
fs.inotify.max_user_watches = 1048576 每个实例最多监控文件数 (1048576)
此时我们在 Server1 服务器上变更数据会在 Server2 上同步, 此时我们使用同样的方法使 Server2 的数据及时同步到 Server1 服务器, 即可实现双机同步.
来源: http://www.bubuko.com/infodetail-2788349.html