rsync+lsyncd 实现文件实时同步 (自己实践)

本贴最后更新于 2559 天前,其中的信息可能已经事过境迁

参考地址:rsync+lsyncd 实现文件实时同步

参考地址:lsyncd 实时同步搭建指南——取代 rsync+inotify

一、环境

lsyncd 10.211.55.22 rsync 10.211.55.21

二、配置 rsync 服务器

配置 rsync 以 xinetd 方式运行

[root@rsync ~]# yum install rsync -y [root@rsync ~]# yum install xinetd -y #修改/etc/xinetd.d/rsync [root@rsync ~]# vim /etc/xinetd.d/rsync service rsync { disable = no ##将yes改成no socket_type = stream wait = no user = root server = /usr/bin/rsync server_args = --daemon log_on_failure += USERID } #启动xinetd服务 [root@rsync ~]# service xinetd start Starting xinetd: [ OK ] #rsync默认的监听端口是873,查看873号端口是否启动 [root@rsync ~]# netstat -tunlp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1247/sshd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1324/master tcp 0 0 :::22 :::* LISTEN 1247/sshd tcp 0 0 ::1:25 :::* LISTEN 1324/master tcp 0 0 :::873 :::* LISTEN 1561/xinetd

创建 rsync 服务目录和配置文件

#创建rsync服务目录 [root@rsync ~]# mkdir /etc/rsyncd # 创建配置文件 [root@rsync ~]# touch /etc/rsyncd/rsyncd.conf # 创建密码文件 [root@rsync ~]# touch /etc/rsyncd/rsyncd.secrets #权限修改 [root@rsync ~]# chown root:root /etc/rsyncd/rsyncd.secrets [root@rsync ~]# chmod 600 /etc/rsyncd/rsyncd.secrets #这里的权限设置必须是600

创建用户和密码

[root@rsync ~]# echo "rsync:test" >>/etc/rsyncd/rsyncd.secrets

创建 rsync 配置文件

# GLOBAL OPTIONS uid = root gid = root use chroot = yes #这个参数要设置成yes,如果同步的是软连接文件,同步过来后会多一个前缀,导致软连接不能正常使用 read only = no #我们需要实时同步lsyncd服务器上的资源,这个需要有写权限,或者在模块中赋予写权限 #limit access to private LANs hosts allow=10.211.55.21/255.255.0.0 hosts deny=* max connections = 5 pid file = /var/run/rsyncd.pid secrets file = /etc/rsyncd/rsyncd.secrets #lock file = /var/run/rsync.lock motd file = /etc/rsyncd/rsyncd.motd #This will give you a separate log file log file = /var/log/rsync.log #This will log every file transferred - up to 85,000+ per user, per sync transfer logging = yes log format = %t %a %m %f %b syslog facility = local3 timeout = 300 # MODULE OPTIONS [test] path = /home/syncfile list=yes ignore errors auth users = rsync #客户端连接过来使用的用户是rsync comment = welcome to rsync server

编辑 xinetd 的 rsync 配置文件,添加配置文件路径

#添加rsync的配置文件路径 [root@rsync ~]# vim /etc/xinetd.d/rsync service rsync { disable = no socket_type = stream wait = no user = root server = /usr/bin/rsync server_args = --daemon --config=/etc/rsyncd/rsyncd.conf #添加配置文件路径 log_on_failure += USERID } #重启xinetd服务 [root@rsync ~]# service xinetd restart Stopping xinetd: [ OK ] Starting xinetd: [ OK ] [root@rsync ~]# netstat -anpt |grep 873 tcp 0 0 :::873 :::* LISTEN 1586/xinetd #创建数据目录 [root@rsync ~]# mkdir -p /home/syncfile

三、配置 lsyncd 服务器

#安装rsync,lsyncd [root@lsyncd ~]# rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm [root@lsyncd ~]# sed -i 's@#b@b@g' /etc/yum.repos.d/epel.repo [root@lsyncd ~]# sed -i 's@mirrorlist@#mirrorlist@g' /etc/yum.repos.d/epel.repo [root@lsyncd ~]# yum install rsync lsyncd -y

配置 lsyncd 服务配置文件适用:500+ 万文件,变动不大

