Rsync

一、概述

rsync是一款开源的可实现全量及增量的本地或远程数据同步备份的工具。
英文全称为Remote synchronization,rsync具有可使本地和远程两台主机之间的数据快速复制同步镜像、远程备份功能。
rsync功能类似于scp(远程同步)、cp(本地同步)命令的功能,但是rsync支持增量同步和拷贝。

在同步备份数据时,默认情况下,rsync通过“quick check”算法,仅同步大小或者最后修改时间发生变化的文件或目录。也可以根据权限、属主等属性的变化同步,但需指定相应的参数。

rsync的特性:

  • 支持拷贝特殊文件加链接文件,设备等。
  • 可以有排除指定文件或目录的同步功能,相当于tar的评出功能。
  • 可以做到保持原文件或目录的权限、时间、软硬链接、属主、组等所有属性均步改变。
  • 可以实现增量同步,既只同步发生变化的数据,因此数据传输效率很高。
  • 可以使用rcp,rsh,ssh等方式来配合传输文件。
  • 可以通过socket(进程方式)传输文件和数据(服务端和客户端)。
  • 支持匿名的或认证(无需用户系统)的进程模式传输,可实现方便安全的数据备份及镜像。

二、安装rsync

apt install rsync
#ubunt安装

yum install -y rsync
#通过yum安装rsync

三、配置文件

3.1 默认配置文件路径/etc/rsyncd.conf

3.2 rsync的运行方式

rsync作为守护进程运行:rsync作为守护进程运行时,便可以接收客户端请求。两台通过rsync进行数据同步的主机,其中一台必须要以守护进程方式运行。守护进程状态运行的rsync可以理解为服务器端主机,而直接使用rsync连接远程rsync主机的,则是客户端主机。

rsync作为服务器运行前需要编辑配置文件。

3.3 配置文件

编辑配置文件/etc/rsyncd.conf

port = 873
#监听端口,默认873
uid = root
#用户uid
gid = root
#用户gid
use chroot =  no
#启用牢笼机制,有软连接超出当前目录时需要为no。
munge symlinks = no
#禁用munge后,rsync服务端将不会去干涉软链文件
max connections = 200
#最大连接数
timeout = 300
#超时时间,秒
pid file = /var/run/rsyncd.pid
#进程号对应文件
lock file = /var/run/rsyncd.lock
#锁文件,防止文件不一致
log file = /var/log/rsyncd.log
#日志文件
[backup]
#模块
path = /backup
#存储目录
ignore errors
#忽略错误
read only = false
#可写
list = false
#禁止列出文件
hosts allow = 172.16.1.0/24
#允许网段
#hosts deny = 0.0.0.0/32
#禁止网段,允许和拒绝二选一
auth users = rsync_backup
#连接的虚拟用户(非系统用户)
secrets file = /etc/rsync.password
#虚拟用户的账号密码文件

3.4 密码文件

在rsync的主配置文件中指定了secrets file的路径,文件名指定为rsync.password

这个文件中保存的用于rsync连接的用户名和密码信息。

此文件有3个注意点:

1.这个文件的所有者需要与运行rsync的用户一致。

2.这个文件的权限必须是600。

3.此文件的用户名及密码记录格式如下:

rsync_backup:123456
#用户名与密码之间使用:分隔。
chmod 600 /etc/rsync.password
#修改密码文件权限为600

3.5 以守护进程模式运行rsync(服务器)

rsync --daemon
#守护进程模式运行rsync
#rsync使用873端口。

netstat -nlptu
#查看873端口是否启动。
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:873             0.0.0.0:*               LISTEN      1972/rsync

3.6 将rsync设置为开机启动

方法一:
#将启动命令加入到/etc/rc.local文件中
echo "/usr/bin/rsync --daemon" >> /etc/rc.d/rc.local
#这里要注意,CentOS7在默认情况下rc.local是没有可执行权限的,若需要通过此方式设置开机启动,需要赋予rc.local可执行权限。
chmod +x /etc/rc.d/rc.local


方法二:
systemctl enable rsync
#rsync.service is not a native service, redirecting to systemd-sysv-install.
#Executing: /lib/systemd/systemd-sysv-install enable rsync
#使用systemd管理

3.7 rsync重启脚本

kill -9 $(ps -ef | grep rsync | grep -v 'grep' | awk '{print $2}')
rm -rf /var/run/rsyncd.pid
rsync --daemon

四、客户端配置

在客户机只需通过yum安装rsync即可使用同步命令。

4.1 配置密码文件

在客户端,也需要一个密码文件。这样可以直接读取文件中的密码,免去每次输入密码的麻烦。

这个密码文件的权限和所有者与服务器的要求相同。但是,它不需要记录用户名,直接记录密码即可。

