xiaolingzi's blog

每天都在成长...

欢迎您:亲

CentOS7通过rsync和inotify进行实时同步

xiaolingzi 发表于 2016-02-29 16:15:11

一、服务端安装

安装软件

yum install rsync

启动服务

systemctl start rsyncd.service

rsync配置

1.配置rsyncd.conf

rsyncd.conf的位置在 /etc/rsyncd.conf

文件内容如下:

#pid文件位置
pid file = /var/run/rsyncd.pid     
#监听的端口号
port = 873
               
#本机ip,请自行修改为自己机器的ip
address = 192.168.0.23
#执行账户
uid = nobody
gid = nobody
use chroot = yes
#是否只读
read only = no   
#允许访问设置 可以配ip段,也可以多个ip空格间隔,请改为自己允许的ip
#如果客户端不在以下允许列表中,会报 @ERROR: access denied to xxx from unknown 错误
hosts allow=192.168.0.0/24 192.168.1.2  
hosts deny=*
#最大连接数
max connections = 5
motd file = /etc/rsyncd/rsyncd.motd    
#log文件位置
log file = /var/log/rsync.log    
#超时时间          
timeout = 300
               
#配置要同步的目录,可以添加多个
#自定义名称
[xxx]
#同步的目录
path = /var/www
#排除的文件
exclude from = /etc/rsyncd/xxx_exclude_list
list=yes
ignore errors
#认证用户名称
auth users = ruser
#用户认证文件,见接下的第2条
secrets file = /etc/rsyncd/rsyncd.secrets

2.配置用户账号文件

配置访问账号文件的目的是在授权和执行同步的时候使用,所以文件位置可以随便,到时引用时根据实际存储路径填写就行。

由于之后还会有其它文件,为了方便管理,我们在 /etc 下建rsyncd目录,然后将要配置的文件都放在该目录下。第一步的rsyncd.conf文件也可以放在该目录下,然后通过软链接将该文件链接到 /etc 目录下即可,命令如下:

ln -s /etc/rsyncd/rsyncd.conf /etc/rsyncd.conf

接下来配置password文件,后缀名可以自己取

sudo vi /etc/rsyncd/rsyncd.password

将访问密码写入该文件然后保存,并将该文件的权限设置为600,如 chmod 600 /etc/rsyncd/rsyncd.password ,否则会报如下错误:

password file must not be other-accessible 

然后配置用户认证文件,后缀名可以自己取

sudo vi /etc/rsyncd/rsyncd.secret

将用户密码写入该文件然后保存,格式为 用户名:密码 如 ruser:123456

然后再将该文件的权限设置为600,如 chmod 600 /etc/rsyncd/rsyncd.secret ,否则客户端同步时会报如下错误:

@ERROR: auth failed on module xxx

3.配置排除文件

在同步时,有些目录我们是不想同步的,比如网站的缓存目录。这时我们就可以将其排除。在第1步的exclude from后面的文件就是配置排除的内容。

假设我们新建 /etc/rsyncd/xxx_exclude_list 文件,然后将要排除的目录和文件(相对路径)按行的方式写入该文件,如

xxx/cache

logs

然后在第1步中配置 exclude from = /etc/rsyncd/xxx_exclude_list 属性,就可以将他们排除。

4.重启rsync服务

systemctl restart rsyncd.service

5.配置防火墙

配置防火墙允许873端口tcp访问。如CentOS7在/etc/firewalld/zones/public.xml里添加一条记录如下:

<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Public</short>
  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <service name="dhcpv6-client"/>
  <service name="ssh"/>
  <port protocol="tcp" port="873"/>
</zone>

然后重启防火墙:systemctl restart firewalld.service

如果防火墙使用的是iptables,就在iptables文件里面按照相应规则开放端口。


二、客户端安装

客户端跟服务端安装大致一样,具体的差别如下面所描述。

同步方式有两种:

1.推送方式

推送方式是指目标机器作为服务端,源机器作为客户端,源机器将本地目录推送到目标网络目录,此时差别是源机器第1步不需要配置同步目录,第2步只需要配置password文件,不需要配置用户认证文件,如果没有配置同步目录,第3部也就不需要了。

服务端手动推送同步测试命令如下:

/usr/bin/rsync -avzP /var/www/xxx ruser@192.168.0.23::xxx --password-file=/etc/rsyncd/rsyncd.password

如果采用推送方式,目标机器(服务端)rsynd.conf中的只读属性的值修改为no,如 read only = no ,否则会报以下错误:

