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

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

参考地址: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 } }

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • RESTful

    一种软件架构设计风格而不是标准,提供了一组设计原则和约束条件,主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

    30 引用 • 114 回帖 • 8 关注
  • 分享

    有什么新发现就分享给大家吧!

    248 引用 • 1794 回帖
  • 钉钉

    钉钉,专为中国企业打造的免费沟通协同多端平台, 阿里巴巴出品。

    15 引用 • 67 回帖 • 267 关注
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 108 关注
  • GitHub

    GitHub 于 2008 年上线,目前,除了 Git 代码仓库托管及基本的 Web 管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。正因为这些功能所提供的便利,又经过长期的积累,GitHub 的用户活跃度很高,在开源世界里享有深远的声望,并形成了社交化编程文化(Social Coding)。

    209 引用 • 2040 回帖 • 1 关注
  • 生活

    生活是指人类生存过程中的各项活动的总和,范畴较广,一般指为幸福的意义而存在。生活实际上是对人生的一种诠释。生活包括人类在社会中与自己息息相关的日常活动和心理影射。

    230 引用 • 1432 回帖
  • 资讯

    资讯是用户因为及时地获得它并利用它而能够在相对短的时间内给自己带来价值的信息,资讯有时效性和地域性。

    56 引用 • 85 回帖
  • Access
    1 引用 • 3 回帖 • 2 关注
  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    240 引用 • 224 回帖
  • SMTP

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

    4 引用 • 18 回帖 • 639 关注
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    694 引用 • 537 回帖 • 1 关注
  • SVN

    SVN 是 Subversion 的简称,是一个开放源代码的版本控制系统,相较于 RCS、CVS,它采用了分支管理系统,它的设计目标就是取代 CVS。

    29 引用 • 98 回帖 • 698 关注
  • 单点登录

    单点登录(Single Sign On)是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

    9 引用 • 25 回帖 • 4 关注
  • SOHO

    为成为自由职业者在家办公而努力吧!

    7 引用 • 55 回帖 • 3 关注
  • Chrome

    Chrome 又称 Google 浏览器,是一个由谷歌公司开发的网页浏览器。该浏览器是基于其他开源软件所编写,包括 WebKit,目标是提升稳定性、速度和安全性,并创造出简单且有效率的使用者界面。

    63 引用 • 289 回帖
  • 链滴

    链滴是一个记录生活的地方。

    记录生活,连接点滴

    183 引用 • 3885 回帖
  • 996
    13 引用 • 200 回帖
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    10150 引用 • 46127 回帖 • 63 关注
  • WebComponents

    Web Components 是 W3C 定义的标准,它给了前端开发者扩展浏览器标签的能力,可以方便地定制可复用组件,更好的进行模块化开发,解放了前端开发者的生产力。

    1 引用 • 15 关注
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    25 引用 • 254 回帖 • 1 关注
  • 友情链接

    确认过眼神后的灵魂连接,站在链在!

    24 引用 • 373 回帖
  • 快应用

    快应用 是基于手机硬件平台的新型应用形态;标准是由主流手机厂商组成的快应用联盟联合制定;快应用标准的诞生将在研发接口、能力接入、开发者服务等层面建设标准平台;以平台化的生态模式对个人开发者和企业开发者全品类开放。

    15 引用 • 127 回帖 • 1 关注
  • ZeroNet

    ZeroNet 是一个基于比特币加密技术和 BT 网络技术的去中心化的、开放开源的网络和交流系统。

    1 引用 • 21 回帖 • 650 关注
  • Bootstrap

    Bootstrap 是 Twitter 推出的一个用于前端开发的开源工具包。它由 Twitter 的设计师 Mark Otto 和 Jacob Thornton 合作开发,是一个 CSS / HTML 框架。

    18 引用 • 33 回帖 • 649 关注
  • C

    C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    86 引用 • 165 回帖
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    172 引用 • 540 回帖
  • 负能量

    上帝为你关上了一扇门,然后就去睡觉了....努力不一定能成功,但不努力一定很轻松 (° ー °〃)

    89 引用 • 1251 回帖 • 393 关注