从零开始的Linux运维屌丝之路,资源免费分享平台   运维人员首选:简单、易用、高效、安全、稳定、社区活跃的开源软件

Rsync、innotify、Sersync安装与配置

发布:蔺要红04-16分类: 运维


rsync官方文档    :https://rsync.samba.org/ftp/rsync/rsync.html

rsync常见问题汇总:mirrors.linyaohong.com/conf/rsync/help.txt
 

rsync工具介绍:

远程数据备份工具、全备或者增量备份,也可以本地数据同步
可以远程拷贝,相当于ssh带的scp ,比scp命令更好,scp每次都是全量拷贝,优点在于增量拷贝
本地数据拷贝,类似于cp,cp每次都是全量拷贝
删除功能类似于rm
版本更新:  centos5  rsync  把所有的文件比对一遍,然后同步 / centos6  rsync 一边比对差异,一遍对差异部分进行同步


rsync功能介绍:

支持拷贝特殊文件如链接,设备等
可以有排除指定文件或目录同步的功能,相当于打包命令tar
可以保持原来文件或目录的权限,时间,软硬链接等所有属性均不改变。
可实现增量同步,即只同步发生变化的数据,因此数据传输效率更高
增量备份,支持socket(daemon),集中备份(推拉) 


rsync+innotify

大量小文件同步时间比较长,有的时候rsync进程可能会终止
同步大文件,比如10G 可能会中断,
rsync+inotify
notify优点:
监控文件系统事件变化,通过同步工具实现实时数据同步
iontify缺点:
1.并发如果大于200个文件(10-100K),同步会有延迟
2.监控到事件后,调用rsync同步是单线程的(加&并发),sersync多进程同步


sersync优点

可以通过配置文件来配置
真正的守护进程(socket)
可以对失败的文件进行第二次重传(如果第二次失败,会清空重传脚本,这里可利用设置多长时间进行一次全量同步来弥补)
默认多线程同步
支持插件,第三方的HTTP接口(作者已停止更新)

 

其他方案解决

