服务器A 192.168.28.1
服务器B 192.168.28.2
把A服务器的/www/的数据备份到B服务器的/www/上
A,B服务器都要安装rsync 一般系统会默认安装了
[root@web1~]# rpm -q rsync
rsync-2.6.8-3.1
在rsync-daemon认证方式下,默认监听毒tcp的873端口
在rsync-daemon认证下,rsync可以把密码写入到一个文件中。
注意:被同步端(B服务器)的rsync必须启动,配置文件。同步端(A服务器)可以不起动服务,但必须有这个应用。
B服务器上操作,手动生动配置文件和密码文件
新建配置文件:
[root@cbd88 ~]# vi /etc/rsyncd.conf
#Rsync server
#created by yty 21:12 2015-05-23
##rsyncd.conf start##
uid = root
gid = root
use chroot = no
max connections = 2000
timeout = 600
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors
read only = false
list = false
hosts allow = 192.168.28.1
hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsyncd.password
#####################################
[web]
comment = www by yty 21:13 2015-05-23
path = /www/
密码文件:
[root@cbd88 ~]# vi /etc/rsyncd.password
rsync_backup:123456
daemon方式运行rsync
rsync --daemon
以下都从A服务器操作:
下载安装inotify-tools
wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
tar -zvxf inotify-tools-3.14.tar.gz
cd inotify-tools-3.14
[root@ inotify-tools-3.14]# ./configure --prefix=/usr/local/inotify
[root@ inotify-tools-3.14]# make [root@ inotify-tools-3.14]# make install
inotifywait:通过inotify API等待被监控文件上的相应事件并返回监控结果 默认情况下,正常的结果返回至标准输出,
诊断类的信息则返回至标准错误输出。
它可以在监控到对应监控对象上指定的事件后退出,也可以进行持续性的监控。
inotifywatch:通过inotify API收集被监控文件或目录的相关事件并输出统计信息。
优化 Inotify
[root@web ~]# ll /proc/sys/fs/inotify/
总用量0
-rw-r--r--1 root root 09月923:36 max_queued_events
-rw-r--r--1 root root 09月923:36 max_user_instances
-rw-r--r--1 root root 09月923:36 max_user_watches
-----------------------------
max_user_watches #设置inotifywait或inotifywatch命令可以监视的文件数量(单进程)
max_user_instances #设置每个用户可以运行的inotifywait或inotifywatch命令的进程数
max_queued_events #设置inotify实例事件(event)队列可容纳的事件数量
----------------------------
[root@web ~]# echo 50000000>/proc/sys/fs/inotify/max_user_watches -- 把他加入/etc/rc.local就可以实现每次重启都生效
[root@web ~]# echo 50000000>/proc/sys/fs/inotify/max_queued_events
echo 50000000>/proc/sys/fs/inotify/max_user_watches
echo 50000000>/proc/sys/fs/inotify/max_queued_events
生成密码文件
[root@localhost ~]# cat /etc/rsync.passwd
123456
首次全量同步
rsync -avz --exclude-from=/tools/exclude.txt --password-file=/etc/rsync.passwd /www/ rsync_backup@192.168.28.2::web
/tools/exclude.txt为排除文件,内容如下:
[root@localhost ~]# cat /alidata/shell/exclude.txt
Admin/Runtime/*
Home/Runtime/*
Waphome/Runtime/*
other2017/runtime/*
每10小时进行一次全量同步
* */10 * * * rsync -avz --exclude-from=/tools/exclude.txt --password-file=/etc/rsync.passwd /www/ rsync_backup@192.168.28.2::web
时时同步监控脚本:
vi /tools/everyworking.sh
#!/bin/bash
src=/www/ # 需要同步的源路径
des=web
exclude_file=/tools/exclude.txt
rsync_passwd_file=/etc/rsync.passwd # rsync验证的密码文件
ip1=192.168.28.2 # B服务器
user=rsync_backup # rsync --daemon定义的验证用户名
cd ${src}
# 此方法中,由于rsync同步的特性,这里必须要先cd到源目录,inotify再监听 ./ 才能rsync同步后目录结构一致,有兴趣的同学可以进行各种尝试观看其效果
/usr/local/inotify/bin/inotifywait -mrq --format '%Xe %w%f' -e modify,create,delete,attrib,close_write,move ./ | while read file
# 把监控到有发生更改的"文件路径列表"循环
do
echo "***************************************************************************"
INO_EVENT=$(echo $file | awk '{print $1}') # 把inotify输出切割 把事件类型部分赋值给INO_EVENT
INO_FILE=$(echo $file | awk '{print $2}') # 把inotify输出切割 把文件路径部分赋值给INO_FILE
echo "-------------------------------$(date)------------------------------------"
echo $file
#增加、修改、写入完成、移动进事件
#增、改放在同一个判断,因为他们都肯定是针对文件的操作,即使是新建目录,要同步的也只是一个空目录,不会影响速度。
if [[ $INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'MODIFY' ]] || [[ $INO_EVENT =~ 'CLOSE_WRITE' ]] || [[ $INO_EVENT =~ 'MOVED_TO' ]] # 判断事件类型
then
echo 'CREATE or MODIFY or CLOSE_WRITE or MOVED_TO'
rsync -avzcR --exclude-from=${exclude_file} --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des}
# INO_FILE变量代表路径哦 -c校验文件内容
#rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des}
#仔细看 上面的rsync同步命令 源是用了$(dirname ${INO_FILE})变量 即每次只针对性的同步发生改变的文件的目录(只同步目标文件的方法在生产环境的某些极端
#环境下会漏文件 现在可以在不漏文件下也有不错的速度 做到平衡)
#然后用-R参数把源的目录结构递归到目标后面 保证目录结构一致性
fi
#删除、移动出事件
if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]]
then
echo 'DELETE or MOVED_FROM'
rsync -avzR --exclude-from=${exclude_file} --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des}
#看rsync命令 如果直接同步已删除的路径${INO_FILE}会报no such or directory错误 所以这里同步的源是被删文件或目录的上一级路径
#并加上--delete来删除目标上有而源中没有的文件,这里不能做到指定文件删除,如果删除的路径越靠近根,则同步的目录月多,同步删除的操作就越花时间。
#这里有更好方法的同学,欢迎交流。
fi
#修改属性事件 指 touch chgrp chmod chown等操作
if [[ $INO_EVENT =~ 'ATTRIB' ]]
then
echo 'ATTRIB'
if [ ! -d "$INO_FILE" ]
# 如果修改属性的是目录 则不同步,因为同步目录会发生递归扫描,等此目录下的文件发生同步时,rsync会顺带更新此目录。
then
rsync -avzcR --exclude-from=${exclude_file} --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des}
fi
fi
done
添加执行权限
chmod a+x /tools/everyworking.sh
运行时时同步脚本:
sh /alidata/shell/awaystime.sh &
来源:oschina
链接:https://my.oschina.net/u/3222437/blog/2221305