rsync 服务快速部署手册

时间:2022-09-19 08:36:34

一、rsync服务端安装

1、查看rsync安装包

# rpm -qa rsync
rsync-3.0.6-12.el6.x86_64

2、安装rsync

系统默认都会安装rsync软件包的,如果查看发现没有安装,执行yum安装即可
# yum install rsync -y

3、添加rsync服务的用户,管理本地目录的

# useradd -s /sbin/nologin -M rsync
# id rsync

4、生成rsyncd.conf配置文件

# cat /etc/rsyncd.conf
#rsync_config______________________start
#created by oldboy 15:00 2016-11-15
##rsyncd.conf start##
uid = rsync # 用户 远端的命令使用rsync访问共享目录
gid = rsync # 用户组
use chroot = no # 安全相关
max connections = 200 # 最大连接数
timeout = 300 # 超时时间
pid file = /var/run/rsyncd.pid # 进程对应的进程号文件
lock file = /var/run/rsyncd.lock # 锁文件
log file = /var/log/rsyncd.log # 日志文件
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 # 虚拟用户对应的用户和密码文件

[backup] # 模块名称
path = /backup # 服务端提供访问的目录

[nfsbackup]
path = /nfsbackup
#rsync_config______________________end

5、根据rsyncd.conf的auth users配置帐户,远程连接的,并根据secrets file 参数生成密码文件。

# echo "rsync_backup:hkrt" > /etc/rsync.password
# cat /etc/rsync.password
rsync_backup:hkrt

6、为密码文件配置权限

# chmod 600 /etc/rsync.password
# ls -l /etc/rsync.password
-rw------- 1 root root 20 Nov 15 23:35 /etc/rsync.password

7、创建共享目录并授权rsync服务管理

# mkdir /backup -p
# chown -R rsync.rsync /backup

8、启动rsync服务并检查

# rsync --daemon
# ps -ef | grep rsync|grep -v grep
# lsof -i:873

9、加入开机自启动

# echo "/usr/bin/rsync --daemon" >> /etc/rc.local
# tail -1 /etc/rc.local

 

二、rsync客户端

1、查看rsync安装包

# rpm -qa rsync
rsync-3.0.6-12.el6.x86_64

2、安装rsync

系统默认都会安装rsync软件包的,如果查看发现没有安装,执行yum安装即可
# yum install rsync -y

3、添加rsync服务的用户,管理本地目录的

# useradd -s /sbin/nologin -M rsync
# id rsync

4、生成连接服务器需要的密码文件

# echo "hkrt" > /etc/rsync.password
# cat /etc/rsync.password
hkrt

5、为密码文件配置权限

# chmod 600 /etc/rsync.password
# ls -1 /etc/rsync.password
-rw------- 1 root root 7 Nov 15 23:48 /etc/rsync.password

6、同步文件语法

基于rsync daemon同步语法:

拉取: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
推送: rsync [OPTION...] SRC... [USER@]HOST::DEST
rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST

7、测试手动推送是否正常

[root@nfs01 backup]# pwd
/backup

[root@nfs01 backup]# ls
a.txt c.txt e.txt g.txt i.txt k.txt m.txt o.txt q.txt s.txt u.txt w.txt y.txt
b.txt d.txt f.txt h.txt j.txt l.txt n.txt p.txt r.txt t.txt v.txt x.txt z.txt

# rsync -avz /backup/ rsync_backup@172.16.1.41::backup/ --password-file=/etc/rsync.password # 执行手动推送
sending incremental file list
./
a.txt
b.txt
c.txt
d.txt
e.txt
f.txt
g.txt
h.txt
i.txt
j.txt
k.txt
l.txt
m.txt
n.txt
o.txt
p.txt
q.txt
r.txt
s.txt
t.txt
u.txt
v.txt
w.txt
x.txt
y.txt
z.txt

sent 1229 bytes received 505 bytes 3468.00 bytes/sec
total size is 0 speedup is 0.00
从结果看:应该是同推送成功了,我们到rsync daemon服务器来查看下,是不是已经同步完成了啊。
[root@backup backup]# pwd/backup[root@backup backup]# lsa.txt  c.txt  e.txt  g.txt  i.txt  k.txt  m.txt  o.txt  q.txt  s.txt  u.txt  w.txt  y.txtb.txt  d.txt  f.txt  h.txt  j.txt  l.txt  n.txt  p.txt  r.txt  t.txt  v.txt  x.txt  z.txt
 
