rsync+sersync多线程实时同步
一、sersync优点
1)使用c++编写,对linux系统文件产生的临时文件和重复文件操作会进行过滤,在结合rsync同步的时候,会减少运行时消耗的本地及网络资源,因此速度更快。
2)相比较inotify-tools,sersync配置起来简单,https://code.google.com/archive/p/sersync/downloads下载源码,其中bin目录下是已经编译好的二进制文件,配合bin目录下的xml文件直接使用即可。
3)使用多线程同步(可以并发同步多个不同的文件),尤其在同步较大文件时,能够保证多个服务器实时保持同步状态。
4)sersync自带出错处理机制,通过失败队列对出错的文件重新同步,如果仍旧失败,则每若干个小时对同步失败的文件再重新同步。
5)sersync自带crontab功能,只需在xml配置文件中开启,即可按预先的配置,隔一段时间整体同步一次。
6)sersync自带socket与http的协议扩展,可以满足有特殊需求的公司的二次开发。
7)当同步的目录数据量不大时,建议使用rsync+inotify;当同步的目录数据量很大时(几百G甚至1T以上)文件很多时,建议使用rsync+sersync
二、分析
1)线程组线程是等待线程队列的守护线程,当事件队列中有事件产生的时候,线程组守护线程就会逐个唤醒同步线程,当队列中inotify事件较多的时候,同步线程就会被全部唤醒一起工作。这样设计的目的是能够同时处理多个inotify事件,从而提升服务器的并发能力(核数*2+2)。之所以称之为线程组,是因为每个线程在工作的时候,会根据服务器上新写入文件的数量建立子线程,子线程可以保证所有的文件与各个服务器同时同步,当要同步的文件较大的时候,这样设计可以保证各个远程服务器可以同时获得要同步的文件。
2)服务线程的作用有三个:
a)首先是处理同步失败的文件,将这些文件再次同步,对于再次同步失败的文件会生成rsync_fail_log.sh脚本,记录失败的事件。
b)每隔10隔小时执行脚本一次,同时清空脚本。
c)第三个作用是crontab功能,可以每隔一定时间,将所有路径整体同步一次。
3)过滤队列的建立是为了过滤短时间内产生的重复的inofity信息,例如在删除文件夹的时候,inotify就会同时产生删除文件夹里的文件与文件夹的事件,通过过滤队列,当删除文件夹事件产生的时候,会将之前加入队列的删除文件的事件全部过滤掉,这样只产生一条删除文件夹的事件,从而减轻了同步的负担。同时对于修改文件的操作的时候,会产生临时文件的重复操作,过滤队列也会过滤掉这些临时文件。
三、rsync服务,下面只有关于这个项目的一些简单配置,具体请看http://www.cnblogs.com/bill2014/p/7398760.html
1)服务端的rsyncd.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | [root@rsyncserver ~] # cat >rsyncd.conf<<EOF #Rsync server ##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 . 222.0 / 24 hosts deny = 0.0 . 0.0 / 32 auth users = rsync_backup secrets file = / etc / rsync.password ##################################### [www] comment = www by old0boy 注释 path = / data0 / www / www / ##################################### [bbs] comment = bbs by old0boy path = / data0 / www / bbs / ##################################### [blog] comment = blog by old0boy path = / data0 / www / blog / |
2)接着在服务端创建目录
1 | [root@rsyncserver ~] # mkdir -p /data0/www/www/ /data0/www/bbs/ /data0/www/blog/ |
3)客户端部署
3.1)在客户端创建目录和文件
1 2 | [root@rsyncclient ~] # mkdir -p /data0/www/bbs/ /data0/www/www/ /data0/www/blog [root@rsyncclient ~] # touch /data0/www/bbs/bbs.log /data0/www/www/www.log /data0/www/blog/blog.log |
3.2)推送
1 2 3 | [root@rsyncclient ~] # rsync -avzP /data0/www/bbs/ rsync_backup@192.168.222.140::bbs/ --password-file=/etc/rsync.password [root@rsyncclient ~] # rsync -avzP /data0/www/www/ rsync_backup@192.168.222.140::www/ --password-file=/etc/rsync.password [root@rsyncclient ~] # rsync -avzP /data0/www/blog/ rsync_backup@192.168.222.140::blog/ --password-file=/etc/rsync.password |
四、下载sersync,并配置xml
4.1)下载,,https://code.google.com/archive/p/sersync/downloads,FQ
1 2 3 4 5 6 7 8 | [root@rsyncclient tools] # tar -zxf sersync2.5.4_64bit_binary_stable_final.tar.gz -C /usr/local/ [root@rsyncclient local] # mv GNU-Linux-x86 sersync [root@rsyncclient local] # tree sersync/ sersync / ├── confxml.xml └── sersync2 0 directories, 2 files |
4.2)规范化目录
1 2 3 4 5 6 7 8 9 10 11 12 | [root@rsyncclient sersync] # mkdir conf bin logs [root@rsyncclient sersync] # mv confxml.xml conf [root@rsyncclient sersync] # mv sersync2 bin/sersync [root@rsyncclient sersync] # tree . ├── bin │ └── sersync ├── conf │ └── confxml.xml └── logs 3 directories, 2 files |
4.3)更改优化sersync配置,24-28行,因为我只用了一个服务端一个客户端,所以只有一个同步服务器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 原内容为: <localpath watch = "/opt/tongbu" > <remote ip = "127.0.0.1" name = "tongbu1" / > <! - - <remote ip = "192.168.8.39" name = "tongbu" / > - - > <! - - <remote ip = "192.168.8.40" name = "tongbu" / > - - > < / localpath> 改为: <localpath watch = "/data0/www/www" > <remote ip = "192.168.222.140" name = "www" / > < / localpath> <localpath watch = "/data0/www/bbs" > <remote ip = "192.168.222.140" name = "bbs" / > < / localpath> <localpath watch = "/data0/www/blog" > <remote ip = "192.168.222.140" name = "blog" / > < / localpath> |
4.4)更改31-34行,认证部分
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <commonParams params = "-artuz" / > <auth start = "false" users = "root" passwordfile = "/etc/rsync.pas" / > <userDefinedPort start = "false" port = "874" / ><! - - port = 874 - - > <timeout start = "false" time = "100" / ><! - - timeout = 100 - - > <ssh start = "false" / > 改为: <rsync> <commonParams params = "-aruz" / > <auth start = "true" users = "rsync_backup" passwordfile = "/etc/rsync.password" / > <userDefinedPort start = "false" port = "874" / ><! - - port = 874 - - > <timeout start = "true" time = "100" / ><! - - timeout = 100 - - > <ssh start = "false" / > < / rsync> |
上面这个配置就是在拼接rsync -zvzP --timeout=100 /data0/www/www/ rsync_backup@192.168.222.140::www/ --password-file=/etc/rsync.password这个命令
4.5)修改36-37行
1 2 3 4 5 | <failLog path = "/tmp/rsync_fail_log.sh" timeToExecute = "60" / ><! - - default every 60mins execute once - - > 改为: <failLog path = "/usr/local/sersync/logs/rsync_fail_log.sh" timeToExecute = "60" / ><! - - default every 60mins execute once - - > 当同步失败后,日志记录到 / usr / local / sersync / logs / rsync_fail_log.sh,并且每 60 分钟对失败的log进行重新同步。 |
五、开启sersync守护进程同步数据
5.1)配置sersync环境变量
1 2 3 4 5 6 | [root@rsyncclient conf] # echo 'export PATH=$PATH:/usr/local/sersync/bin'>>/etc/profile [root@rsyncclient conf] # tail -1 /etc/profile export PATH = $PATH: / usr / local / sersync / bin [root@rsyncclient conf] # source /etc/profile [root@rsyncclient conf] # which sersync / usr / local / sersync / bin / sersync |
5.2)启动命令:
1 2 | [root@rsyncclient conf] # sersync -r -d -o /usr/local/sersync/conf/confxml.xml 测试结果:发现问题,仅能第一个模块的路径可以同步,其他下面的路径不能同步。 |
只同步了第一个目录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | [root@rsyncclient conf] # sersync -r -d -o /usr/local/sersync/conf/confxml.xml 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 option: - r rsync all the local files to the remote servers before the sersync work option: - d run as a daemon option: - o config xml name: / usr / local / sersync / conf / confxml.xml daemon thread num: 10 parse xml config file host ip : localhost host port: 8008 daemon start,sersync run behind the console use rsync password - file : user is rsync_backup passwordfile is / etc / rsync.password after each synchronize run the plugin plugin name is : command config xml parse success please set / etc / rsyncd.conf max connections = 0 Manually sersync working thread 12 = 1 (primary thread) + 1 (fail retry thread) + 10 (daemon sub threads) Max threads numbers is : 22 = 12 (Thread pool nums) + 10 (Sub threads) please according your cpu ,use - n param to adjust the cpu rate - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - rsync the directory recursivly to the remote servers once working please wait... execute command: cd / data0 / www / www && rsync - aruz - R - - delete . / - - timeout = 100 rsync_backup@ 192.168 . 222.140 ::www - - password - file = / etc / rsync.password > / dev / null 2 >& 1 run the sersync: watch path is : / data0 / www / www |
5.3)多实例
5.3.1)多实例,在conf下,拷贝xml
1 2 3 | [root@rsyncclient conf] # cp confxml.xml www_confxml.xml [root@rsyncclient conf] # cp confxml.xml bbs_confxml.xml [root@rsyncclient conf] # cp confxml.xml blog_confxml.xml |
5.3.2)然后再各个xml下还需要修改错误日志文件的名字,例如bbs_rsync_fail_log.sh
1 | <failLog path = "/usr/local/sersync/logs/bbs_rsync_fail_log.sh" timeToExecute = "60" / ><! - - default every 60mins execute once - - > |
5.3.3)在localpath段内也只需要保留该实例的的ip和模块,否则只会跟上面第一次同步的情况一样,依旧是第一个目录
1 2 3 | <localpath watch = "/data0/www/bbs" > <remote ip = "192.168.222.140" name = "bbs" / > < / localpath> |
5.3.4)多实例初始化同步:
1 2 3 | sersync - r - d - o / usr / local / sersync / conf / www_confxml.xml sersync - r - d - o / usr / local / sersync / conf / blog_confxml.xml sersync - r - d - o / usr / local / sersync / conf / bbs_confxml.xml |
如果已经初始化过了,下次就可以不加-r选项
5.3.5)开机自动执行
将上面的命令除去-r加入rc.local
六、参数
参数-d:启用守护进程模式
参数-r:在监控前,将监控目录与远程主机用rsync命令推送一遍,如果设置了过滤器,即在xml文件中,filter为true,则暂时不能使用-r参数进行整体同步
c参数-n: 指定开启守护线程的数量,默认为10个
参数-o:指定配置文件,默认使用confxml.xml文件
参数-m:单独启用其他模块,使用 -m refreshCDN 开启刷新CDN模块
参数-m:单独启用其他模块,使用 -m socket 开启socket模块
参数-m:单独启用其他模块,使用 -m http 开启http模块
不加-m参数,则默认执行同步程序
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)