Linux网络服务之RSYNC

一、rsync概述

1.1 Rsync简介

官方网站:http://rsync.samba.org/

Rsync是一款开源的快速的、可实现全量及增量的本地或远程数据备份的多功能工具.并且在复制时可以不改变原有数据的属性信息,即可实现数据的备份迁移特性,rsync软件适用于unix/linux/windows等多种操作系统平台。

1.2 常见备份分类

完整备份:每次备份都是从备份源将所有的文件或目录备份到目的地
​
差量备份:备份上次完全备份以后有变化的数据(他针对的上次的完全备份,他备份过程中不清除存档属性)
​
增量备份:备份上次备份以后有变化的数据.(他才不管是那种类型的备份,有变化的数据就备份,他会清除存档属性)

二、部署rsync

2.1 安装rsync

# 安装
yum -y install rsync
# 查看端口
netstat -antup|grep sync        # rsync采用的是873端口,服务器模式c/s的
​
# 格式
rsync -av 【选项】 【本地文件或目录】 远程用户名@远程服务器的IP地址:目标
​
# 生成SSH密钥对
ssh-keygen      # 生成的公钥和私钥保存到默认路径(一般为~/.ssh/id_rsa.pub和~/.ssh/id_rsa)
​
# 将本地生成的公钥复制到远程服务器上
ssh-copy-id username@remote_host
​
# 确认SSH公钥认证已经生效
ssh username@remote_host
​
# 使用rsync时指定SSH密钥文件
rsync -avz user@REMOTE_HOST:/FILE_PATH  .

2.2 几个常见的选项

-a, --archive archive mode 权限保存模式,相当于 -rlptgoD 参数,存档,递归,保持属性等
​
-r, --recursive 复制所有下面的资料,递归处理
​
-p, --perms 保留档案权限 ,文件原有属性
​
-t, --times 保留时间点,文件原有时间
​
-g, --group 保留原有属组
​
-o, --owner 保留档案所有者(root only)
​
-D, --devices 保留device资讯(root only)
​
-l, --links 复制所有的连接 ,拷贝连接文件
​
-z, --compress 压缩模式, 当资料在传送到目的端进行档案压缩.
​
-H, --hard-links 保留硬链接文件
​
-A, --acls 保留ACL属性文件,需要配合--perms
​
-P,-P参数和 --partial --progress 相同.只是为了把参数简单化,表示传进度
​
--version, 输出rsync版本
​
-v , --verbose 复杂的输出信息
​
-u, --update 仅仅进行更新,也就是跳过已经存在的目标位置,并且文件时间要晚于要备份的文件,不覆盖新的文件
​
--port=PORT, 定义rsyncd(daemon)要运行的port(预设为tcp 873)
​
--delete, 删除那些目标位置有的文件而备份源没有的文件
​
--password-file=FILE ,从 FILE 中得到密码
​
--bwlimit=KBPS, 限制 I/O 带宽
​
--filter “-filename”,需要过滤的文件
​
--exclude=filname,需要过滤的文件
​
--progress,显示备份过程

三、rsync高级

3.1 rsync配置文件详解

rsyncd.conf配置文件分为两部分:全局参数,模块参数

全局参数:对rsync服务器生效,如果模块参数和全局参数冲突,冲突的地方模块参数生效

模块参数:定义需要通过rsync输出的目录定义的参数

3.1.1 常见的全局参数

参数

说明

默认值

uid

守护进程传输文件时应该具有的uid,与gid选项一起使用确定文件权限

"nobody"

gid

守护进程传输文件时应该具有的gid

"nobody"

max connections

模块的最大并发连接数量,超出限制的连接请求将被告知随后再试

0

lock file

支持max connections参数的锁文件

"/var/run/rsyncd.lock"

motd file

客户连接服务器时显示给客户的消息文件,默认为空

log file

指定rsync的日志文件,不将日志发送给syslog

pid file

指定rsync的pid文件位置

"/var/run/rsyncd.pid"

hosts allow

允许访问的客户机地址

3.1.2 常见的模块参数

主要是定义服务器哪个要被同步输出,其格式必须为“ [ 共享模块名 ]” 形式,这个名字就是在 rsync 客户端看到的名字,其实很像 Samba 服务器提供的共享名。而服务器真正同步的数据是通过 path 来指定的

参数

说明

Comment

给模块指定一个描述,该描述连同模块名在客户连接得到模块列表时显示给客户。默认没有描述定义。