我们看到rsync daemon 服务器/backup目录已经有文件同步过来了,说明我们已经配置成功了。接下来我们还会学习下,如何做到实例同步,我会通过rsync+inotify、rsync+serync两种方案来实现数据实时同步!
 
三、rsync + inotify 实时同步方案
 
本想新写一篇博文来介绍rsync + inotify实时同步方案了,但是要实现这个方案需要满足以下条件:
1、rsync daemon安装成功 
2、rsync 客户端可以正常推送文件到rsync daemon端 
3、安装配置inotify 
前两个我们已经配置完成了,下面我们只需要在rsync 客户端安装inotify并配置即可实现实时同步。
 
1、安装inotify
# yum install inotify-tools –y

# inotifywa    # 安装完成后会生成以下两个命令
inotifywait   inotifywatch

 
2、执行inotifywait命令监测/data目录是否有变化
[root@nfs01 scripts]# /usr/bin/inotifywait -mrq --format '%w%f' -e close_write,delete /data/
 
3、在/data目录创建测试(hkrt.txt)文件,然后看看inotifywait命令是否监测到了变化
# pwd
/data
# touch hkrt.txt

[root@nfs01 scripts]# /usr/bin/inotifywait -mrq --format '%w%f' -e close_write,delete /data/
/data/hkrt.txt

4、创建监控脚本

我们可以看到,在/data目录下创建的hkrt.txt文件,已经被inotifywait命令监测到了。这样inotify就快搞定了,下面我们只需要写个监控脚本就可以了,脚本内容就是监测到了变化,就执行rsync推送文件到备份服务器就好了,下面看下脚本是怎么写的吧! 
# cat inotify.sh 
#/bin/bashPath=/dataIp=172.16.1.41/usr/bin/inotifywait -mrq --format '%w%f' -e close_write,delete $Path \|while read file  do    cd $Path && \    rsync -az ./ --delete rsync_backup@$Ip::nfsbackup --password-file=/etc/rsync.password &  done

5、创建启动服务脚本并赋予执行权限

# cat /etc/init.d/syncd 
#!/bin/bash
#chkconfig: 2345 38 46
. /etc/init.d/functions
if [ $# -ne 1 ];then
usage: $0 [start|stop]
exit
fi

case "$1" in
start)
/bin/bash /root/scripts/inotify.sh &
echo $$ > /var/run/inotify.pid
if [ `ps -ef|grep inotify|wc -l` -gt 2 ];then
action "inotify service is started" /bin/true
else
action "inotify service is started" /bin/false
fi
;;
stop)
kill -9 `cat /var/run/inotify.pid` > /dev/null 2>
&1
pkill inotifywait
sleep 2
if [ `ps -ef|grep inotify|grep -v grep|wc -l` -eq 0 ];then
action "inotify service is stopped" /bin/true
else
action "inotify service is stopped" /bin/false
fi
;;
*)
usage: $0 [start|stop]
exit 1
esac
 
# chmod +x /etc/init.d/syncd

6、添加syncd服务并设置开机自启动

chkconfig --add syncd
chkconfig syncd on

7、启动/停止inotifywait服务

# /etc/init.d/syncd start
inotify service is started [ OK ]
[root@nfs01 scripts]# /etc/init.d/syncd stop
inotify service is stopped [ OK ]

8、接下来我们就可以验证实时同步了

[root@nfs01 data]# pwd
/data
[root@nfs01 data]# touch stu{01..10}
[root@nfs01 data]# ls
stu01 stu02 stu03 stu04 stu05 stu06 stu07 stu08 stu09 stu10

我们到备份服务器看看有没有实时同步过去

[root@backup nfsbackup]# pwd
/nfsbackup
[root@backup nfsbackup]# ls
stu01 stu02 stu03 stu04 stu05 stu06 stu07 stu08 stu09 stu10

