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图解原理

null

配置文件讲解及修改配置

null

null

null

null

null

null

null

需要改的:

null

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

null

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)

results matching ""

    No results matching ""