drdb同步软件(效率更高,备节点不可见)、drdb文件系统级别
双写
rsync+sersync  也是文件级同步(比inotify的有点是,有配置文件,可以同步失败的文件,可以定时全量同步
inotify+rsync 文件级别同步
第三方软件的同步功能(mysql同步,oracle,mongodb)
业务逻辑解决
读写分离 写rsync服务端,读rsync客户端,当不同步时在读主(根据业务需求来做规划)


rsync的三种工作模式:

本地模式
远程shell模式
Daemon模式(重点,工作中使用) ,daemon模式使用端口为:873


rsync安装和配置:
 
rpm  -qa|grep rsync                               #检查系统是否安装了rsync
yum -y install rsync                              #安装
/usr/bin/rsync --daemon /etc/rsyncd.conf          #启动
echo "back2018up:2018up" >>/etc/rsync.password    #配置账号密码文件
chmod 600  /etc/rsync.password                    #账号密码文件600权限
/usr/bin/rsync --daemon /etc/rsyncd.conf          #以daemon模式启动rsync

#----------------------配置文件----------------------------------------
[root@web]# cat /etc/rsyncd.conf 
uid = www
gid = www
use chroot  = no
max connections = 200
timeout = 300
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file =  /var/log/rsync.log
ignore errors
read only = false
list = false
hosts allow =  172.31.66.1/24 
hosts deny = *
auth users = backup
secrets file = /etc/rsync.passwd
#exclude = runtime


[www]
comment = "wwwroot"
path = /www/wwwroot/
exclude = test1

[logs]
comment = "logs"
path = /www/logs/
exclude = test2
#排除目录,单独模块排除 和  整体设置排除  生效的只有一个 有限单独模块设置排除的目录,排除目录,目录后面不要加/

uid = www                                       #用户 使用www  或者单独的用户 rsync(需要用户对要同步的目录有管理权限)
gid = www
use chroot = no                                  # 安全相关
max connections = 2000                           # 并发连接数
timeout = 600                                    # 超时时间(秒)
pid file = /var/run/rsyncd.pid                   # 指定rsync的pid目录
lock file = /var/run/rsync.lock                  # 指定rsync的锁文件【重要】
log file = /var/log/rsyncd.log                   # 指定rsync的日志目录
ignore errors                                    #忽略I/O错误
read only = false                                #指定客户端是否可以上传文件,默认对所有模块都为ture
list = false                                     #允许列表
hosts allow =  172.31.66.1/24                    #允许这列客户端访问我的rsync服务 ,没有此参数都可以链接
hosts deny = *                                   #拒绝这些客户端访问我的rsync服务 ,没有此参数都不拒绝
auth users = rsync_backup                        #认证用的用户 虚拟的
secrets file = /etc/rsync.password               #密码文件

#exclude = test                                  #排除文件(当这里配置时候意思代表下面模块都排除)


rsync本地模式(感觉还是很有用的):
 
rsync  --delete   #让目标目录与源目录数据一致
rsync -avz        #保持文件属性
rsync -avz --delete   ./A/  ./B/     #推送A目录下的内容到 B 目录下
rsync -avz --delete   ./A  ./B/      #推送A 目录 到B目录下

rsync远程shell模式(不重要): 
 
拉取20服务器上面的数据
rsync -avz -e 'ssh -p 22' root@192.168.8.20:/home/shell/  /home/   #把shell目录里的内容同步到 home目录下
rsync -avz -e 'ssh -p 22' root@192.168.8.20:/home/shell  /home/  #把shell目录夹同步到home目录下   
把数据推送到21服务器
rsync -avz -e 'ssh -p 22 ' /home/shell  root@192.168.8.20:/home/   #push 把shell目录推送到20 home下
rsync -avz -e 'ssh -p 22 ' /home/shell/  root@192.168.8.20:/home/  #push 把shelll目录下的的文件 推送到21home

rsync  damon模式(重要):  
 

服务端配置
echo   "backup2018" > /etc/rsyncd.password   #配置密码问   这个密码为服务端配置的密码
chmod   600  /etc/rsyncd.password              #修改密码文件为600权限

 
#不要写错字符!word写成 wrod害的老子找了1个小时的错误

rsync常用命令
 

排除文件 
    --exclude=a  
    --exclude={a,b,c}
    --exclude-from=/tmp/pc.txt
无差异同步
    --delete
断点续传限速
    --partial
限速
    --bwlimit=KBPS   --bwlimit=10


rsync -avzP --delete
--exclude={a,b,c} --partial --bwlimit=100   /backup/ rsync_backup://aaa@192.168.8.20/backup --password-file=/etc/rsync.password

#推送
rsync -avzP --bwlimit=50000 --exclude=runtime  --exclude=.user.ini --exclude=.svn  /www/wwwroot/  backup2018up@172.31.66.134::443   --password-file=/etc/rsync.passwd
#拉取
rsync -avzP --bwlimit=50000 --exclude=runtime  --exclude=.user.ini --exclude=.svn  backup2018up@172.31.66.134::443   /www/wwwroot/    --password-file=/etc/rsync.passwd


rsync命令参数详解
 
# -avzP 为常用参数,如果放到脚本中执行命令可以把-v和-P 去掉
 

-v     --verbose 详细模式输出
-q     --quiet 精简输出模式
-c     --checksum 打开校验开关  强制对文件传输进行校验
-a     --archive 归档模式  表示以递归方式传输文件  并保持所有文件属性  等于-rlptgoD
-r     --recursive 对子目录以递归模式处理
-R     --relative 使用相对路径信息
--timeout=30  IP超时时间  单位为秒
-P    --progress 显示备份过程
--bwlimit=KBPS 限制I/O带宽  KBytes per second
-u     --update 仅仅进行更新  也就是跳过所有已经存在于DST  并且文件时间晚于要备份的文件。(不覆盖更新的文件)
-l     --links 保留软链结
-L     --copy-links 想对待常规文件一样处理软链结
-p     --perms 保持文件权限
-o     --owner 保持文件属主信息
-g     --group 保持文件属组信息
-D     --devices 保持设备文件信息
-t     --times 保持文件时间信息
-S     --sparse 对稀疏文件进行特殊处理以节省DST的空间
-n     --dry-run现实哪些文件将被传输
-W     --whole-file 拷贝文件  不进行增量检测
-x     --one-file-system 不要跨越文件系统边界
-B     --block-size=SIZE 检验算法使用的块尺寸  默认是700字节
-e     --rsh=COMMAND 指定使用rsh、ssh方式进行数据同步
--rsync-path=PATH 指定远程服务器上的rsync命令所在路径信息
-C     --cvs-exclude 使用和CVS一样的方法自动忽略文件  用来排除那些不希望传输的文件
--existing 仅仅更新那些已经存在于DST的文件  而不备份那些新创建的文件
--delete 删除那些DST中SRC没有的文件
--delete-excluded 同样删除接收端那些被该选项指定排除的文件
--delete-after 传输结束以后再删除
--ignore-errors 及时出现IO错误也进行删除
--max-delete=NUM 最多删除NUM个文件
--partial 断点续传。保留那些因故没有完全传输的文件  以是加快随后的再次传输
--force 强制删除目录  即使不为空
--numeric-ids 不将数字的用户和组ID匹配为用户名和组名
-I     --ignore-times 不跳过那些有同样的时间和长度的文件
-z     --compress 对备份的文件在传输时进行压缩处理
--exclude=PATTERN 指定排除不需要传输的文件模式
--include=PATTERN 指定不排除而需要传输的文件模式
--exclude-from=FILE 排除FILE中指定模式的文件
--include-from=FILE 不排除FILE指定模式匹配的文件
--port=PORT 指定其他的rsync服务端口
--password-file=FILE 从FILE中得到密码

 
inotify安装和使用





 

inotify
优点:监控文件系统事件变化,通过同步工具(rsync等)实现数据实时同步
缺点  1)并发如果大约200个文件(10-100K),同步就会有延迟
      2)每次都是全部推送一次,但确实是增量的
      3)监控到事件后,调用rsync同步是单进程的(加&并发),而sersync是多进程同步

 
