Linux学习之路我用 LinuxLinux

CentOS下(rsync+inotify)监听式实现服务器间备

2017-12-06  本文已影响416人  泥豆芽儿MT

背景

一种是触发式(crontab),另一种是监听式(inotify)
但是通过 crontab 守护进程方式进行触发,同步的数据和实际数据会有差异,而 inotify 可以监控文件系统的各种变化,当文件有任何变动时,就触发 rsync 同步,这样刚好解决了同步数据的实时性问题

一、概念介绍

二、功能分析

(1). 角色分配表

服务器名称 IP-addr status 工具安装 系统版本 操作目录
数据服务器 192.168.1.161 client rsync、inotify-tools centos6.5 /server/ftpInotify/
备份服务器 192.168.1.150 server rsync centos7 /server/ftpInotify/

谁主动谁是客户端,谁被动谁是服务端
如果我们需要实时备份数据,让 inotify 监控文件系统的各种变化,当文件有任何变动时,就触发rsync同步,则该源服务器为主动,那它就是客户端,备份服务器为被动方,那它就是服务端

(2). 简要说明

  1. 在操作上,最简单的配置比例为【1:1】
    例如,本次的实际操作中,我配置了一个数据服务器(IP:192.168.1.161),其中的一个备份服务器(IP:192.168.1.150),后期可以根据自己的需求添加 备份服务器 数目,比如说,后期个人测试时又添加了第一个备份服务器(IP:192.168.1.160)
  1. 功能实现的结果为:
    当数据服务器中的备份目录中数据发生变化时,对应的,备份服务器通过监控也会及时的进行同步更新,多台备份服务器

三、配置操作

(1). 备份服务器(server)配置

(服务器IP):192.168.1.150

①. 安装 rsync(备份服务器只安装 rsync,需要启动)

image
yum install rsync
[root@bogon rsyncd]# wget  http://rsync.samba.org/ftp/rsync/src/rsync-3.0.9.tar.gz  
[root@bogon rsyncd]# tar zxvf rsync-3.0.9.tar.gz  
[root@bogon rsyncd]# cd rsync-3.0.9  
[root@bogon rsyncd]# ./configure --prefix=/etc/rsyncd/rsync  #可自定义
[root@bogon rsyncd]# make  
[root@bogon rsyncd]# make install  

②. 建立 rsync 配置文件

mkdir /etc/rsyncd
touch /etc/rsyncd/rsyncd.conf #创建 rsyncd.conf,这是 rsync 服务器的配置文件
ln -s /etc/rsyncd/rsyncd.conf /etc/rsyncd.conf #创建软链接
# /etc/rsyncd: configuration file for rsync daemon mode
# See rsyncd.conf man page for more options.
# configuration example:

# uid = nobody
# gid = nobody
# use chroot = yes
# max connections = 4
# pid file = /var/run/rsyncd.pid
# exclude = lost+found/
# transfer logging = yes
# timeout = 900
# ignore nonreadable = yes
# dont compress   = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2

# [ftp]
#        path = /home/ftp
#        comment = ftp export area


uid = root
gid = root
use chroot = no
max connections = 10
strict modes = yes
hosts allow = 192.168.1.161               #可以空格,允许多个
port = 873                  #默认开启端口
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log



[inotify]                    
#认证模块名

path = /server/ftpInotify/   
#监控目录

comment = Hello My Dear!      
#此为注释信息,便于识别,可自定义

ignore errors
read only = no
write only = no

hosts allow = 192.168.1.161   
#此为数据服务器(client)IP地址

hosts deny = *
list = false
uid = root
gid = root
auth users = root             
#赋予权限的用户,此处我用的是root用户

secrets file = /etc/rsyncd/rsync.password 
#密码文件

【注】:

  1. 注释部分解释主要的配置信息
  2. 尤其要注意的是,注释部分的信息设置多数是换行操作,经测试发现,部分配置信息如果在同一行,就会报 “1503”或其他错误,比如 secrets file这行,同时此处对应的目录在下一步要用到.