可以看到,新创建的文件已经被实时同步到备份服备器了,rsync + inotify 实时同步也就部署完成了,可能过程中有些内容写的不是很详细,只是个安装过程,大家需要了解更多的内容,可以参考官方技术文档或查看其它资料。好了,就介绍到这吧。希望大家有所收获。

四、rsync + sersync 实现实时同步

实现rsync+sersync实时同步我们继续使用这个环境,所在先要停掉inotify服务。

[root@nfs01 data]# /etc/init.d/syncd stop
inotify service is stopped [ OK ]
[root@nfs01 local]# chkconfig --list syncd
syncd 0:off 1:off 2:off 3:off 4:off 5:off 6:off

如果是新环境,我们就可以直接安装sersync了!

1、安装sersync,下载后直接使用就可以了,不需要安装,我们先看下目录结构吧,这目录结构是修改过的,如果从官方下载可以会不一样,不过也没有太的区别了,只不过有用的就是这两个文件而已。

# tree sersync/
sersync/
├── bin
│ └── sersync2 # 启动命令
├── conf
│ └── confxml.xml # 配置文件 (我们主要关注的就是这个文件了)
└── logs

2、我们看下配置文件的内容

# cat /usr/local/sersync/conf/confxml.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> # 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="/data"> # 需要同步的路径
<remote ip="172.16.1.41" name="nfsbackup"/> # 指定rsync daemon 备份服务器IP地址、模块名称
<!--<remote ip="192.168.8.39" name="tongbu"/>-->
<!--<remote ip="192.168.8.40" name="tongbu"/>-->
</localpath>
<rsync>
<commonParams params="-avz"/> # rsync 参数设置
<auth start="true" users="rsync_backup" passwordfile="/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>

3、配置密码文件,我们这里使用的环境之前已经配置好了,这里就不在配置了,你应该也会明白吧。我们看下吧,记着修改权限哦!

[root@nfs01 local]# cat /etc/rsync.password
oldboy
[root@nfs01 local]# ll /etc/rsync.password
-rw------- 1 root root 7 Nov 15 23:48 /etc/rsync.password

4、启动sersync服务

[root@nfs01 local]# /usr/local/sersync/bin/sersync2 -r -d -o /usr/local/sersync/conf/confxml.xml
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
option: -r rsync all the local files to the remote servers before the sersync work
option: -d run as a daemon
option: -o config xml name: /usr/local/sersync/conf/confxml.xml
daemon thread num: 10
parse xml config file
host ip : localhost host port: 8008
daemon start,sersync run behind the console
use rsync password-file :
user is rsync_backup
passwordfile is /etc/rsync.password
config xml parse success
please set /etc/rsyncd.conf max connections=0 Manually
sersync working thread 12 = 1(primary thread) + 1(fail retry thread) + 10(daemon sub threads)
Max threads numbers is: 22 = 12(Thread pool nums) + 10(Sub threads)
please according your cpu ,use -n param to adjust the cpu rate
------------------------------------------
rsync the directory recursivly to the remote servers once
working please wait...
execute command: cd /data && rsync -avz -R --delete ./ rsync_backup@172.16.1.41::nfsbackup --password-file=/etc/rsync.password >/dev/null 2>
&1
run the sersync:
watch path is: /data
[root@nfs01 local]# ps -ef | grep sersync
root 4130 1 0 14:45 ? 00:00:00 /usr/local/sersync/bin/sersync2 -r -d -o /usr/local/sersync/conf/confxml.xml
root 4146 1949 1 14:45 pts/0 00:00:00 grep sersync

5、我们验证看看有没有实时同步吧

在sersync端/data目录下创建几个文件

[root@nfs01 local]# cd /data/
[root@nfs01 data]# ls
[root@nfs01 data]# touch stu{01..05}
[root@nfs01 data]# ls
stu01 stu02 stu03 stu04 stu05

在rsync daemon端查看/nfsbackup目录有没有刚刚创建的文件

[root@backup nfsbackup]# pwd
/nfsbackup
[root@backup nfsbackup]# ls
stu01 stu02 stu03 stu04 stu05

可以看到,文件已经同步过来了,说明没有问题了,也达到了实时同步的目的。好的,就介绍到这吧。介绍了两种实时同步的方案。