wget -O /etc/yum.repos.d/eple.repo  http://mirrors.aliyun.com/repo/epel-7.repo  #下载eple源
yum -y install inotify-tools      #安装

[root@moban backup]# ls -l /proc/sys/fs/inotify/  #安装了这3个文件
total 0
-rw-r--r-- 1 root root 0 Jul 29 09:59 max_queued_events
-rw-r--r-- 1 root root 0 Jul 29 09:59 max_user_instances
-rw-r--r-- 1 root root 0 Jul 29 09:59 max_user_watches
总共安装了两个工具(命令): 
inotifywait    #在被监控的文件或者目录上等待特定文件系统事件(open、close、delede等)发生,执行后处于阻塞状态,适合shell脚本中使用  
inotifywatch  #收集被监视的文件系统使用度统计数据,指文件系统事件发生的次数统计

inotify优化
 
[root@moban backup]# cat /proc/sys/fs/inotify/max_queued_events 
16384       #可以监视文件的数量(单进程)
[root@moban backup]# cat /proc/sys/fs/inotify/max_user_instances 
128         #每个用户可以运行inotifywait  和 inotifywatch命令的进程数
[root@moban backup]# cat /proc/sys/fs/inotify/max_user_watches 
8192        #设置inotify实例事件(event)队列可容纳的事件数量

inotify使用
 

1、创建方便管理存放脚本的目录 mkdir /server/scripts/
2、创建脚本、
3、后台启动