③. 建立用户与密码认证文件

[root@bogon rsyncd]# echo "root:root123"> /etc/rsyncd/rsync.password 
[root@bogon rsyncd]# chmod 600 /etc/rsyncd/rsync.password 

【注】:

  1. 在 client 端建立的密码文件,只有密码,没有用户名
  2. 而在备份服务端 server 里建立的密码文件,用户名与密码都有。

④. 启动 rsync

rsync --daemon 

【注】:
修改 ***rsyncd.conf *** 配置文件后,记得需要重启 rsync 服务

 killall rsync
 rsync --daemon 
 lsof -i :873 #可查看是否已启动

(2). 数据服务器(client)配置

(服务器IP):192.168.1.161

①. 安装 rsync(只需安装,无需启动)

②. 建立访问服务端的密码认证文件

echo "root123" >/etc/rsyncd/rsync.password   
#其中 `root123` 可以自己设置密码,rsync.password 名字也可以自己设置
[root@bogon rsyncd]# chmod 600 rsync.password 

③. 安装 inotify-tools

[root@bogon etc]# ll /proc/sys/fs/inotify/
总用量 0
-rw-r--r--. 1 root root 0 12月  5 20:12 max_queued_events
-rw-r--r--. 1 root root 0 12月  5 20:12 max_user_instances
-rw-r--r--. 1 root root 0 12月  5 20:12 max_user_watches
[root@bogon rsyncd]# wget http://cloud.github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz  
[root@bogon rsyncd]# tar zxvf inotify-tools-3.14.tar.gz  
[root@bogon rsyncd]# cd inotify-tools-3.14  
[root@bogon inotify-tools-3.14]# ./configure --prefix=/usr/local/inotify  
[root@bogon inotify-tools-3.14]# make  
[root@bogon inotify-tools-3.14]# make install 

④. 创建 rsync 复制脚本

#!/bin/bash
host=192.168.1.150    #server的ip(备份服务器)
src=/server/ftpInotify/  #所要监控的备份目录(此处可以自定义,但是要保证存在)
des=inotify   #自定义的模块名,需要与client端定义的一致
password=/etc/rsyncd/rsync.password  #密码文件
user=root    #用户名(一个实际存在的账号)
inotify=/usr/local/inotify    #inotify的安装目录                

${inotify}/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src \
| while read files
do
rsync -avzP --delete  --timeout=100 --password-file=${password} $src $user@$host::$des
echo "${files} was rsynced" >>/tmp/rsync.log 2>&1
done
image
[root@bogon server]# chmod 764 inotify.sh 
[root@bogon server]# sh inotify.sh &
[1] 1925

【注】:
(如果可以,请将其设置为开机启动项)
本人通过实测发现,网上的好多方法没能设置成功,最后找到一种适合自己的方案,仅做参考:

echo "setsid /server/inotify.sh &" >> /etc/rc.local
image

(3). 功能测试

当然为了稳当起见,还是要重启测试下,自启动脚本是否正常运行,保证万无一失

image image

【注】:

  1. 以上操作也可以在一台服务器实现,同步目录到不同的目录
  2. 仿照相同的操作,可以扩展多个 server 端,例如我又根据上述操作,添加了一台备份服务器(IP:192.168.1.160),同时在数据服务器(IP:192.168.1.161)中还需添加一个 inotify2.sh 脚本文件,并同样的赋予764 权限 然后 运行脚本

四、附录

(1). 参考文章

(2). 自测:rsync 指定不需同步的目录操作

- server
    -ftpInotify
        -rs1
            RE.log
        -rs2
            -rs1
                RE.txt
            re.log
exclude = /rs1/
#指定不同步的目录,以空格分割 最前面的斜杠表示当前的‘path = /server/ftpInotify/’根目录,如果不加则表示所有的同名子目录
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1039) [sender=3.0.6]
sending incremental file list
ERROR: daemon refused to receive directory "rs1"
*** Skipping any contents from this failed directory ***

(3). 补充

上一篇 下一篇

猜你喜欢

热点阅读