赞
踩
✌
rsync 可以实现服务器间的文件同步,有两种方式
一种是触发式 —— crontab;
另一种是监听式 —— inotify,但是通过 crontab 守护进程方式进行触发;
同步的数据和实际数据会有差异;
而 inotify 可以监控文件系统的各种变化;
当文件有任何变动时,就触发 rsync 同步, 这样刚好解决了同步数据的实时性问题
CentOS 6.5
,CentOS 7
【声明】 :本文参考了网上很多前辈的言论,并通过自己的实践进行了整理,希望能帮助更多的程序猿探索之路上的顺利 …
inotify 是一种强大的、细粒度的、异步的文件系统事件控制机制
linux
内核从 2.6.13
起,加入了 inotify
支持,通过 inotify
可以监控文件系统中添加、删除、修改、移动等各种事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而 inotify-tools
正是实施监控的软件服务器名称 | 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 同步,则该源服务器为主动,那它就是 客户端;
备份服务器为被动方,那它就是 服务端
1. 在操作上,最简单的配置比例为【1:1】
例如,本次的实际操作中,我配置了一个数据服务器(IP:192.168.1.161)
其中的一个备份服务器(IP:192.168.1.150)
后期可以根据自己的需求添加 备份服务器 数目
比如说,后期个人测试时又添加了第一个备份服务器(IP:192.168.1.160)
2. 功能实现的结果为:
当数据服务器中的备份目录中数据发生变化时
对应的,备份服务器通过监控也会及时的进行同步更新,多台备份服务器
root
账户,当然,如果使用的是其他账户,只要保证有足够的权限也可,谢谢 …(服务器IP):192.168.1.150
如今的 linux
系统,很可能已经默认安装了 rsync
,可以运行命令 rpm -aq rsync
或者 rsync -v
进行查看,如下信息说明已经安装了 rsync
如果没有默认安装,建议运行如下命令
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
centos6.5
和 centos7
已默认安装了 rsync
,为了便于操作,本人创建了目录/etc/rsyncd/
,然后添加了一个软链接,并将信息写入该目录下的 rsync.conf
文件
注意:
如果之间就默认安装的rsync
,那么就已存在/etc/rsyncd.conf
文件,所以要先删掉该文件,不然创建软链接会报错“已存在文件xxx”
mkdir /etc/rsyncd
touch /etc/rsyncd/rsyncd.conf #创建 rsyncd.conf,这是 rsync 服务器的配置文件
ln -s /etc/rsyncd/rsyncd.conf /etc/rsyncd.conf #创建软链接
rsync
目录下,创建 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 #密码文件 exclude = /rs1/ #指定不同步的目录,以空格分割 最前面的斜杠表示当前的‘path = /server/ftpInotify/’根目录,如果不加则表示所有的同名子目录
【注】:
1. 注释部分解释主要的配置信息
2. 尤其要注意的是,注释部分的信息设置多数是换行操作,
经测试发现,部分配置信息如果在同一行,就会报 "1503" 或其他错误,比如 "secrets file" 这行
同时此处对应的目录在下一步要用到.
root
用户进行操作,自定义密码为 root123
(此密码并非登录密码,只是一个 rsync
与 client
服务器进行交互的凭证,可自定义)rsync.password
文件,并写入【用户名:密码】,记住此处的密码![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 #可查看是否已启动
(服务器IP):192.168.1.161
/etc/rsyncd/
echo "root123" >/etc/rsyncd/rsync.password
#其中 "root123" 可以自己设置密码,rsync.password 名字也可以自己设置
[root@bogon rsyncd]# chmod 600 rsync.password
inotify
[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
wget http://cloud.github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
命令无法获取源包(至少本人获取失败),可以下载源包,再移动到自己的操作目录【inotify-tools-3.14.tar.gz 】 链接:https://pan.baidu.com/s/1c2OP90 密码:v01s
此项功能主要是将 client
端的目录 /server/ftpInotify/
里的内容,如果修改了(无论是添加、修改、删除文件)能够通过 inotify
监控到,并通过 rsync
实时的同步给 server
的 /server/ftpInotify/
里
以本人操作为例子,创建 inotify.sh
脚本文件,并写入下面的信息
(请根据自己的需求参考注释进行修改,尽量保证该文件不会被删除,可放置于非同步目录中)
#!/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
参考截图
保存文件后,为 .sh 脚本增加 764 权限
[root@bogon server]# chmod 764 inotify.sh
"sh inotify.sh &"
或者 "nohup sh inotify.sh &"
(前者会一直打印信息,建议使用后者)[root@bogon server]# nohup sh inotify.sh &
[1] 1925
此时,日志信息都会默认存储到当前目录下的一个
nohup.out
文件中,可自行查看
ps -ef |grep inotify
,查看 进程运行情况,如果想结束线程,可以使用命令 kill -9 xxx
echo "setsid /server/inotify.sh &" >> /etc/rc.local
【重点】:
[root@bogon server]# cat /dev/null >nohup.out
------ 鄙人建议,使用计划任务定期清除日志信息
,可参考文章:Linux crontab 定时任务的使用
> 其中提及的就有这个 "nohup.out"文件;
> 同时和前面在配置备份服务器中设置rsync打印日志的目录文件 >>> "/var/log/rsyncd.log"
> 注意不要轻易使用 "rm -rf "命令;
> 测试中发现,有影响网站运行的情况发生!!!
当然为了稳当起见,还是要重启测试下,自启动脚本是否正常运行,保证万无一失
- 首先,保证了服务器对应的位置,都已经建立了操作目录
- 保证相应的服务都已经启动
- 例如,我在 client (192.168.1.161) 的 "/server/ftpInotify" 目录下
更改了"RE"文件,并进行了保存,此时,其所在的终端会自动打印如下信息:
server
(192.168.1.150) 对应的 /server/ftpInotify
目录,会发现,文件已经进行了更新【注】:
> 1. 以上操作也可以在一台服务器实现,同步目录到不同的目录
> 2. 仿照相同的操作,可以扩展多个"server" 端;
例如我又根据上述操作,添加了一台备份服务器(IP:192.168.1.160);
同时在数据服务器(IP:192.168.1.161)中还需添加一个 "inotify2.sh" 脚本文件;
并同样的赋予 764 权限 然后运行脚本
特别推荐
)】- server
-ftpInotify
-rs1
RE.log
-rs2
-rs1
RE.txt
re.log
rsyncd.conf
文件rsyncd.conf
文件,其中的 “exclude”
参数可用于表示不需要同步的指定目录,注我的备注,如果写成 “rs1/”
,那么结果就是所有的 rs1
目录都不同步,文件可以同样类比结论 …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 ***
.sh
脚本--exclude
进行排除,个人测试发现,如果需要排除的是一个目录,应该注意添加后面的/
,如果有多个可以依次配置,我网站的实际配置举例如下: rsync -avzP --delete --exclude=Public/ --exclude=Application/Runtime/ --timeout=100 --password-file=${password} $src $user@$host::$des
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。