rsync简介
一款快速增量备份工具:
rsync全称remote sync,是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件,是一种可以更高效、可以本地或远程同步的命令,之所以高效是因为rsync会对需要同步的源和目的进度行对比,只同步有改变的部分,所以比scp命令更高效,但是rsync本身是一种非加密的传输,可以借助-e选项来设置具备加密功能的承载工具进行加密传输。
Rsync使用所谓的“Rsync算法”来使本地和远 程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快
Rsync支持大多数的类Unix系统,无论是Linux、Solaris还是BSD上都经过了良好的测试
此外,它在windows平台下也有相应的版本,如cwRsync和Sync2NAS等工具
inotify简介
inotify是Linux内核2.6.13 (June 18, 2005)版本新增的一个子系统(API),它提供了一种监控文件系统(基于inode的)事件的机制,可以监控文件系统的变化如文件修改、新增、删除等,并可以将相应的事件通知给应用程序。该机制由著名的桌面搜索引擎项目beagle引入用于替代此前具有类似功能但存在诸多缺陷的dnotify。
inotify既可以监控文件,也可以监控目录。当监控目录时,它可以同时监控目录及目录中的各子目录及文件的。此外,inotify 使用文件描述符作为接口,因而可以使用通常的文件I/O操作select、poll和epoll来监视文件系统的变化。
rsync同步源
指备份操作的远程服务器,也称为备份源。
当B服务器是客户机及发起端时,B服务器同步A服务器的数据,A服务器就是备份源。
如果A服务器同步B服务器的数据,同理A服务器是客户机及发起端,B服务器就是备份源
rsync命令
#命令的用法
rsync [选项] 原始位置 目标位置
#----------常用选项--------------------------
-r:递归模式,包含目录及子目录中的所有文件。
-l:对于符号链接文件仍然复制为符号链接文件。
-v:显示同步过程的详细(verbose)信息。
-z:在传输文件时进行压缩(compress)。
-a:归档模式,保留文件的权限、属性等信息,等同于组合选项“-rlptgoD”。
-p:保留文件的权限标记。
-t:保留文件的时间标记。
-g:保留文件的属组标记(仅超级用户使用)。
-o:保留文件的属主标记(仅超级用户使用)。
-H:保留硬连接文件。
-A:保留 ACL 属性信息。
-D:保留设备文件及其他特殊文件。
--delete:删除目标位置有而原始位置没有的文件,即删除差异文件,保留一致性。
--checksum:根据校验和(而不是文件大小、修改时间)来决定是否跳过文件。
--password-file=file:从file中得到密码,用于免交互处理,file文件的权限要是600
配置rsync远程同步
IP | 主机 |
---|---|
10.10.10.4 | master |
10.10.10.5 | slave |
服务端-10.10.10.4
1、关防火墙、安装相应的软件
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
[root@localhost ~]# rpm -q rsync #检查是否安装,一般系统已默认安装rsync
[root@localhost ~]# yum -y install epel-release
[root@localhost ~]# yum -y install rsync
[root@localhost ~]# yum -y install inotify-tools
2、建立/etc/rsyncd.conf 配置文件
[root@localhost ~]# vim /etc/rsyncd.conf
# /etc/rsyncd: configuration file for rsync daemon mode
# See rsyncd.conf man page for more options.
# configuration example:
uid = root
gid = root
use chroot = no
max connections = 2000
pid file = /var/run/rsyncd.pid
lock file =/var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore erros
read only = false
list = false
host allow = 10.10.10.0/24
host deny = 0.0.0.0/24
auth users = rsync_backup
secrets file = /etc/rsync.password
# exclude = lost+found/
# transfer logging = yes
timeout = 600
# ignore nonreadable = yes
# dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
# [ftp]
# path = /home/ftp
# comment = ftp export area
[www]
comment = www
path = /data/www/
#---------------配置解释---------------
uid = root
gid = root
use chroot = yes # 禁锢在源目录
max connections = 2000 # 并发连接数
timeout = 600 # 超时时间(秒)
pid file =/var/run/rsyncd.pid # 指定rsync的pid目录
lock file =/var/run/rsync.lock # 指定rsync的锁文件【重要】
log file = /var/log/rsyncd.log # 指定rsync的日志目录
ignore errors # 忽略一些I/O错误
read only = false # 设置rsync服务端文件为读写权限
list = false # 不显示rsync服务端资源列表
hosts allow = 172.16.0.0/16 # 允许进行数据同步的客户端IP地址,可以设置多个,用英文状态下逗号隔开
hosts deny = 0.0.0.0/32 # 禁止数据同步的客户端IP地址,可以设置多个,用英文状态下逗号隔开
auth users = rsync_backup # 执行数据同步的用户名,可以设置多个,用英文状态下逗号隔开
secrets file =/etc/rsync.password # 用户认证配置文件,里面保存用户名称和密码
dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2 #同步时不再压缩的文件类型
--------------
[www] # 自定义名称
31 comment = www # rsync服务端数据目录路径
32 path = /data/www/ # 模块名称与[home_21yunwei]自定义名称相同
3、创建用户认证文件
无须建立同名系统用户
[root@localhost ~]# echo "rsync_backup:123456" > /etc/rsync.password
[root@localhost ~]# cat /etc/rsync.password
rsync_backup:123456
# 给创建的用户认证文件设置权限
[root@localhost ~]# chmod 600 /etc/rsync.password
4、启动、并创建相关待同步的目录
[root@localhost ~]# rsync --daemon
[root@localhost ~]# mkdir -p /data/www
客户端-10.10.10.5
1、安装inotify
[root@localhost ~]# yum -y install epel-release
[root@localhost ~]# yum -y install rsync
[root@localhost ~ ]# yum -y install inotify-tools
2、创建rsync配置文件,客户端创建即可,无需内容
# 如有此文件也课不创建
[root@localhost ~ ]# touch /etc/rsyncd.conf
2、配置rsync客户端相关权限认证
[root@localhost ~]# echo "123456">/etc/rsync.password
[root@localhost ~]# chmod 600 /etc/rsync.password
3、创建待同步数据
[root@localhost ~]# mkdir -p /data/www
[root@localhost ~]# touch /data/www/www.log
4、 测试rsync是否同步 (在rsync-client上做)
[root@localhost ~ ]# cd /data/www
[root@localhost www]# touch {1..3}.txt
[root@localhost www]# rsync -avzP /data/www/ rsync_backup@10.10.10.4::www/ --password-file=/etc/rsync.password
# 测试文件是否同步
/data/www/表示本地需要同步的数据目rsync_backup@10.10.10.4::www表示服务端的指定名称的模块下 本条命令执行的操作为:将第一个路径参数下的文件同步到第二个路径参数下 即:推模式 调换路径则为:拉模式
若在rsync-server发现成功传输,则继续执行下面步骤。
5、编写脚本
脚本所在地随意
[root@localhost ~ ]# vim /data/www/rsync.sh
#!/bin/bash
src=/data/www # 本地需要同步的数据目录
des=www # 服务端的指定名称的模块
rsyncPasswdFile=/etc/rsync.password # 客户端连接服务端密码文件所在目录
remoteIp=10.10.10.5 # 客户端IP
user=rsync_backup # 服务端创建的esync执行数据同步的用户名
cd ${src}
inotifywait -mrq --format '%Xe %w%f' -e modify,create,delete,attrib,close_write,move ./ | while read file
do
INO_EVENT=$(echo $file | awk '{print $1}')
INO_FILE=$(echo $file | awk '{print $2}')
echo "---------------------------$(date)--------------------------------"
echo $file
#增加、修改、写入完成、移动进事件
if [[ $INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'MODIFY' ]] || [[ $INO_EVENT =~ 'CLOSE_WRITE' ]] || [[ $INO_EVENT =~ 'MOVED_TO' ]]
then
echo '增加、修改、写入完成、移动进事件'
rsync -avzcR --password-file=${rsyncPasswdFile} $(dirname ${INO_FILE}) ${user}@${remoteIp}::${des}
fi
#删除、移动出事件
if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]]
then
echo '删除、移动出事件'
rsync -avzR --delete --password-file=${rsyncPasswdFile} $(dirname ${INO_FILE}) ${user}@${remoteIp}::${des}
fi
#修改属性事件 指 touch chgrp chmod chown等操作
if [[ $INO_EVENT =~ 'ATTRIB' ]]
then
echo '修改属性事件'
if [ ! -d "$INO_FILE" ]
then
rsync -avzcR --password-file=${rsyncPasswdFile} $(dirname ${INO_FILE}) ${user}@${remoteIp}::${des}
fi
fi
done