1、Rsync概述
1.1、数据同步分类
-
sync
数据同步,是强制性将缓存中的数据写入到硬盘中,也就是数据修改后立即保存数据,一般用于实时性要求较高的场景
-
async
数据异步,先将数据写入缓存,然后再周期性的去将数据同步到硬盘,该方法一般适用于大批量数据同步的场景
-
rsync
远程数据同步
1.2、 rsync的特点
- 可以镜像保存整个目录树和文件系统
- 可以保留文件原有的所有信息,包括权限、属主、属组、时间、软硬连接等等
- 传输效率高,使用同步算法,进行增量备份
- 支持匿名传输,方便网站镜像;也可以做验证,加强安全
1.3、rsync与scp的区别
- 二者都可以做数据同步,但 rsync 功能相对更强大
- rsync 支持增量备份,scp 不支持
- rsync 做数据同步时,可以保持文件的所有属性,scp 不支持
2、rsync的简单使用
2.1、基本使用语法
-
本地同步
rsync [OPTION...] SRC... [DEST]
-
使用shell远程同步
# 上传到备份服务器 rsync [OPTION...] SRC... [USER@]HOST:DEST # 从备份服务器下载到本地 rsync [OPTION...] [USER@]HOST:SRC... [DEST]
-
常用选项
-a:归档模式,递归方式传输文件,并保持文件的属性(常用)
-v:显示详细信息(常用)
2.2、本地文件同步
-
常用同步方法
[root@centos7_11 ~]# mkdir {data,data_bak} [root@centos7_11 ~]# ls /etc > data/doc1 [root@centos7_11 ~]# ls data doc1 [root@centos7_11 ~]# rsync -av data/* data_bak/ sending incremental file list doc1 sent 1,842 bytes received 35 bytes 3,754.00 bytes/sec total size is 1,752 speedup is 0.93 [root@centos7_11 ~]# ls data_bak/ doc1 [root@centos7_11 ~]# echo '1234567890' > data/doc2 [root@centos7_11 ~]# ls data doc1 doc2 [root@centos7_11 ~]# rsync -av data/* data_bak/ sending incremental file list doc2 sent 118 bytes received 35 bytes 306.00 bytes/sec total size is 1,763 speedup is 11.52
注意: 在同步文件时,需要注意源路径 /data 与 /data/ 的区别,前者会将自身目录一起复制到备份路径下,而后者只会复制源路径下的文件
-
删除目标路径下的多余文件
我们可以使用
--delete
选项,将目标路径下的多余文件删除,保证目标路径下的文件和源路径下的文件相同[root@centos7_11 ~]# ls /etc/ > data_bak/doc3 [root@centos7_11 ~]# ls data data_bak/ data: doc1 doc2 data_bak/: doc1 doc2 doc3 [root@centos7_11 ~]# rsync -av --delete data/ data_bak/ sending incremental file list deleting doc3 ./ sent 87 bytes received 27 bytes 228.00 bytes/sec total size is 1,763 speedup is 15.46 [root@centos7_11 ~]# ls data data_bak/ data: doc1 doc2 data_bak/: doc1 doc2
2.3、远程文件同步
- 服务器端:192.168.137.12
- 客户端:192.168.137.10
2.3.1、服务器端安全配置
-
SELinux设置
# 永久关闭 [root@centos_12 ~]# vim /etc/selinux/config SELINUX=disabled # 临时关闭 [root@centos_12 ~]# setenforce 0
-
防火墙配置
# 开通873端口 [root@centos_12 ~]# firewall-cmd --zone=public --add-port=873/tcp --permanent success # 重载firewalld配置 [root@centos_12 ~]# firewall-cmd --reload success # 重启firewalld服务 [root@centos_12 ~]# systemctl restart firewalld
2.3.2、上传文件到服务器
[root@centos7_11 ~]# rsync -av data/* root@192.168.137.12:/data_bak
root@192.168.137.12's password:
sending incremental file list
created directory /data_bak
doc1
doc2
sent 1,913 bytes received 86 bytes 571.14 bytes/sec
total size is 1,763 speedup is 0.88
2.3.3、从服务器下载数据到本地
[root@centos7_11 ~]# rsync -av root@192.168.137.12:/data_bak/* /data/
receiving incremental file list
created directory /data
doc1
doc2
sent 62 bytes received 1,913 bytes 3,950.00 bytes/sec
total size is 1,763 speedup is 0.8
[root@centos7_11 ~]# ls /data/
doc1 doc2
2.3.4、配置免密进行数据同步
配置 SSH RSA 登录认证即可
[root@centos7_11 ~]# ssh-keygen -t rsa -P ""
[root@centos7_11 ~]# ssh-copy-id root@192.168.137.12
2.3.5、与ssh使用非默认端口的服务器进行数据同步
[root@centos7_11 ~]# rsync -e "ssh -p 2001" -av /data/* root@192.168.137.12:/data_bak/
3、把rsync作为系统服务
3.1、配置远程备份服务器
3.1.1、服务器端安全配置
3.1.2、创建用于数据备份的系统用户
[root@centos_12 ~]# useradd -M -s /sbin/nologin rsync
3.1.3、创建rsync认证文件
认证文件内容格式 用户名:密码
[root@centos_12 ~]# echo 'user01:1234' > /etc/rsyncd.secrets
[root@centos_12 ~]# chmod 600 /etc/rsyncd.secrets
3.1.4、创建用于备份的目录
[root@centos_12 ~]# mkdir /root/data_bak/
[root@centos_12 ~]# chown -R rsync:rsync /root/data_bak/
3.1.5、创建rsyncd.conf配置文件
[root@centos_12 ~]# vim /etc/rsyncd.conf
# 全局配置
uid = rsync
gid = rsync
port = 873
use chroot = yes
max connections = 4
pid file = /var/run/rsyncd.pid
exclude = lost+found/
timeout = 600
transfer logging = yes
ignore nonreadable = yes
dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
fake super = yes
ignore errors
read only = false
list = false
auth users = user01,user02
secrets file = /etc/rsyncd.secrets
log file = /var/log/rsyncd.log
# 模块配置
[data_bak]
comment = data backup directory
path = /root/data_bak/
配置参数:
uid:所属用户
gid:所属用户组
port:监听端口
use chroot:禁止切换目录
pid file:pid文件路径
exclude:忽略的目录
transfer logging:是否记录日志
ignore nonreadable:忽略不可读的文件
dont compress:不压缩的文件类型
fake super:是否允许使用非root用户运行守护程序
max connections:最大连接数
timeout:超时时间
ignore errors:忽略错误信息
read only:只读模式
list:是否允许查看模块信息
auth users:指定允许登录的客户端认证用户清单,多个用户使用逗号分隔,且必须是secrets file文件中配置的用户,该参数可以在全局中配置,也可以在模块中配置,在模块中配置仅对该模块生效
secrets file:rsync客户端用户认证的密码文件,配合 “auth users” 参数使用,该参数可以在全局中配置,也可以在模块中配置,在模块中配置仅对该模块生效
log file:日志文件
[NAME]:模块名称
comment:模块说明
path:模块路径
3.2、客户端操作
3.2.1、测试服务器连接
前提是需要设置参数: list = yes
[root@centos_11 ~]# rsync -a root@192.168.137.12::
# 模块名称 模块说明
data_bak data backup directory
3.2.2、同步数据到服务端
[root@centos_11 ~]# rsync -av /data/* user01@192.168.137.12::data_bak
Password:
sending incremental file list
doc1
sent 929 bytes received 43 bytes 648.00 bytes/sec
total size is 1,738 speedup is 1.79
[root@centos_11 ~]# echo '1234567890' > /data/test.txt
[root@centos_11 ~]# rsync -av /data/* user01@192.168.137.12::data_bak
Password:
sending incremental file list
test.txt
sent 152 bytes received 43 bytes 55.71 bytes/sec
total size is 1,781 speedup is 9.13
3.2.3、配置自动添加密码同步
# 创建user01的用户密码
[root@centos_11 ~]# echo '1234' > /etc/user01.passwd
# 修改密码文件权限
[root@centos_11 ~]# chmod 600 /etc/user01.passwd
# 同步文件
[root@centos_11 ~]# rsync -av /data/* user01@192.168.137.12::data_bak --password-file=/etc/user01.passwd
sending incremental file list
sent 69 bytes received 20 bytes 178.00 bytes/sec
total size is 1,781 speedup is 20.01
3.2.4、配置rsync实时数据同步
一般情况下我们使用定时任务来执行 rsync 数据同步,如果需要实时的对数据监控,并进行实时数据同步,那么可以使用 rsync 配合 inotify-tools 的方式实现。inotify-tools 主要用于对指定的文件或目录进行实时监控,如果被监控目标出现变化,就可以触发命令的执行
-
安装依赖包
[root@centos_11 ~]# yum install autotools-dev automake libtool -y
-
安装inotify-tools
inotify-tools 项目地址:https://github.com/inotify-tools/inotify-tools
[root@centos_11 ~]# tar -xf inotify-tools-3.22.6.0.tar.gz [root@centos_11 ~]# cd inotify-tools-3.22.6.0 [root@centos_11 ~]# ./autogen.sh && ./configure --prefix=/usr && make && make install
-
创建任务脚本
[root@centos_11 ~]# vim inotify.sh #!/usr/bin/bash # fine_name:inotify.sh /usr/bin/inotifywait -mrq -e modify,delete,create,attrib,move /data | while read events do rsync -av --delete /data/ root@192.168.137.12::data_bak echo "`date +%F\ %T` 发生事件:$events" >> /var/log/rsync.log done
-
后台执行任务
[root@centos_11 ~]# nohup ./inotify.sh &
-
查看后台任务
[root@centos_11 ~]# jobs [1]+ 运行中 nohup ./inotify.sh &
-
将后台任务放到前台运行
[root@centos_11 ~]# fg 1
注意:如果在执行脚本时,出现 /usr/bin/inotifywait: error while loading shared libraries: libinotifytools.so.0: cannot open shared object file: No such file or directory 请执行 ln -s /usr/lib/libinotifytools.so.0 /usr/lib64/