#说明inotify机器不需要启动rsync、用推送的方式推送的rsync的daemon端
[root@moban scripts]# vim inotifytool.sh       #创建脚本
#!/bin/bash  
src=/backup/    #需要同步的源目录                        
des=backup      #目标deamon                           
rsync_passwd_file=/etc/rsyncd.password           
ip1=192.168.8.20   #目标服务器             
ip2=192.168.0.19                
user=backup2018up                     
cd ${src}                            
/usr/bin/inotifywait -mrq --format  '%Xe %w%f' -e modify,create,delete,attrib,close_write,move ./ | while read file
do
        INO_EVENT=$(echo $file | awk '{print $1}')
        INO_FILE=$(echo $file | awk '{print $2}') 
        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 --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} &&
                rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des}
        fi
        if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]]
        then
                echo 'DELETE or MOVED_FROM'
                rsync -avzR --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} &&
                rsync -avzR --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des}
        fi
        if [[ $INO_EVENT =~ 'ATTRIB' ]]
        then
                echo 'ATTRIB'
                if [ ! -d "$INO_FILE" ]
                then
                        rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} &&         
                        rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des}
                fi
        fi
done

因为inotify只在启动时会监控目录,他没有启动期间的文件发生更改,他是不知道的,所以这里每2个小时做1次全量同步,防止各种意外遗漏,保证目录一致。

crontab -e
* */2 * * * rsync -avz --password-file=/etc/rsync-client.pass /data/ root@192.168.0.18::data && rsync -avz --password-file=/etc/rsync-client.pass /data/ root@192.168.0.19::data
 
inotify监控目录时排除文件
 
#!/bin/bash
inotify=/usr/bin/inotifywait
cd /www/wwwroot/update/
#$inotify -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e delete,create,close_write ./ |while read file
$inotify -mrq   --exclude '^./(.svn|(.*/*\.log|.*/*\.swp)$)'  --format '%w%f' -e delete,create,close_write ./ |while read file
do
    echo  "$file"
    cd /www/wwwroot/update/
    #svn add $file  --no-ignore  --force
    svn add *  --no-ignore  --force
    svn ci  -m "linux ci" --username b2cshop --password b2c2018
done


inotify启动
 
/bin/sh /server/scripts/inotifytool.sh &  #这个是cenos6
/usr/bin/nohup /server/scripts/inotifytool.sh  >/dev/null 2>&1  &   #Centos7 后台运行、并且记录日志
#加入开启自启动
 
sersync+rsync实时同步






sersync安装配置使用
 
1、启动sersync使用20个进程
2、每秒文件变动在70个文件左右、程序容忍同步时间在1-2s以内
 

环境准备:
192.168.8.24-rysnc服务端(需要配置好rsync) 备份服务器A
192.168.8.25-rsync 服务端(需要配置好rsync)备份服务器B
192.168.8.23-Sersync服务端(仅需要安装rsync即可,不需要配置rsync的daemon) 这个是源!!!!十万个草拟吗


下载        :https://mirrors.linyaohong.com/conf/rsync/sersync.tar.gz

配置文件    :https://mirrors.linyaohong.com/conf/rsync/sersync/conf/wwwroot_confxml.xml

配置文件说明:https://mirrors.linyaohong.com/conf/rsync/sersync.xml

启动sersync :


如果设置了过滤器,即在xml文件中,filter为true,则暂时不能使用-r参数进行整体同步。-r参数将会无效
当加入开机自启动的时候 不需要-r参数  -r 是进行整体同步一次

 

chmod +x sersync2
/usr/local/sersync/sersync2 -n 10 -d -o /usr/local/sersync/confxml.xml
sersync整体同步一次
在sersync目录下运行./sersync2 -r

#只调用cmmand插件

./sersync2 -d -m command