vim /etc/rsync.password

123456
#只需记录密码,无需记录用户名

chmod 600 /etc/rsync.password
#修改权限为600

4.2 使用命令进行同步

rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup
#根据提示输入密码
#rsync -avz <本地路径> <用户名>@<rsync服务器IP>::<模块名>
#这里的模块名,就是服务器端配置文件中的模块名,而不是这个同步目录在服务器上的具体路径。

rsync -avz /backup/ rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
#从文件中读取密码


#同步完成输出:
sending incremental file list
hosts

sent 140 bytes  received 43 bytes  366.00 bytes/sec
total size is 158  speedup is 0.86

4.3 命令参数说明

参数说明
-v详细信息输出
-z传输时压缩
-r目录递归
-t保持文件时间信息
-o保持文件属主信息
-p保持文件权限信息
-g保持文件属组信息
-P显示同步过程及传输时进度信息
-D保持设备文件信息
-l保留软连接
-a归档模式,等同于rtopgDl参数
-e指定替代rsh的shell程序,如ssh
--exclude=PATTERN排除不需要传输的文件模式
--exclude-from=file文件名所在的目录文件
--bwlimit=RATE带宽限速,单位KBPS
--delete让目标目录SRC和源目录数据DST一致
--partial断点续传
--partia-dir=DIR断点续传文件临时存放目录

五、rsync的优缺点

优点:
1.增量备份,支持daemon,支持集中备份(支持推拉)。
2.远程shell通道模式可以加密(ssh),daemon模式需要加密传输,可以使用vpn。

缺点:
1.大量小文件同步,时间比较长,有时rsync进程可能会停止。
2.同步大文件,也会有中断问题。

六、使用ssh通道进行数据同步

rsync -artplLoguP -e "ssh -p 22" /data/app root@10.10.10.10:/data/

-a:表示归档模式,用于保持文件的所有属性,包括权限、所有者等。
-r:递归复制目录及其内容。
-t:保持文件的时间戳信息。
-p:保持文件的权限设置。
-l:保持符号链接。
-L:跟踪符号链接指向的文件。
-o:保持文件的所有者信息。
-g:保持文件的所属组信息。
-u:仅同步源目录中更新或新增的文件。
-P:显示传输进度并保持部分传输的文件。

inotify

一、简介

监控一个目录下的文件,当文件发生了更改,则会触发事件。即可输出出发事件的文件的信息。

可监控的事件类型非常多,创建、删除、移动、修改等。

二、安装

epel-release中收录了inotify。直接通过yum安装。

yum install epel-release -y
#安装epel源

yum install inotify -y
#安装inotify

rpm -ql inotify
#查看软件包安装的所有文件

三、inotify参数说明

3.1 运行参数

参数说明
-r递归
-q仅仅打印监控的事件
-m一直处于监控状态(前台监控)
-d以守护进程方式运行(后台运行)
-o file将监控事件输出到文件当中(默认输出到标准输出)
-s输出错误信息记录到系统日志中(默认输出到标准输出)
--excludei忽略文件名的大小写
-e指定要监控的事件
--timefmt指定输出的时间显示格式参考man date

3.2 输出信息格式

参数说明
--format当发生事件以后所输出的信息以及输出的格式
%f当监控的目录中文件发生了事件,%f会被替换成发生事件的文件名
%w记录发生事件的文件所在的目录的绝对路径
%e事件名,如果有多个事件,使用空格分隔。
%Xe事件名,如果有多个事件,使用x分割。
%T输出发生事件的时间,时间格式由--timefmt

3.2 事件类型

名称类型
access访问事件
modify文件修改
attrib属性修改
close_write文件从写模式被关闭时触发此事件
close_nowrite文件从只读模式被关闭时触发此事件
close不论以什么方式打开文件,在关闭文件时都会触发该事件。
open当文件被打开时触发此事件
moved_to当文件被移动到监控目录中时触发此事件
moved_from当文件从监控目录中被移走时触发此事件
move_self在监控目录下执行移动操作时触发此事件
move当监控目录中发生了文件的移动,就会触发该事件。
delete删除文件时触发此事件
delete_self当监控目录自身被删除时触发此事件
create创建文件时触发此事件
umount当监控目录被卸载时,触发此事件

四、监控文件变动

inotifywait -mrq --timefmt "%F%T" --format '%T%w%f%e' -e create,delete,modify /home

五、实时同步脚本

#!/bin/bash
prog='inotifywait'
events='create,delete,modify,sttrib'
iopt='-mrq'

lpath="/test/”
rhost="10.0.0.41"
vuser="vuser1"
secfile="/etc/rsync.password"
ropt="-az --delete"
modName="mode10"