注意:这里配置的方案有很多,我是参考上面两个链接的方法:

#lsyncd.conf 配置选项说明:

settings
里面是全局设置,-- 开头表示注释,下面是几个常用选项说明:

  • logfile 定义日志文件
  • stausFile 定义状态文件
  • nodaemon=true 表示不启用守护模式,默认
  • statusInterval 将 lsyncd 的状态写入上面的 statusFile 的间隔,默认 10 秒
  • inotifyMode 指定 inotify 监控的事件,默认是 CloseWrite,还可以是 ModifyCloseWrite or Modify
  • maxProcesses 同步进程的最大个数。假如同时有 20 个文件需要同步,而 maxProcesses = 8,则最大能看到有 8 个 rysnc 进程
  • maxDelays 累计到多少所监控的事件激活一次同步,即使后面的 delay 延迟时间还未到

sync
里面是定义同步参数,可以继续使用 maxDelays 来重写 settings 的全局变量。一般第一个参数指定 lsyncd 以什么模式运行:rsyncrsyncsshdirect 三种模式:

  • default.rsync :本地目录间同步,使用 rsync,也可以达到使用 ssh 形式的远程 rsync 效果,或 daemon 方式连接远程 rsyncd 进程;
    default.direct :本地目录间同步,使用 cprm 等命令完成差异文件备份;
    default.rsyncssh :同步到远程主机目录,rsync 的 ssh 模式,需要使用 key 来认证

  • source 同步的源目录,使用绝对路径。

  • target 定义目的地址.对应不同的模式有几种写法:
    /tmp/dest :本地目录同步,可用于 directrsync 模式
    172.29.88.223:/tmp/dest :同步到远程服务器目录,可用于 rsyncrsyncssh 模式,拼接的命令类似于 /usr/bin/rsync -ltsd --delete --include-from=- --exclude=* SOURCE TARGET,剩下的就是 rsync 的内容了,比如指定 username,免密码同步
    172.29.88.223::module :同步到远程服务器目录,用于 rsync 模式
    三种模式的示例会在后面给出。

  • init 这是一个优化选项,当 init = false,只同步进程启动以后发生改动事件的文件,原有的目录即使有差异也不会同步。默认是 true

  • delay 累计事件,等待 rsync 同步延时时间,默认 15 秒(最大累计到 1000 个不可合并的事件)。也就是 15s 内监控目录下发生的改动,会累积到一次 rsync 同步,避免过于频繁的同步。(可合并的意思是,15s 内两次修改了同一文件,最后只同步最新的文件)

excludeFrom
排除选项,后面指定排除的列表文件,如

excludeFrom = "/etc/lsyncd.exclude"

如果是简单的排除,可以使用

exclude = LIST

这里的排除规则写法与原生 rsync 有点不同,更为简单:

  • 监控路径里的任何部分匹配到一个文本,都会被排除,例如 /bin/foo/bar 可以匹配规则 foo

  • 如果规则以斜线 / 开头,则从头开始要匹配全部

  • 如果规则以 / 结尾,则要匹配监控路径的末尾

  • ? 匹配任何字符,但不包括 /

  • * 匹配 0 或多个字符,但不包括 /

  • ** 匹配 0 或多个字符,可以是 /

  • delete 为了保持 target 与 souce 完全同步,Lsyncd 默认会 delete = true 来允许同步删除。它除了 false,还有 startuprunning 值,请参考 Lsyncd 2.1.x ‖ Layer 4 Config ‖ Default Behavior

rsync
(提示一下,deleteexclude 本来都是 rsync 的选项,上面是配置在 sync 中的,我想这样做的原因是为了减少 rsync 的开销)

  • bwlimit 限速,单位 kb/s,与 rsync 相同(这么重要的选项在文档里竟然没有标出)
  • compress 压缩传输默认为 true。在带宽与 cpu 负载之间权衡,本地目录同步可以考虑把它设为 false
  • perms 默认保留文件权限。
  • 其它 rsync 的选项

其它还有 rsyncssh 模式独有的配置项,如 hosttargetdirrsync_pathpassword_file,见后文示例。rsyncOps={"-avz","--delete"} 这样的写法在 2.1.*版本已经不支持。