启动说明
[root@test-web bin]# ./sersync -h
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
_______________________________________________________
参数-d:启用守护进程模式
参数-r:在监控前,将监控目录与远程主机用rsync命令推送一遍
c参数-n: 指定开启守护线程的数量,默认为10个  4核服务器差不多
参数-o:指定配置文件,默认使用confxml.xml文件
参数-m:单独启用其他模块,使用 -m refreshCDN 开启刷新CDN模块
参数-m:单独启用其他模块,使用 -m socket 开启socket模块
参数-m:单独启用其他模块,使用 -m http 开启http模块
不加-m参数,则默认执行同步程序


sersync测试

在Sersync服务端用脚本循环写入文件、然后统计两边文件数量(可以使用Xshell底部的批量执行命令,执行tree|wc -l来统计文件个数,即可算出每秒同步的文件数量)
 

#1、在backup里创建不同的文件
mkdir test
for n in  `seq 100`; do mkdir -p test/$n;done
然后执行写入文件脚本

#2、用如下命令在交谈窗口执行
echo -en "`date +%H:%M`\t" >>/tmp/rsync.log && tree|wc -l >>/tmp/rsync.log
得出的文件内容如下:
16:59	4171
16:59	4213
16:59	4363
16:59	4423

#3、把两台机器的文件用 paste命令合并、即可得出每秒的延迟数量
paste   rsync.log 11_rsync.log > new_rsync.log
[root@web01 ~]# awk '{if($1==$3) print $1" "$2" "$4" "(($2-$4));}' new_rsync.log
16:57 4181 4171 10
16:59 4263 4213 50
16:59 4373 4363 10
16:59 4483 4423 60
写文件脚本
#!/bin/sh
count=30

while true
do

	for ((i=1;i<=$count;i++))
	do
	    /bin/cp 10k.jpg /backup/test/$i/10k_`echo $(date)$RANDOM|md5sum |cut -c 1-8`.jpg
	done

	sleep 1

	for ((i=1;i<=$count;i++))
	do
	    /bin/cp 30k.jpg /backup/test/$i/30k_`echo $(date)$RANDOM|md5sum |cut -c 1-8`.jpg
	done

	sleep 1

	for ((i=1;i<=$count;i++))
	do
	    /bin/cp 50k.jpg /backup/test/$i/50k`echo $(date)$RANDOM|md5sum |cut -c 1-8`.jpg
	done

	sleep 1

done
 
sersync监控
 
1、rsync客户端(远程同步端/web端)rsync进程和端口
2、sersync服务端的进程、同步状态(可以往sersync某个文件写入内容、然后去rsync端查看是否更新)
3、监控sersync失败日志大小的监控

sersync服务端文件更新过于频繁、失败日志过大。是sersync进程死掉的主要原因
Rsync服务端排错思路





 


查看rsync服务配置文件路径是否正确 /etc/rsyncd.conf
查看配置文件例的host allow,host deny,允许的ip网段是否是允许客户端访问的ip网段
查看配置文件中path参数里的路径是否存在,权限是否正确(正常应为配置文件中的UUID参数对应的属主和组)
查看rsync服务是否启动,端口是否存在 ps -ef  netstat -lntup
查看iptables防火墙和SELinux是否开启允许rsync服务通过,也可以关闭
查看服务端rsync配置文件里的密码权限是否为600 密码文件格式是否正确,正确格式(用户名:密码)文件路径和配置文件里的secrect files 参数对应
如果是推送数据,要查看,配置rsyncd.conf 文件中用户是否对模块下目录有可读的权限
==============================================================================================
客户端排错思路
查看客户端rsync配置的密码文件是否为600的权限,密码文件格式是否正确,注意:仅需要有密码,并且和服务端的密码一致
用telnet链接rsync服务器ip地址873端口,查看服务是否启动(可测试服务端防火墙是否阻挡telnet10.0.0.100 873)
客户端执行命令是 rsync -avzP rsync_backup@10.0.0.100::backup/test/test/ --password-file=/etc/rsync.password

 

温馨提示如有转载或引用以上内容之必要,敬请将本文链接作为出处标注,如有侵权我会在24小时之内删除!

欢迎使用手机扫描访问本站