rsync功能特性
支持拷贝普通文件与特殊文件,如链接文件,设备文件等。
支持排除指定文件或目录同步的功能,相当于打包命令tar的排除功能。
可以做到保持原文件或目录的权限、时间、软硬链接、属主、组等所有属性均不改变。
可实现增量复制,既只复制发生变化的数据,因此数据传输效率很高。
可以使用rcp,rsh,ssh等方式来配合进行隧道加密传输文件(rsync本身不对数据加密)。
可以通过socket(进程方式)传输文件和数据(服务端和客户端)*。
支持匿名或认证(无需系统用户)进程模式传输,安全的进行数据备份及镜像
增量复制原理
使用quick check算法,只对增量的部分复制,根据大小属性的变化进行复制。
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服务模式:开启后台进程,接受别人访问。
配置配置文件【/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 = 172.16.1.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 oldboyedu backup!
path = /backup/ #这个模块使用的路径
fake super = yes #允许非超级用户(即普通用户)在传输文件时保留文件的特殊属性,比如所有者、组信息以及设置权限等
EOF
备份的地点 /backup
mkdir /backup -p
创建一个用户
useradd -s /sbin/nologin -M rsync
id rsync
uid=1003(rsync) gid=1003(rsync) 组=1003(rsync)
授权rsync管理backup目录
chown -R rsync.rsync /backup
ls -ld /backup/
drwxr-xr-x 2 rsync rsync 6 6月 28 16:58 /backup/
创建密码文件并设置权限
格式:用户:密码
rsync_backup:oldboy123
echo "rsync_backup:oldboy123" >/etc/rsync.password
cat /etc/rsync.password
rsync_backup:oldboy123
#文件名随意起,但是要和rsyncd.conf secrets file = /etc/rsync.password一致。
设定权限:
chmod 600 /etc/rsync.password
ls -l /etc/rsync.password
启动rsync服务和检查
systemctl start rsyncd
systemctl enable rsyncd
systemctl status rsyncd
ps -ef|grep sync|grep -v grep #检查进程
root 7521 1 0 11:39 ? 00:00:00 /usr/bin/rsync --daemon --no-detach
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
lsof -i :873 #检查端口
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rsync 7521 root 3u IPv4 41439 0t0 TCP *:rsync (LISTEN)
rsync 7521 root 5u IPv6 41440 0t0 TCP *:rsync (LISTEN)
客户端配置
在客户端服务器操作(任何一台机器),nfs01
配置认证密码文件并授权
以下方法2选1
方法1:认证密码文件
echo "oldboy123" >/etc/rsync.password #只有密码,没有用户,密码和服务的配置相同。
chmod 600 /etc/rsync.password
cat /etc/rsync.password
oldboy
ls -l /etc/rsync.password
-rw------- 1 root root 7 4月 15 11:55 /etc/rsync.password
方法2:
echo ' export RSYNC_PASSWORD=oldboy123' >>/etc/bashrc
tail -1 /etc/bashrc
export RSYNC_PASSWORD=oldboy
. /etc/bashrc
echo $RSYNC_PASSWORD
oldboy
测试完成结果
pull,拉:从远端拉取到本地。
语法1(常用):
rsync [OPTION...] [USER@]HOST::SRC... [DEST]
rsync命令 参数选项 [虚拟用户]@[主机地址]::[模块名] 本地路径
语法2:
rsync [OPTION...] rsync://[USER@]HOST::SRC... [DEST]
rsync命令 参数选项 rsync://[虚拟用户]@[主机地址]/[模块名] 本地路径
push,推:从本地推到远端。
语法1(常用):
语法1(常用):
rsync [OPTION...] [DEST] [USER@]HOST::SRC...
rsync命令 参数选项 本地路径 [虚拟用户]@[主机地址]::[模块名]
语法2:
rsync [OPTION...] [DEST] rsync://[USER@]HOST::SRC...
rsync命令 参数选项 本地路径 rsync://[虚拟用户]@[主机地址]/[模块名]
拉取实践
rsync -avz rsync_backup@172.16.1.41::backup /data --password-file=/etc/rsync.password
receiving incremental file list
./
oldboy1/
oldboy2/
oldboy3/
sent 39 bytes received 140 bytes 358.00 bytes/sec
total size is 0 speedup is 0.00
ls /data
oldboy1 oldboy2 oldboy3
成功拉回。
推送实践
rsync -avz /data rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
断点续传和限速
--partial 默认情况下,rsync将删除所有部分传输的文件,如果传输被中断。在某些情况下,保留部分已经传输的文件是所希望的。使用--partial参数告知rsync保留部分传输过的文件,可以使该文件剩余部分的传输更快速
--partial-dir=DIR 保留部分传输文件时,比--partial参数更好的方法是指定一个目录来保存部分数据(而不是将其写入目标文件)。在下一个传输过程中,rsync将使用这个dir中的文件作为数据,以加快恢复传输的速度,并在它达到目的后将其删除
--bwlimit=KBPS 这个参数允许指定数据最大传输速率为每秒多少K,当使用rsync传输大文件时,参数效果最有效(例如在兆字节以上时)。根据rsync传输的性质,采用数据块发送,如果rsync确定传输速度太快,可以在发送下一个数据块之前进行等待。使平均的传输速率等价于指定的限制速率。如果设定为0将不会做速率限制。
上市公司运维总监的下属:
某上市公司,白天高峰期某DBA人员从数据库服务器通过rsync将上百GB数据复制到备份服务器,导致数据库库服务器带宽占满,造成用户无法访问网站的悲剧。其实可以利用rsync限速功能,将复制速度限制在剩余带宽的1/3或者1/2,可能就不会出现故障了,当然了,高峰期最好不做大数据复制行为,这里利用限速功能模拟测试:
限速实践:
rsync -avz --bwlimit=100 /data/ rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
主机之间数据无差异复制
守护进程模式
客户端推:服务端/backup目录数据丢失风险
rsync -avz --delete /null/ rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
#让服务端/backup目录和客户端/null目录数据一致(服务端/backup目录数据丢失风险)
客户端拉:客户端/data目录数据丢失风险
rsync -avz --delete rsync_backup@172.16.1.41::backup /data/ --password-file=/etc/rsync.password
#让客户端/data目录和服务端/backup目录和数据一致(客户端/data目录数据丢失风险)
rsync推送:数据备份,上传。
本地有啥,远端就有啥,本地没有的远端有也要删除,会造成服务器端的目录数据丢失,在备份和上传场景一般不需要--delete功能,除非是像NFS实时复制数据到备份服务器上必须要保持两边一致的情形。
rsync拉取企业工作场景:代码发布,下载(官方yum源)。
远端有啥,本地(客户端)就有啥,远端没有的本地有也要删除。会造成本地目录数据丢失。
无差异复制两台服务器之间,必须要求数据一致,且时时性又不是很高的情况,如两台负载均衡下面Web服务器之间的同步,或者高可用双机配置之间的同步、NFS共享数据的实时复制等。rsync无差异同步非常的危险,而且,有很多的替代方案,因此,生产场景没有特殊的需求,应避免使用。写了这么多内容的目的是警告读者,这个参数很危险,请慎用,切记
sersync实时复制
Sersync项目利用inotify与rsync技术实现对服务器数据实时复制的解决方案,其中inotify用于监控sersync所在服务器上文件系统的事件变化,当事件发生变化时就调用rsync命令将变化的数据复制到远端服务器上。
sersync特点
1.使用c++编写,支持对监控的事件过滤功能。
2.sersync采用xml配置文件,然后由守护进程启动,配置起来比inotify-tools更简单。
3.使用多线程进行复制,即可以并发复制多个不同文件。
4.sersync自带出错处理机制,通过失败队列对出错的文件重新复制。
5.sersync自带crontab功能,可实现对失败队列中的文件定时整体复制。
6.sersync自带socket与http的协议扩展,可以满足有特殊需求的公司二次开发
sersync图解原理
配置文件讲解及修改配置
需要改的:
sersync+rsync实时复制方案项目实践
1.大前提rsyncdaemon服务配置成功,可以在rsync客户端推送拉取数据,然后才能配置inotify服务。
确保已经配置好rsync服务,并且能在客户端推送和拉取数据信息:
rsync -avz /data rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
2.检查当前系统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
3.在nfs01安装配置sersync ##这里下载用专用的软件包,不要用下面的下载链接
mkdir /server/tools
cd /server/tools
wget https://github.com/wsgzao/sersync/blob/master/sersync2.5.4_64bit_binary_stable_final.tar.gz
4.解压配置
tar xf sersync_oldboy_64bit_20160928.tar.gz
sersync_oldboy_64bit_20160928.tar.gz
tree application/
application/
└── sersync
├── bin
│ └── sersync
├── conf
│ ├── confxml.xml
│ └── confxml.xml.ori
├── logs
│ └── rsync_fail_log.sh
└── readme.txt
mv application /
tree /application/
/application/
└── sersync
├── bin
│ └── sersync
├── conf
│ ├── confxml.xml
│ └── confxml.xml.ori
├── logs
│ └── rsync_fail_log.sh
└── readme.txt
4 directories, 5 files
5.sersync配置文件:干两件事:
1)完成监控配置:inotifywait -mrq -e createFolder,close_write,delete,moveFrom,moveTo /data
2)完整命令拼接:rsync -avz /data rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
5.启动sersync
../bin/sersync -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参数,则默认执行同步程序
mv application /
/application/sersync/bin/sersync -r -o /application/sersync/conf/confxml.xml -d
pstree -a -p 1918
sersync,1918 -r -o /application/sersync/conf/confxml.xml -d
├─{sersync},1924
├─{sersync},1925
├─{sersync},1926
├─{sersync},1927
├─{sersync},1928
├─{sersync},1929
├─{sersync},1930
├─{sersync},1931
├─{sersync},1932
├─{sersync},1933
└─{sersync},1934
这里可以看到sersyns是多线程的
/application/sersync/bin/sersync -d
pkill sersync
二进制程序,不是yum安装的,所以不能systemctl start sersync
这里就配置好了
配置:systemctl start sersync启动方案
cat /etc/rc.d/init.d/sersync
#!/bin/bash
# chkconfig: 2345 21 81
# description: rsync service start and stop scripts
# Author: oldboy
# Organization: www.oldboyedu.com
start(){
/application/sersync/bin/sersync -d -o /application/sersync/conf/confxml.xml &>/dev/null
}
stop(){
killall sersync 2>/dev/null
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
sleep 2
start
;;
*)
echo $"Usage:$0 {start|stop|restart}"
exit 1
esac
chmod +x /etc/rc.d/init.d/sersync
脚本启动:
/etc/init.d/sersync stop
ps -ef|grep sync
/etc/init.d/sersync start
ps -ef|grep sync
写一个启动脚本:使用systemctl start/stop sersyc 启动停止。
cat /usr/lib/systemd/system/sersync.service
[Unit]
Description=sersyncd service
After=network.target
[Service]
Type=forking
ExecStart=/etc/rc.d/init.d/sersync start
ExecReload=/etc/rc.d/init.d/sersync restart
ExecStop=/etc/rc.d/init.d/sersync stop
PrivateTmp=true
[Install]
WantedBy=multi-user.target
chmod +x /usr/lib/systemd/system/sersync.service
[root@nfs01 /data]# systemctl enable sersync.service
Created symlink from /etc/systemd/system/multi-user.target.wants/sersync.service to /usr/lib/systemd/system/sersync.service.
systemctl status sersync.service
● sersync.service - sersyncd service
Loaded: loaded (/usr/lib/systemd/system/sersync.service; enabled; vendor preset: disabled)
Active: inactive (dead)