Rsync + Sersync 数据实时同步
实时同步方案:
一、rsync+inotify与rsync+sersync架构的区别
1、rsync+inotify (不推荐,inotify是对本地文件或目录的实时监控)
a、inotify只能记录下被监听的目录发生了变化(增,删,改)并没有把具体是哪个文件或者哪个目录发生了变化记录下来;
b、rsync在同步的时候,并不知道具体是哪个文件或目录发生了变化,每次都是对整个目录进行同步,当数据量很大时,整个目录同步非常耗时(rsync要对整个目录遍历查找对比文件),因此效率很低
2、rsync+sersync (推荐,是inotify的升级版,功能更强大,本篇篇文章就使用该方案)
a、sersync可以记录被监听目录中发生变化的(增,删,改)具体某个文件或目录的名字;
b、rsync在同步时,只同步发生变化的文件或目录(每次发生变化的数据相对整个同步目录数据来说很小,rsync在遍历查找对比文件时,速度很快),因此效率很高。
c、sersync 调用 rsync 客户端命令将更新的目录和文件增量同步到 rsync 服务器,实现数据同步;
部署环境
服务器名称 | IP地址 | 服务包 |
应用服务器(客户端) | 192.168.1.129 | rsync、sersync |
备份服务器(服务端) | 192.168.1.130 | rsync |
[root@localhost ~]# date 2023年 06月 01日 星期四 15:55:14 CST [root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core)
安装rsync (客户端、服务端都要进行安装,一般系统自带)
安装rsync,我们可以分为两种方式:源码方式安装和RPM方式安装。 注意:rsync软件无论是服务器端还是客户端都是同一个软件包。 RPM方式: 直接挂载镜像使用yum进行安装 #yum安装rsync yum install -y rsync 源码方式: rsync官网: https://rsync.samba.org/ftp/rsync/ https://download.samba.org/pub/rsync/src/ https://rsync.samba.org/download.html 1)、下载 wget https://download.samba.org/pub/rsync/src/rsync-3.2.3.tar.gz 2)、解压并安装 tar -xvf rsync-3.2.3.tar.gz 3)、编译安装 # 源码安装rsync时,其编译时所需要的gcc库文件尽量提前安装完毕 # 默认安装到/usr/local/目录下 ./configure make &&make install 4)、设置开机启动 echo "/usr/local/bin/rsync --daemon -config=/etc/rsyncd.conf" >>/etc/profile
服务端配置
rsync的配置分为服务器端和客户端,使用rsync协议,需要服务端启动守护进程
#以rsync用户启动进程 uid = rsync gid = rsync #禁锢推送的数据至某个文件夹,不允许跳出该目录 use chroot = no max connections = 200 #最大连接数 transfer logging = yes #使rsync服务器使用ftp格式的文件来记录下载和上载操作在自己单独的日志中。 pid file = /var/run/rsyncd.pid #进程信息文件,便于获取进程号停止进程,便于判断服务是否启动,避免反复启动 lock file = /var/run/rsyncd.lock #锁文件 log file = /var/log/rsyncd.log #服务运行时日志文件 timeout = 900 #无需让rsync以root身份运行,允许接收文件的完整属性 fake super = yes port = 873 #服务默认端口号873 address = 192.168.1.130 #指定服务器ip地址 auth users = rsyncbackup # 虚拟用户,全局配置 secrets file = /etc/rsync.passwd #密码文件,包含客户机使用定义认证用户连接服务器需要的用户和密码信息 hosts allow = 192.168.1.129 # 允许访问rsync服务器的客户端白名单 hosts deny = * #禁止访问rsync服务器的客户端黑名单 read only = false #指定备份目录的权限为可读可写 list = false #是否可以列表 [129] # 模块名称,可以定义多个 Comment = data129 # 模块注释信息 path = /data/ #定义接受备份数据目录 ignore errors #跳过错误
创建同步用户并启动
#需要一个rsync进程运行时使用的普通用户 rsync useradd rsync -M -s /sbin/nologin # 服务端需要定义一个客户端连接 虚拟用户名和密码 # 密码文件形式 user:passwd echo "rsyncbackup:123456" > /etc/rsync.passwd chmod 600 /etc/rsync.passwd # 准备模块定义好的目录,客户端的数据都存放在该目录下 mkdir /data/ chown -R rsync.rsync /data/ # 启动服务 rsync --daemon --config /etc/rsyncd.conf # 查看服务 ps aux | grep rsync netstat -lntp|grep 873
客户端使用
# 在客户端安装完毕rsync服务后,是不需要启动rsync服务的。 # 我们只需要在客户端创建连接rsync服务器时,验证码用户所需要的密码文件即可。 # 该密码文件中的密码要与rsync服务器上的密码文件中的密码对应 # 并且也要与rsync服务器rsyncd.conf配置文件中的认证模块中的用户匹配 echo “123456”>>/etc/rsync.passwd chmod 600 /etc/rsync.passwd 配置完成后服务端与客户端防火墙设置允许rsync端口通信 firewall-cmd --permanent --zone=public --add-port=873/tcp firewall-cmd --reload # 查看 rsync 守护程序分配的所有 module 列表,可以执行下面命令。 # 具体写法是服务器与目标目录之间使用双冒号分隔`::` # 地址中的module并不是实际路径名,而是 rsync 守护程序指定的模块名 rsync rsync://192.168.1.129 # 把本地的文件同步到远程服务器 # rsync [OPTION]… [SRC]… [USER@]HOST::DEST # rsync [选项] [--port=] [--password-file=] [本地目录] [用户名]@服务端IP::[模块名] rsync -avz --delete --password-file=/etc/rsync.passwd /rsync rsyncbackup@192.168.1.130::129 # 把远程机器的文件同步到本地 # rsync [OPTION]… [USER@]HOST::SRC [DEST] # rsync [选项] [--port=] [--password-file=] [用户名@]服务端IP::[模块名] [本地目录] rsync -avz --delete --password-file=/etc/rsync.passwd rsyncbackup@192.168.1.130::129 /rsync
rsync使用
同步模式 1.本地同步 ##本地 rsync 选项 源 目标 Local: rsync [OPTION...] SRC... [DEST] #将/etc目录备份到/opt目录下,和cp的区别在于会自动增量备份 rsync -avz /etc /opt 2.远程同步 ssh协议 # 默认使用 SSH 进行远程登录和数据传输 # 不需要做任何配置,需要都安装rsync,操作上类似scp #将远端文件拉(下载)到本地 Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST] #将本地文件推送(上传)到远端 Push: rsync [OPTION...] SRC... [USER@]HOST:DEST #将etc推送到10.10.10.10下的自定义文件夹下 rsync -az /etc/ 10.10.10.10:/opt/etc-$(hostname)-$(date +%F)
常用参数 -v, –verbose详细模式输出。 -a, –archive归档模式,表示以递归方式传输文件,并保持所有文件属性不变。 -z, –compress对备份的文件在传输时进行压缩处理。 –delete:删除那些DST中存在而在SRC中没有的文件。 注意: # 保持服务端于客户端上数据完全一致,服务端有则同步给客户端,服务端没有,客户端有的则从客户端删除 # –delete 选项,表示客户端上的数据要与服务器端完全一致,多则删之,少则补之 # 用的时候要小心点,最好不要把已经有重要数所据的目录,当做本地更新目录,否则会把你的数据全部删除 所有参数 -a:–archive archive mode 权限保存模式,相当于 -rlptgoD 参数,存档,递归,保持属性等。 -r:–recursive 复制所有下面的资料,递归处理。 -p:–perms 保留档案权限,文件原有属性。 -t:–times 保留时间点,文件原有时间。 -g:–group 保留原有属组。 -o:–owner 保留档案所有者(root only)。 -D:–devices 保留device资讯(root only)。 -l:–links 复制所有的连接,拷贝连接文件。 -z:–compress 压缩模式,当资料在传送到目的端进行档案压缩。 -H:–hard-links 保留硬链接文件。 -A:–acls 保留ACL属性文件,需要配合–perms。 -P:-P参数和 --partial --progress 相同,只是为了把参数简单化,表示传进度。 --version:输出rsync版本。 -v:–verbose 复杂的输出信息。 -u:–update 仅仅进行更新,也就是跳过已经存在的目标位置,并且文件时间要晚于要备份的文件,不覆盖新的文件。 --port=PORT:定义rsyncd(daemon)要运行的port(预设为tcp 873)。 --delete:删除那些目标位置有的文件而备份源没有的文件。 --delete-before: 接收者在传输之前进行删除操作 --password-file=FILE :从 指定密码文件中获取密码。 --bwlimit=KBPS:限制 I/O 带宽。 --filter “-filename”:需要过滤的文件。 --exclude=filname:需要过滤的文件。 --progress:显示备份过程。
安装sersync
wget https://down.whsir.com/downloads/sersync2.5.4_64bit_binary_stable_final.tar.gz tar xf sersync2.5.4_64bit_binary_stable_final.tar.gz mv /usr/local/GNU-Linux-x86 /usr/local/sersync #备份原来配置文件 mv /usr/local/sersync/confxml.xml /usr/local/sersync/confxml.xml.bak #写入新配置文件 vim /usr/local/sersync/confxml.xml <?xml version="1.0" encoding="ISO-8859-1"?> <head version="2.5"> <host hostip="localhost" port="8008"></host> <debug start="false"/> <fileSystem xfs="false"/> <!-- 文件系统 --> <filter start="false"> <!-- 排除不想同步的文件 --> <exclude expression="(.*)\.svn"></exclude> <exclude expression="(.*)\.gz"></exclude> <exclude expression="^info/*"></exclude> <exclude expression="^static/*"></exclude> </filter> <inotify> <!-- 监控的事件类型 --> <delete start="true"/> <createFolder start="true"/> <createFile start="true"/> <closeWrite start="true"/> <moveFrom start="true"/> <moveTo start="true"/> <attrib start="false"/> <modify start="false"/> </inotify> <sersync> <localpath watch="/rsync"> <!-- 监控的目录 --> <remote ip="192.168.1.130" name="129"/> <!--服务端IP地址和模块--> </localpath> <rsync> <commonParams params="-artuz"/> <!--开启用户认证,虚拟用户和密码文件路径--> <auth start="true" users="rsyncbackup" passwordfile="/etc/rsync.passwd"/> <userDefinedPort start="false" port="874"/><!-- port=874 --> <timeout start="false" time="100"/><!-- timeout=100 --> <ssh start="false"/> </rsync> <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once 默认配置60分钟执行一次检查--> <crontab start="false" schedule="600"><!--600mins--> <crontabfilter start="false"> <exclude expression="*.php"></exclude> <exclude expression="info/*"></exclude> </crontabfilter> </crontab> <plugin start="false" name="command"/> </sersync> <plugin name="command"> <param prefix="/bin/sh" suffix="" ignoreError="true"/> <!--prefix /opt/tongbu/mmm.sh suffix--> <filter start="false"> <include expression="(.*)\.php"/> <include expression="(.*)\.sh"/> </filter> </plugin> <plugin name="socket"> <localpath watch="/opt/tongbu"> <deshost ip="192.168.138.20" port="8009"/> </localpath> </plugin> <plugin name="refreshCDN"> <localpath watch="/data0/htdocs/cms.xoyo.com/site/"> <cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx" passwd="xxxx"/> <sendurl base="http://pic.xoyo.com/cms"/> <regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/> </localpath> </plugin> </head>
启动服务:/usr/local/sersync/sersync2 -d -r -o /usr/local/sersync/confxml.xml
创建sersync守护脚本
vim selt-sersync.sh ##当sersync服务进程数小于1时,服务进行启动 #!/bin/bash server_file="/usr/local/GNU-Linux-x86/sersync2" conf_file="/usr/local/GNU-Linux-x86/confxml.xml" options="-d -r -o" proc_num=$(ps -ef|grep -i sersync2|grep -v "grep"|wc -l) if [ $proc_num -lt 1 ];then cd $(dirname $server_file) nohup $server_file $options $conf_file & else exit 0; fi chmod +x selt-sersync.sh crontab -l * * * * * /bin/sh /usr/local/GNU-Linux-x86/selt-sersync.sh /dev/null 2>&1 ##每一分钟执行这个脚本