rsync+inotify-tools自动备份服务详解
1、rsync概述
rsync是linux系统下的数据镜像备份工具。使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他SSH、rsync主机同步,端口号=873
2、应用场景
应用场景 | 说明 |
---|---|
rsync作为命令使用 | 临时拉取,推送数据.未来这个需求可以通过scp命令实现 |
rsync+crond | 定时备份,定期备份案例.(定时任务进行备份+通过rsync传输备份)不常用->文件达到一定数量时会导致数据差异 |
rsync+inotify | Inotify是一种强大的、细粒度的、异步的文件系统事件监控机制,可以监控文件系统的各种变化,当文件有任何变动时,就触发rsync同步 |
rsync+inotify+sersync | 将前两个服务监控和传输进行整合->常用 |
3、rsync本地模式->不常用
rsync -a /etc/ /tmp/ #将etc目录传输到/tmp下
rsync -a /etc /tmp/
在rsync对于目录 /etc/ /etc 是有区别的
/etc /etc目录+目录的内容
/etc/ /etc/目录下面的内容
4、rsync远程模式
#推送
第1次
rsync -av /etc root@10.0.0.31:/tmp #将本地etc目录传输到目标端/tmp下
第二次
rsync -av /etc root@10.0.0.31:/tmp #发现推送失败,没有传输任何东西,因为rsync服务是增量备份,当目录无变化时不会推送
#拉取
rsync -av root@10.0.0.31:/etc /tmp #将目标端etc目录传输到本地tmp下
5、rsync常见参数
命令 | 释义 |
---|---|
-a | 归档模式,表示以递归方式传输文件,并保持所有文件属性 相当于-rlptgoD -r递归复制 -l复制软连接 -p保持权限不变 -m保持修改时间不变 -o所有者不变 -g用户组不变 -D devices specials 设备与特殊文件 |
-v | 详细模式输出 |
-q | 精简输出模式 |
-r | 对子目录以递归模式处理 |
-p | 保持文件权限 |
-P | 显示传输速度 等同于 --partial 保留那些因故没有完全传输的文件,以是加快随后的再次传输 |
-z | 对备份的文件在传输时进行压缩处理(公网) |
-H | 保留硬链结 |
-–port | 指定其他的rsync服务端口 |
-–progress | 在传输时显示备份过程 |
–-delete | 目标目录与源目录保持一致的传输(高度保持2遍一致,实时同步) |
-–password-file | 从FILE中得到密码->指定密码文件 |
–bwlimit | 限速,注意不要与-z一起使用 |
–exclude –exclude-from | 从需要传输的列表中排除文件 当需要排除的文件太多时,创建一个文件,文件里写需要排除的文件名字,然后指定这个文件进行排除文件内容里的文件 |
6、守护进程模式
6.1 安装rsync软件
yum install -y rsync
#检查软件包内容
/etc/rsyncd.conf #服务端配置文件
/usr/bin/rsync #命令
/usr/lib/systemd/system/rsyncd.service #systemctl对应的配置文件
6.2 配置文件rsyncd.conf
cat /etc/rsyncd.conf
#created by oldboy 15:01 2009-6-5
##rsyncd.conf start##
fake super =yes #伪装成root权限 C7不开启的话会报错
uid = rsync #rsync运行虚拟用户
gid = rsync #rsync运行虚拟用户
use chroot = no
max connections = 2000 #最大连接数
timeout = 600 #连接超时时间
pid file = /var/run/rsyncd.pid #存放服务的pid号文件
lock file = /var/run/rsync.lock #进程/服务的锁文件,放置重复运行
log file = /var/log/rsyncd.log #rsync服务端日志文件
ignore errors #忽略错误
read only = false #可以进行读写
list = false #关闭服务端列表功能
#hosts allow = 10.0.0.0/24 #只允许某网段访问->白名单
#hosts deny = 0.0.0.0/32 #不允许某网段访问->黑名单
auth users = rsync_backup #rsync服务端进行验证用的用户名
secrets file = /etc/rsync.password #rsync服务端用于验证的密码文件
#####################################
[data] #模块名字,用户访问服务端的时候指定
comment = beifen #此模块的注释说明
path = /data #模块对应存放数据的目录
[backup]
comment = beifen
path = /backup
6.3 后续配置
1、添加虚拟用户
useradd -s /sbin/nologin -M rsync
2、创建密码文件
密码文件格式:用户名:密码
echo 'rsync_backup:1' >/etc/rsync.password
chmod 600 /etc/rsync.password #服务机制,必须要修改权限
3、创建存放数据的目录
mkdir /data/
chown -R rsync.rsync /data/
4、启动服务
systemctl start rsyncd
systemctl enable rsyncd
6.4 测试
#客户端向服务端传输/etc/hosts
rsync -avz /etc/hosts rsync_backup@10.0.0.41::data
Password:
sending incremental file list
hosts
sent 215 bytes received 43 bytes 172.00 bytes/sec
total size is 329 speedup is 1.2
#指定密码文件不使用交互模式传输->免密传输
rsync -avz /etc/hostname rsync_backup@10.0.0.41::data --password-file=/etc/clint.passwd
sending incremental file list
hostname
sent 100 bytes received 43 bytes 95.33 bytes/sec
total size is 6 speedup is 0.04
6.5 守护进程传输文件流程
1、用户执行命令:rsync -avz /tmp/etc.tar.gz rsync_backup@10.0.0.31::data passwordfile=/etc/clint.passwd
2、服务端收到数据:判断rsync_backup用户,然后等待输入密码
3、把用户名和密码与配置文件里面对比auth user和secretsfile
4、通过后,传输数据
5、数据到达服务器所有者被修改为uid和gid指定的(rsync)
6、数据写入data模块(/data/)目录下面
7、inotify配置
7.1 安装inotify服务
yum install -y inotify-tools
7.2 编写inotify.sh脚本
vim /servers/scripts/inotify.sh
#!/bin/bash
source /etc/profile
host=10.0.0.41 #目标服务器的ip(备份服务器)
src=/opt/ #在源服务器上所要监控的备份目录(此处可以自定义,但是要保证存在)
des=data #自定义的模块名,需要与目标服务器上定义的同步名称一致
password=/etc/clint.passwd #执行数据同步的密码文件
user=rsync_backup #执行数据同步的用户名
inotifywait=/usr/bin/inotifywait #inotify服务里命令的绝对路径
$inotifywait -mrq --timefmt '%Y%m%d %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src | while read files;do
rsync -avzP --delete --timeout=100 --password-file=${password} $src $user@$host::$des
echo "${files} was rsynced" >>/tmp/rsyn.log 2>&1
done
7.3 启动脚本
chmod 755 /servers/scripts/inotify.sh #授权脚本
ps -ef |grep inotify
[root@nfs01 /root]
nohup bash /servers/scripts/inotify.sh & #后台运行脚本
[1] 4114
[root@nfs01 /root]
$nohup: ignoring input and appending output to ‘nohup.out’
ps -ef |grep inotify #检查是否运行成功
root 4114 1893 0 17:36 pts/0 00:00:00 bash /servers/scripts/inotify.sh
root 4124 4114 0 17:36 pts/0 00:00:00 /usr/bin/inotifywait -mrq --timefmt %Y%m%d %H:%M --format %T %w%f%e -e modify,delete,create,attrib /opt/
root 4125 4114 0 17:36 pts/0 00:00:00 bash /servers/scripts/inotify.sh
root 4129 1893 0 17:36 pts/0 00:00:00 grep --color=auto inotify
7.4 检查监控目录是否实时同步
#在客户端/opt/目录创建文件
touch test{01..10}.txt
#客户端查看日志
tail -10f /tmp/rsync.log
#检查服务端data目录是否同步
ll /data/
7.5 设置脚本开机自启动
chmod +x /etc/rc.d/rc.local
echo 'nohup /bin/bash /servers/scripts/inotify.sh' >> /etc/rc.d/rc.local
tail /etc/rc.d/rc.local #检查