rsync服务详解
rsync命令参数
-v, --verbose 显示输出过程
-z, --compress 压缩
-a, --archive 多参数集合(-rtopgDl)
-r, --recursive 递归
-t, --times 保持修改时间属性
-o, --owner 保持属主不变
-p, --perms 保持权限不变
-g, --group 保持用户组不变
-l, --links 保持拷贝软连接
-q, --quiet 安静的拷贝
--bwlimit=KBPS 限制I/O带宽,KBytes per second。
--delete 删除
--exclude 排除
--exclude-from 从文件中排除
# 常用组合:-avz或者-vzrtopg(rtopg=a)
rsync守护进程模式
服务端配置
首先要搭建rsync服务端(要有守护进程),然后才能在客户端实现推拉数据。
rsync服务模式:开启后台进程,接受别人访问。
# 1. 配置配置文件/etc/rsyncd.conf
cat > /etc/rsyncd.conf <<EOF
uid = rsync #指定启动用户
gid = rsync #指定组
use chroot = no #一个安全方面的配置,不配置也可以
max connections = 200 #设置最大连接数,默认为0,意思为无限制,负值为关闭这个模块
timeout = 600 #默认为0,意思为超时时间无限制
pid file = /var/run/rsyncd.pid #pid文件
lock file = /var/run/rsync.lock #指定lock文件
log file = /var/log/rsyncd.log #日志文件
ignore errors #忽略io错误
read only = false #指定客户端是否可以上传文件
list = false #是否允许客户端可以查看可用模块列表
hosts allow = 100.100.137.0/24 #指定可以连接的ip段
hosts deny = 0.0.0.0/32 #指定不可以连接的ip段,黑名单,拒绝和允许安全配置参数二选一进行配置
auth users = rsync_backup # 定义了一个需要进行身份验证的用户名列表。这意味着当客户端尝试连接到这个 rsync 服务时,它们必须提供一个在此列表中的用户名和对应的密码才能访问资源。
secrets file = /etc/rsync.password #指定用户名和密码存放的文件
[backup] #模块的名称
comment = welcome to zqf backup!
path = /backup/ #这个模块使用的路径
fake super = yes #允许非超级用户(即普通用户)在传输文件时保留文件的特殊属性,比如所有者、组信息以及设置权限等
EOF
# 2. 创建备份目录
mkdir /backup -p
# 3. 创建用户
useradd -s /sbin/nologin -M rsync
id rsync
uid=1003(rsync) gid=1003(rsync) 组=1003(rsync)
# 4. 授权rsync管理backup目录
chown -R rsync.rsync /backup
ls -ld /backup/
drwxr-xr-x 2 rsync rsync 6 6月 28 16:58 /backup/
# 5. 创建密码文件并设置权限,格式:用户:密码 ,#文件名随意起,但是要和rsyncd.conf secrets file = /etc/rsync.password一致。
echo "rsync_backup:1qaz@WSX" >/etc/rsync.password
chmod 600 /etc/rsync.password
# 6. 启动rsync服务和检查
systemctl start rsyncd
systemctl enable rsyncd
systemctl status rsyncd
netstat -lntup|grep rsync
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 7521/rsync
tcp6 0 0 :::873 :::* LISTEN 7521/rsync
客户端配置
在客户端服务器操作,配置认证密码文件并授权:
# 配置认证密码文件并授权: 以下方法2选1
# 方法1:认证密码文件
echo "1qaz@WSX" >/etc/rsync.password #只有密码,没有用户,密码和服务的配置相同。
chmod 600 /etc/rsync.password
方法2:配置环境变量
echo 'export RSYNC_PASSWORD=1qaz@WSX' >>/etc/bashrc
. /etc/bashrc
测试完成结果:
# 拉取实践
rsync -avz rsync_backup@100.100.137.200::backup /data --password-file=/etc/rsync.password
# 推送实践
rsync -avz /data/* rsync_backup@100.100.137.200::backup --password-file=/etc/rsync.password
rsync断点续传和限速
--partial 默认情况下,rsync将删除所有部分传输的文件,如果传输被中断。在某些情况下,保留部分已经传输的文件是所希望的。使用--partial参数告知rsync保留部分传输过的文件,可以使该文件剩余部分的传输更快速
--partial-dir=DIR 保留部分传输文件时,比--partial参数更好的方法是指定一个目录来保存部分数据(而不是将其写入目标文件)。在下一个传输过程中,rsync将使用这个dir中的文件作为数据,以加快恢复传输的速度,并在它达到目的后将其删除
--bwlimit=KBPS 这个参数允许指定数据最大传输速率为每秒多少K,当使用rsync传输大文件时,参数效果最有效(例如在兆字节以上时)。根据rsync传输的性质,采用数据块发送,如果rsync确定传输速度太快,可以在发送下一个数据块之前进行等待。使平均的传输速率等价于指定的限制速率。如果设定为0将不会做速率限制。
# 限速实践:
rsync -avz --bwlimit=100 /data/ rsync_backup@100.100.137.200::backup --password-file=/etc/rsync.password
# --bwlimit=100 限制传输带宽为 100 KB/s(单位:KB/s)。
主机之间数据无差异复制
rsync推送:数据备份,上传。本地有啥,远端就有啥,本地没有的远端有也要删除,会造成服务器端的目录数据丢失,在备份和上传场景一般不需要--delete功能,除非是像NFS实时复制数据到备份服务器上必须要保持两边一致的情形。
rsync无差异同步非常的危险,而且,有很多的替代方案,因此,生产场景没有特殊的需求,应避免使用。写了这么多内容的目的是警告读者,这个参数很危险,请慎用,切记
# 客户端推:服务端/backup目录数据丢失风险
# 让服务端/backup目录和客户端/null目录数据一致(服务端/backup目录数据丢失风险)
rsync -avz --delete /null/ rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
# 客户端拉:客户端/data目录数据丢失风险
# 让客户端/data目录和服务端/backup目录和数据一致(客户端/data目录数据丢失风险)
rsync -avz --delete rsync_backup@172.16.1.41::backup /data/ --password-file=/etc/rsync.password
sersync实时复制
Sersync项目利用inotify与rsync技术实现对服务器数据实时复制的解决方案,其中inotify用于监控sersync所在服务器上文件系统的事件变化,当事件发生变化时就调用rsync命令将变化的数据复制到远端服务器上。
sersync特点
- 使用c++编写,支持对监控的事件过滤功能。
- sersync采用xml配置文件,然后由守护进程启动,配置起来比inotify-tools更简单。
- 使用多线程进行复制,即可以并发复制多个不同文件。
- sersync自带出错处理机制,通过失败队列对出错的文件重新复制。
- sersync自带crontab功能,可实现对失败队列中的文件定时整体复制。
- sersync自带socket与http的协议扩展,可以满足有特殊需求的公司二次开发
sersync+rsync实时复制案例
- 大前提rsync daemon服务配置成功,可以在rsync客户端推送拉取数据,然后才能配置inotify服务。确保已经配置好rsync服务,并且能在客户端推送和拉取数据信息:
rsync -avz /data rsync_backup@100.100.137.200::backup --password-file=/etc/rsync.password
- 检查当前系统nfs01是否支持inotify实时监控,通过检查/proc/sys/fs/inotify目中是否存在以下三个文件,可以确认系统是否支持实时监控程序。
uname -r
3.10.0-957.1.3.el7.x86_64 #<==内核是3.10,支持inotify机制。
ls -l /proc/sys/fs/inotify/
total 0
-rw-r--r--. 1 root root 0 Apr 14 18:54 max_queued_events
-rw-r--r--. 1 root root 0 Apr 14 18:54 max_user_instances
-rw-r--r--. 1 root root 0 Apr 14 18:54 max_user_watches
- 在需要备份的机器安装配置sersync
wget https://github.com/wsgzao/sersync/blob/master/sersync2.5.4_64bit_binary_stable_final.tar.gz
tar -xf sersync2.5.4_64bit_binary_stable_final.tar.gz -C /usr/local/
cd /usr/local/
mv GNU-Linux-x86/ sersync
ls sersync/
confxml.xml sersync2
- sersync配置文件(confxml.xml):干两件事:
- 完成监控配置:inotifywait -mrq -e createFolder,close_write,delete,moveFrom,moveTo /data
- 完整命令拼接:rsync -avz /data rsync_backup@100.100.137.200::backup --password-file=/etc/rsync.password
- 启动sersync
./sersync2 -h
set the system param
execute:echo 50000000 > /proc/sys/fs/inotify/max_user_watches
execute:echo 327679 > /proc/sys/fs/inotify/max_queued_events
parse the command param
_______________________________________________________
参数-d:启用守护进程模式
参数-r:在监控前,将监控目录与远程主机用rsync命令推送一遍
c参数-n: 指定开启守护线程的数量,默认为10个
参数-o:指定配置文件,默认使用confxml.xml文件
参数-m:单独启用其他模块,使用 -m refreshCDN 开启刷新CDN模块
参数-m:单独启用其他模块,使用 -m socket 开启socket模块
参数-m:单独启用其他模块,使用 -m http 开启http模块
不加-m参数,则默认执行同步程序
________________________________________________________________
/usr/local/sersync/sersync2 -r -o /usr/local/sersync/confxml.xml -d
pstree -a -p 22911
sersync2,22911 -r -o /usr/local/sersync/confxml.xml -d
├─{sersync2},22915
├─{sersync2},22916
├─{sersync2},22917
├─{sersync2},22918
├─{sersync2},22919
├─{sersync2},22920
├─{sersync2},22921
├─{sersync2},22922
├─{sersync2},22923
├─{sersync2},22924
└─{sersync2},22925
# 这里可以看到sersyns是多线程的
配置systemctl start sersync启动方案
cat /usr/lib/systemd/system/sersync.service
[Unit]
Description=sersyncd service
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/sersync/sersync2 -r -o /usr/local/sersync/confxml.xml -d
PrivateTmp=true
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl start sersync.service
systemctl status sersync.service
systemctl enable sersync.service