Path

指定该模块的供备份的目录树路径,该参数是必须指定的。

read only

yes为只允许下载,no为可以下载和上传文件到服务器

exclude

用来指定多个由空格隔开的多个文件或目录(相对路径),将其添加到exclude列表中。这等同于在客户端命令中使用―exclude或----filter来指定某些文件或目录不下载或上传(既不可访问)

exclude from

指定一个包含exclude模式的定义的文件名,服务器从该文件中读取exclude列表定义,每个文件或目录需要占用一行

include

用来指定不排除符合要求的文件或目录。这等同于在客户端命令中使用--include来指定模式,结合include和exclude可以定义复杂的exclude/include规则。

include from

指定一个包含include模式的定义的文件名,服务器从该文件中读取include列表定义。

auth users

该选项指定由空格或逗号分隔的用户名列表,只有这些用户才允许连接该模块。这里的用户和系统用户没有任何关系。如果" auth users"被设置,那么客户端发出对该模块的连接请求以后会被rsync请求challenged进行验证身份这里使用的challenge/response认证协议。用户的名和密码以明文方式存放在" secrets file"选项指定的文件中。默认情况下无需密码就可以连接模块(也就是匿名方式)。

secrets file

该选项指定一个包含定义用户名:密码对的文件。只有在" auth users"被定义时,该文件才有作用。文件每行包含一个username:passwd对。一般来说密码最好不要超过8个字符。没有默认的secures file名,注意:该文件的权限一定要是600,否则客户端将不能连接服务器。

hosts allow

指定哪些IP的客户允许连接该模块。单个IP地址,例如:192.168.0.1,多个IP或网段需要用空格隔开,整个网段,例如:192.168.0.0/24,也可以是192.168.0.0/255.255.255.0 “*”则表示所有,默认是允许所有主机连接。

hosts deny

指定不允许连接rsync服务器的机器,可以使用hosts allow的定义方式来进行定义。默认是没有hosts deny定义。

list

该选项设定当客户请求可以使用的模块列表时,该模块是否应该被列出。如果设置该选项为false,可以创建隐藏的模块。默认值是true。

timeout

通过该选项可以覆盖客户指定的IP超时时间。通过该选项可以确保rsync服务器不会永远等待一个崩溃的客户端。超时单位为秒钟,0表示没有超时定义,这也是默认值。对于匿名rsync服务器来说,一个理想的数字是600

3.2 配置示例

允许192.168.1.120到本机192.168.1.100上下载/var/www/html下的文件

1)配置rsyncd.conf文件

[root@server ~]# vim /etc/rsyncd.conf           
uid = nobody    
gid = nobody
address =192.168.1.100      # 服务器监听的 IP 地址,不写默认监听所有(多块网卡时指定单个网卡IP)
port =873   
hosts allow =192.168.1.120      # 允许访问的客户机地址,也可以是网段192.168.1.0/24
use chroot = yes  # 当使用chroot为yes时,必须使用root权限,且不能备份path路径外的链接文件
max connections = 5     # 指定同时连接数(非必须)
pid file =/var/run/rsyncd.pid
lock file =/var/run/rsyncd.lock
log file =/var/log/rsyncd.log
motd file =/etc/rsyncd.motd     # 客户连接服务器时显示给客户的消息文件,默认为空(非必须)
​
[wwwroot]            # 共享模块名称
path =/var/www/html       # 路径
comment = used for web-data root   # 描述信息
read only = yes      # 只读方式(只可以下载)
list = yes            # 是否允许查看模块信息
auth users = rsyncuser    # 备份的用户,和系统用户无关,自定义的用户,系统中不存在。
secrets file =/etc/rsyncd.password     # 存放用户的密码文件,格式是 用户名:密码

2)创建提示文件和用户密码

[root@server ~]# echo "Welcome to Backup Server" > /etc/rsyncd.motd
[root@server ~]# cat /etc/rsyncd.password    # 密码文件
rsyncuser:123456
# 重启rsync服务
[root@server ~]# systemctl restart rsyncd
​
# 必须是600或700权限
[root@server ~]# chmod 600 /etc/rsyncd.password
# 测试
[root@server ~]# rsync -avz rsyncuser@192.168.1.100::wwwroot /web
或
[root@server ~]# rsync -avz --progress --delete rsyncuser@192.168.1.100::wwwroot /web       

3)免密