$prog $iopt --format "%w%f" -e $events %lpath | while read line
do
    echo %line
    rsync $ropt $line $vuser@$rhost::$modName --password-file=$secfile
done

sersync

一、简介

sersync是一个基于inotify发开的同步工具。

同步模式:

  1. 主机A和主机B都安装rsync。
  2. 文件从主机A同步到主机B。
  3. 主机B的rsync以守护进程方式启动,作为服务端,用于接收请求。
  4. 主机A的rsync作为客户端,在需要时调用即可,不需要以进程方式启动。
  5. 在主机A安装sersync,用于监视主机A中的文件变化,同时将发生变化的文件,通过rsync向主机B进行同步。

二、安装

sersync托管在google code上。

下载地址:

https://code.google.com/archive/p/sersync/downloads

下载完成后解压缩后得到2个文件,配置文件confxml.xml,和可执行文件sersync2

tar -zxvf sersync2.5.4 -C /opt/

三、修改配置文件

配置一个模块用一个配置文件,监控多个模块需要建立多个配置文件,启动多个sersync进程。

vim config.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<head version="2.5">
    <host hostip="localhost" port="8008"></host>
    <debug start="false"/>
    <fileSystem xfs="false"/>
    <filter start="false">
    <exclude expression="(.*)\.svn"></exclude>
    <exclude expression="(.*)\.gz"></exclude>
    <exclude expression="^info/*"></exclude>
    <exclude expression="^static/*"></exclude>
    </filter>
    <inotify>
    <!-- 监控事件类型 -->
    <delete start="true"/>
    <createFolder start="true"/>
    <createFile start="false"/>
    <closeWrite start="true"/>
    <moveFrom start="true"/>
    <moveTo start="true"/>
    <attrib start="false"/>
    <modify start="false"/>
    </inotify>

    <!-- 同步目录配置 -->
    <sersync>
    <localpath watch="/opt/tongbu">
    <!--设置监视的目录路径-->
        <remote ip="127.0.0.1" name="tongbu1"/>
        <!--这里设置远程主机IP地址,name中填写模块名称。-->
        <!--<remote ip="192.168.8.39" name="tongbu"/>-->
        <!--<remote ip="192.168.8.40" name="tongbu"/>-->
    </localpath>
    <!-- 远端rsync配置 -->
    <rsync>
        <commonParams params="-artuz"/>
        <auth start="true" users="rsync_user" passwordfile="/etc/rsync.password"/>
        <!--使用rsync_user用户进行认证,密码文件路径为/etc/rsync.password-->
        <userDefinedPort start="false" port="874"/><!-- port=874 -->
        <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>

    <plugin name="command">
    <param prefix="/bin/sh" suffix="" ignoreError="true"/>    <!--prefix /opt/tongbu/mmm.sh suffix-->
    <filter start="false">
        <include expression="(.*)\.php"/>
        <include expression="(.*)\.sh"/>
    </filter>
    </plugin>

    <plugin name="socket">
    <localpath watch="/opt/tongbu">
        <deshost ip="192.168.138.20" port="8009"/>
    </localpath>
    </plugin>
    <plugin name="refreshCDN">
    <localpath watch="/data0/htdocs/cms.xoyo.com/site/">
        <cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx" passwd="xxxx"/>
        <sendurl base="http://pic.xoyo.com/cms"/>
        <regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/>
    </localpath>
    </plugin>
</head>

四、启动sersync

sersync -h 查看命令说明

参数说明
-d守护进程模式
-r在监控前,将监控目录与远程主机用rsync命令推送一遍
-n指定开启守护进程的数量,默认为10个
-o指定配置文件,默认使用confxml.xml文件
-m单独期用其它模块,-m refreshCDN开启刷新CDN模块
-m-m socket 开启socket模块
-m-m http 开启http模块
不加-m默认执行同步程序
sersync -d -r
#以守护进行模式运行,运行后立即同步一次。

/opt/sersync2/sersync2 -d -r -o /opt/sersync2/confxml.xml
#启动时指定配置文件。若不使用-o指定配置文件,默认使用confxml.xml。

五、检查sersync运行

#!/bin/bash
sersync="/usr/local/sersync/sersync2"
confxml="/usr/local/sersync/confxml.xml"
status=$(ps aux |grep 'sersync2'|grep -v 'grep'|wc -l)
if [ $status -eq 0 ];
then
$sersync -d -r -o $confxml &
else
exit 0;
fi

定期检查sersync是否在运行。若没有在有允许,则启动。

*/5 * * * * /opt/daemon-sersync.sh
#在crontab添加定时任务检查sersync

标签: Rsync

添加新评论