使用rsync建立备份服务器(rsync、inotify、sersync)
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
#修改密码文件权限为6003.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/rsync3.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
#修改权限为6004.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.864.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
donesersync
一、简介
sersync是一个基于inotify发开的同步工具。
同步模式:
- 主机A和主机B都安装rsync。
- 文件从主机A同步到主机B。
- 主机B的rsync以守护进程方式启动,作为服务端,用于接收请求。
- 主机A的rsync作为客户端,在需要时调用即可,不需要以进程方式启动。
- 在主机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