[root@server ~]# echo "123456" > /root/passfile && chmod 600 passfile 
[root@server ~]# rsync -avz --progress --delete rsyncuser@192.168.1.100::wwwroot --password-file=/root/passfile /web

4)定时备份

​
[root@server ~]# cat autobackup.sh 
#!/bin/bash
rsync -avz rsyncuser@192.168.1.100::wwwroot --password-file=/root/passfile /web
​
[root@server ~]# chmod a+x autobackup.sh 
[root@server ~]# echo "01 4 * * * sh /root/autobackup.sh &" >>/var/spool/cron/root

四、使用inotify工具进行实时同步

使用 rsync 工具与 inotify 机制相结合,可以实现触发式备份(实时同步),只要原始位置的文档发生变化,则立即启动增量备份操作,否则处于静态等侍状态,这样一来,就避免了按固定周期备份进存在的延迟性、周期过密等问题。

4.1查看内核和参数

[root@server ~]# ls /proc/sys/fs/inotify/
​
max_queued_events    #表示监控事件队列      默认16384 可以使用cat命令查看
​
max_user_instances     #表示最多监控实例数    默认128
​
max_user_watches      #表示每个实例最多监控文件数  默认8192
[root@server ~]# vim /etc/sysctl.conf
​
#末尾添加下面三行
​
fs.inotify.max_queued_events =32768     # 管理队列
​
fs.inotify.max_user_instances =1024     # 实例数
​
fs.inotify.max_user_watches =90000000   # 文件数
​
[root@server ~]#sysctl -p  #生效配置

4.2 安装inotify-tools

[root@server ~]# yum -y install epel-release && yum install inotify* -y

4.3 测试inotifywait

使用 inotifywait 命令监控网站目录/var/www/html发生的变化。然后在另一个终端向/var/www/html目录下添加文件、移动文件,查看屏幕输出结果。

inotifywait常用参数:

-e 用来指定要监控哪些事件。这些事件包括: create 创建,move 移动,delete 删除,modify 修改文件内容,attrib 属性更改。
​
-m 表示持续监控
​
-r 表示递归整个目录
​
-q 表示简化输出信息。
[root@server ~]# inotifywait -mrq -e create,move,delete,modify /var/www/html/

另外开一终端,做一些改动,查看是否终端有变化,如果有变化说明正常在监控。

4.4 实战:将本地的/var/www/html下的文件实时同步到远程服务器的web目录下

4.4.1 做免密码连接
[root@server ~]# ssh-keygen 
[root@server ~]# ssh-copy-id root@192.168.1.120
[root@server ~]# ssh-copy-id root@192.168.1.121
4.4.2 编写脚本
[root@server ~]# vim inotify.sh
[root@server ~]# cat inotify.sh 
#!/bin/bash
​
# 定义本地同步目录
SRC=/var/www/html/    
​
# 定义远程目录
DST1=root@192.168.1.120:/web
DST2=root@192.168.1.121:/web
​
# 定义监控属性,while read D E F是哪个变量,前面输出的内容是三段,每一段对应的就是后面的D E F
inotifywait -mrq -e modify,delete,create,attrib ${SRC}|while read D E F
​
    do
​
        /usr/bin/rsync -avz --delete $SRC $DST1 && /usr/bin/rsync -avz --delete $SRC $DST2
​
   done

思路:只要检测到变动,执行rsync上行同步操作,拉数据

4.4.3 赋予权限
[root@server ~]# chmod +x inotify.sh ; echo "sh /root/inotify.sh &" >> /etc/rc.local

把这个脚本放在后台运行:

[root@server ~]# nohup ./inotify.sh &

先运行这个脚本,在触发动作,在/var/www/html/目录进行增删改操作,观察对端的变化

[root@server web]# watch ls

五、使用Sersync实时文件同步

5.1 Sersync的特点

  • sersync可以记录下被监听目录中发生变化的(包括增加、删除、修改)具体某一个文件或某一个目录的名字;

  • rsync在同步的时候,只同步发生变化的这个文件或者这个目录(每次发生变化的数据相对整个同步目录数据来说是很小的,rsync在遍历查找比对文件时,速度很快),因此,效率很高。

5.2 Inotify与sersync的区别