lsyncd.conf 可以有多个 sync,各自的 source,各自的 target,各自的模式,互不影响。

lsyncd.conf 其它模式示例:

[root@rsync ~]# cat /etc/rsyncd/rsyncd.conf # GLOBAL OPTIONS uid = root gid = root use chroot = yes #这个参数要设置成yes,如果同步的是软连接文件,同步过来后会多一个前缀,导致软连接不能正常使用 read only = no #我们需要实时同步lsyncd服务器上的资源,这个需要有写权限,或者在模块中赋予写权限 #limit access to private LANs hosts allow=10.211.55.21/255.255.0.0 hosts deny=* max connections = 5 pid file = /var/run/rsyncd.pid secrets file = /etc/rsyncd/rsyncd.secrets #lock file = /var/run/rsync.lock motd file = /etc/rsyncd/rsyncd.motd #This will give you a separate log file log file = /var/log/rsync.log #This will log every file transferred - up to 85,000+ per user, per sync transfer logging = yes log format = %t %a %m %f %b syslog facility = local3 timeout = 300 # MODULE OPTIONS [test] path = /home/syncfile list=yes ignore errors auth users = rsync #客户端连接过来使用的用户是rsync comment = welcome to rsync server #添加rsync的配置文件路径 [root@rsync ~]# vim /etc/xinetd.d/rsync service rsync { disable = no socket_type = stream wait = no user = root server = /usr/bin/rsync server_args = --daemon --config=/etc/rsyncd/rsyncd.conf #添加配置文件路径 log_on_failure += USERID } #重启xinetd服务 [root@rsync ~]# service xinetd restart Stopping xinetd: [ OK ] Starting xinetd: [ OK ] [root@rsync ~]# netstat -anpt |grep 873 tcp 0 0 :::873 :::* LISTEN 1586/xinetd #创建数据目录 [root@rsync ~]# mkdir -p /data/test #安装rsync,lsyncd [root@lsyncd ~]# rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm [root@lsyncd ~]# sed -i 's@#b@b@g' /etc/yum.repos.d/epel.repo [root@lsyncd ~]# sed -i 's@mirrorlist@#mirrorlist@g' /etc/yum.repos.d/epel.repo [root@lsyncd ~]# yum install rsync lsyncd -y settings { logfile ="/usr/local/lsyncd-2.1.5/var/lsyncd.log", statusFile ="/usr/local/lsyncd-2.1.5/var/lsyncd.status", inotifyMode = "CloseWrite", maxProcesses = 8, } -- I. 本地目录同步,direct:cp/rm/mv。 适用:500+万文件,变动不大 sync { default.direct, source = "/tmp/src", target = "/tmp/dest", delay = 1 maxProcesses = 1 } -- II. 本地目录同步,rsync模式:rsync sync { default.rsync, source = "/tmp/src", target = "/tmp/dest1", excludeFrom = "/etc/rsyncd.d/rsync_exclude.lst", rsync = { binary = "/usr/bin/rsync", archive = true, compress = true, bwlimit = 2000 } } -- III. 远程目录同步,rsync模式 + rsyncd daemon sync { default.rsync, source = "/tmp/src", target = "syncuser@172.29.88.223::module1", delete="running", exclude = { ".*", ".tmp" }, delay = 30, init = false, rsync = { binary = "/usr/bin/rsync", archive = true, compress = true, verbose = true, password_file = "/etc/rsyncd.d/rsync.pwd", _extra = {"--bwlimit=200"} } } -- IV. 远程目录同步,rsync模式 + ssh shell sync { default.rsync, source = "/tmp/src", target = "172.29.88.223:/tmp/dest", -- target = "root@172.29.88.223:/remote/dest", -- 上面target,注意如果是普通用户,必须拥有写权限 maxDelays = 5, delay = 30, -- init = true, rsync = { binary = "/usr/bin/rsync", archive = true, compress = true, bwlimit = 2000 -- rsh = "/usr/bin/ssh -p 22 -o StrictHostKeyChecking=no" -- 如果要指定其它端口,请用上面的rsh } } -- V. 远程目录同步,rsync模式 + rsyncssh,效果与上面相同 sync { default.rsyncssh, source = "/tmp/src2", host = "172.29.88.223", targetdir = "/remote/dir", excludeFrom = "/etc/rsyncd.d/rsync_exclude.lst", -- maxDelays = 5, delay = 0, -- init = false, rsync = { binary = "/usr/bin/rsync", archive = true, compress = true, verbose = true, _extra = {"--bwlimit=2000"}, }, ssh = { port = 1234 } }

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • 域名

    域名(Domain Name),简称域名、网域,是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。

    43 引用 • 208 回帖 • 2 关注
  • CloudFoundry

    Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

    4 引用 • 16 回帖 • 202 关注
  • DNSPod

    DNSPod 建立于 2006 年 3 月份,是一款免费智能 DNS 产品。 DNSPod 可以为同时有电信、网通、教育网服务器的网站提供智能的解析,让电信用户访问电信的服务器,网通的用户访问网通的服务器,教育网的用户访问教育网的服务器,达到互联互通的效果。

    6 引用 • 26 回帖 • 530 关注
  • WordPress

    WordPress 是一个使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设自己的博客。也可以把 WordPress 当作一个内容管理系统(CMS)来使用。WordPress 是一个免费的开源项目,在 GNU 通用公共许可证(GPLv2)下授权发布。

    46 引用 • 114 回帖 • 157 关注
  • 创业

    你比 99% 的人都优秀么?

    81 引用 • 1395 回帖 • 2 关注
  • 音乐

    你听到信仰的声音了么?

    62 引用 • 512 回帖
  • CodeMirror
    2 引用 • 17 回帖 • 177 关注
  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    77 引用 • 37 回帖
  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    315 引用 • 547 回帖
  • 自由行
    1 关注
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    498 引用 • 934 回帖
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖 • 3 关注
  • 游戏

    沉迷游戏伤身,强撸灰飞烟灭。

    188 引用 • 832 回帖
  • PWA

    PWA(Progressive Web App)是 Google 在 2015 年提出、2016 年 6 月开始推广的项目。它结合了一系列现代 Web 技术,在网页应用中实现和原生应用相近的用户体验。

    14 引用 • 69 回帖 • 187 关注
  • 工具

    子曰:“工欲善其事,必先利其器。”

    302 引用 • 772 回帖
  • Google

    Google(Google Inc.,NASDAQ:GOOG)是一家美国上市公司(公有股份公司),于 1998 年 9 月 7 日以私有股份公司的形式创立,设计并管理一个互联网搜索引擎。Google 公司的总部称作“Googleplex”,它位于加利福尼亚山景城。Google 目前被公认为是全球规模最大的搜索引擎,它提供了简单易用的免费服务。不作恶(Don't be evil)是谷歌公司的一项非正式的公司口号。

    49 引用 • 192 回帖
  • webpack

    webpack 是一个用于前端开发的模块加载器和打包工具,它能把各种资源,例如 JS、CSS(less/sass)、图片等都作为模块来使用和处理。

    42 引用 • 130 回帖 • 255 关注
  • 持续集成

    持续集成(Continuous Integration)是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

    15 引用 • 7 回帖 • 2 关注
  • CAP

    CAP 指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

    12 引用 • 5 回帖 • 636 关注
  • VirtualBox

    VirtualBox 是一款开源虚拟机软件,最早由德国 Innotek 公司开发,由 Sun Microsystems 公司出品的软件,使用 Qt 编写,在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。

    10 引用 • 2 回帖 • 14 关注
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    730 引用 • 1284 回帖
  • SMTP

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。

    4 引用 • 18 回帖 • 644 关注
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 475 关注
  • 外包

    有空闲时间是接外包好呢还是学习好呢?

    26 引用 • 234 回帖 • 2 关注
  • Ubuntu

    Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的 Linux 操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词,意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。Ubuntu 的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统。

    127 引用 • 169 回帖
  • 笔记

    好记性不如烂笔头。

    312 引用 • 794 回帖 • 1 关注
  • IPFS

    IPFS(InterPlanetary File System,星际文件系统)是永久的、去中心化保存和共享文件的方法,这是一种内容可寻址、版本化、点对点超媒体的分布式协议。请浏览 IPFS 入门笔记了解更多细节。

    20 引用 • 245 回帖 • 241 关注