ERROR: module is read only

rsync: recv_generator: mkdir "/tenpay" (in upload) failed: Permission denied

2.拉取方式

拉取方式是指源机器作为服务端,目标机器作为客户端,目标机器将服务端网络目录拉取到本地目录,此时差别是目标机器第1步不需要配置同步目录,第2步只需要配置password文件,不需要配置用户认证文件,如果没有配置同步目录,第3部也就不需要了。

在客户端手动拉取同步测试命令如下:

/usr/bin/rsync -avzP ruser@192.168.0.23::xxx /var/www/xxx --password-file=/etc/rsyncd/rsyncd.password

用户名、ip、源目录(xxx为第一步中括号里自定义的名称)、目标目录根据自己的实际情况进行相应的修改

同步的目标地址的父目录要存在,不存在就先自行建立,否则会报以下错误:

rsync: mkdir "/var/www" failed: No such file or directory 

如果提示权限不足,如下面

rsync: recv_generator: mkdir "/xxx" (in upload) failed: Permission denied

则将rsyncd中的gid和uid属性值改为root,或者将文件夹权限修改为777。

如果两台机器器有双向同步的需求,就两台都按服务端进行安装配置即可。

当然如果觉得上面两种方式有点绕,也可以将两台机器都按服务端进行安装配置。


三、inotify安装

以上安装完成我们已经可以手动进行同步了,但要实现实时同步,就要用到我们的inotify工具,它会实时监听目录变化,然后执行我们编写的同步脚步进行同步操作。此时我们采用推送方式,inotify监听本地目录变化,同步到目标目录(服务端)。

1.源机器安装软件

yum install inotify-tools --enablerepo=epel

2.编写同步脚本

脚本内容如下,保存为/etc/rsyncd/inotify-rsync.sh, 保存的路径自己可以根据情况定,我这里主要是把所有相关文件都放在/etc/rsyncd目录方便管理。

set -e 
#源目录
src=/var/www/web/
#目标服务器ip
target=192.168.0.23
               
#modify,delete,create,attrib这些为监听的动作,比如如果不要delete,那么删除的动作就不会触发同步
/usr/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src | while read files 
do
/usr/bin/rsync -vzrtopgq --delete --progress --password-file=/etc/rsyncd/rsyncd.password $src ruser@$target::web/
done

这里需要注意的是源目录src=/var/www/web/后面加了斜杠/表示将该目录的文件同步到目标目录,如果没有斜杠则是将这个目录同步到目标目录,假如目标目录也为/var/www/web,加斜杠之后两边文件位置一致,不加斜杠目标文件位置则变为/var/www/web/web。

目标路径ruser@$target::web/后面的斜杠可有可无,效果一样。

3.执行脚本

将文件赋予执行权限

chmod 755 /etc/rsyncd/inotify-rsync.sh

执行脚本

/etc/rsyncd/inotify-rsync.sh&

加&为后台运行,不加则为前台执行

运行后面我们在源目录添加一新文件进行测试,很快就可以看到它出现在目标目录。

如果想关闭当前会话连接之后一直再后台运行可以使用nohup命令,如下:

nohup /etc/rsyncd/inotify-rsync.sh&

或者screen命令(需要安装screen,yum install screen),执行命令如下

创建新会话(backgroundjob为会话名称,自己随便取

screen -dmS backgroundjob

切换到子会话

screen -r backgroundjob

在子会话中运行脚本

/etc/rsyncd/inotify-rsync.sh&

然后ctrl+a和d组合快捷就可以回到原会话,此时端口当前会话,脚本还会一直再后台运行,可以通过以下命令查看:

ps -ef | grep inotify

4. 将脚本执行添加到开机启动项

将/etc/rsyncd/inotify-rsync.sh&加到/etc/rc.local文件中。

echo "/etc/rsyncd/inotify-rsync.sh&" >>/etc/rc.local


至此我们就完成实时同步的所有工作。


PS:如果是CentOS6.x或者CentOS5.x需要安装xinetd

安装命令:

yum install rsync xinetd

编辑/etc/xinetd.d/rsync设置为开机启动rsync,修改disable属性值为no,如下:

disable = no 

启动xinetd服务

service xinetd start

      

转载请注明出处:http://www.xxling.com/article/2093.aspx

  • 分类: Linux
  • 阅读: (4250)
  • 评论: (0)
拍砖 取消
请输入昵称
请输入邮箱
*
 选择评论类型
300字以内  请输入评论内容