5.2.1 rsync+inotify
Inotify-tools只能记录下被监听的目录发生了变化(包括增加、删除、修改),并没有把具体是哪个文件或者哪个目录发生了变化记录下来;
​
rsync在同步的时候,并不知道具体是哪个文件或者哪个目录发生了变化,每次都是对整个目录进行同步,当数据量很大时,整个目录同步非常耗时(rsync要对整个目录遍历查找对比文件),因此,效率很低。
5.2.2 rsync+sersync
sersync可以记录下被监听目录中发生变化的(包括增加、删除、修改)具体某一个文件或某一个目录的名字;
rsync在同步的时候,只同步发生变化的这个文件或者这个目录(每次发生变化的数据相对整个同步目录数据来说是很小的,rsync在遍历查找比对文件时,速度很快),因此,效率很高。

总结:当同步的目录数据量不大时,中小型公司建议使用Rsync+Inotify-tools;当数据量很大(几百G甚至1T以上)、文件很多时,建议使用Rsync+sersync。

5.3 配置sersync服务

5.3.1 同步架构图

5.3.2 客户端安装rsync
[root@client ~]#yum -y install rsync
5.3.3 参数调整和优化
[root@client ~]# echo 50000000 >/proc/sys/fs/inotify/max_user_watches
[root@client ~]# echo 325659 >/proc/sys/fs/inotify/max_queued_events
[root@client ~]# echo "123456" >/etc/rsync.password
[root@client ~]# chmod 600 /etc/rsync.password
[root@client ~]#  systemctl restart rsyncd
[root@client ~]#  systemctl enable rsyncd

5.3.4 安装sersync
[root@client ~]# wget https://down.whsir.com/downloads/sersync2.5.4_64bit_binary_stable_final.tar.gz
[root@server ~]# tar zxvf sersync2.5.4_64bit_binary_stable_final.tar.gz -C /usr/local/
GNU-Linux-x86/
GNU-Linux-x86/sersync2
GNU-Linux-x86/confxml.xml
[root@client local]#  mv GNU-Linux-x86/ sersync-2.5.4
[root@client local]# ln -svf sersync-2.5.4 sersync
[root@client local]#  cd sersync/
[root@client local]#  cp sersync2 /usr/bin/sersync
5.3.5 修改配置文件
[root@client sersync]# vim confxml.xml 
    <sersync>
          # 定义本地被同步的目录
        <localpath watch="/var/www/html">
          #定义远程接收端的IP地址和模块名
            <remote ip="192.168.1.120" name="backup"/>
        </localpath>
        <rsync>
            <commonParams params="-artuz"/>
            # 开启认证,指定认证的用户名和密码文件
            <auth start="true" users="rsync_backup" passwordfile="/etc/rsync.password"/>
            <userDefinedPort start="false" port="854"/><!-- port=854 -->
            <timeout start="false" time="100"/><!-- timeout=100 -->
            <ssh start="false"/>
        </rsync>
        <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
        <crontab start="false" schedule="600"><!--600mins-->
            <crontabfilter start="false">
                <exclude expression="*.php"></exclude>
                <exclude expression="info/*"></exclude>
            </crontabfilter>
        </crontab>
        <plugin start="false" name="command"/>
    </sersync>
5.3.6 启动服务
[root@client sersync]# ./sersync2 -dro /usr/local/sersync/confxml.xml 
​
参数注解:
# -d:启用守护进程模式
# -r:在监控前,将监控目录与远程主机用rsync命令推送一遍
# -o:指定配置文件,默认使用confxml.xml文件
5.3.5 服务端(接收端)安装rsync
[root@server ~]#yum -y install rsync
5.3.8 配置服务端
[root@server web]# vim /etc/rsyncd.conf
uid = root
gid = root
use chroot = no
max connections = 36000
timeout = 600
pid file =/var/run/rsyncd.pid
lock file =/var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors = no
read only = no
list = no
hosts allow = 192.168.1.100
hosts deny = *
auth users = rsync_backup
secrets file =/etc/rsync.password
[backup]
path = /backup/sersync/
5.3.9 定义密码文件
[root@server web]# echo "rsync_backup:123456" >/etc/rsync.password
[root@server web]# chmod 600 /etc/rsync.password
5.3.10 创建接收目录
[root@server web]# mkdir -p /backup/sersync
5.3.11 重启rsync服务
[root@server web]# systemctl restart rsyncd
[root@server web]# systemctl enable rsyncd
5.3.12 测试效果

在客户端的/var/www/html目录下创建一些文件,查看服务端是否同步

[root@client html]# touch test
[root@server sersync]# ls
test

服务端查看,已经可以看到同步过来了。