关于rsync:Windows-Terminal-MSYS2-配置

前言本文对 Windows 10/11 实用MSYS2 官网:https://www.msys2.org/装置到官网仓库下载 MSYS2 安装包,qbit 以后下载的是 msys2-x86_64-20221028.exe按提醒步骤装置即可,qbit 的装置门路为 D:\msys64增加别名在 D:\msys64\etc\bash.bashrc 文件开端增加 alias ll='ls -al'右键菜单本节次要参考两处 github https://gist.github.com/elieux/ef044468d067d68040c7https://github.com/njzhangyifei/msys2-mingw-shortcut-menus创立注册表文件并利用即可 Windows Registry Editor Version 5.00[HKEY_CURRENT_USER\Software\Classes\Directory\Background\shell\mingw64]@="MSYS2 MINGW64""Icon"="\"D:\\msys64\\mingw64.ico\""[HKEY_CURRENT_USER\Software\Classes\Directory\Background\shell\mingw64\command]@="D:\\msys64\\mingw64.exe bash"以后命令行进入 msys2这种形式不必批改注册表,qbit 比拟喜爱本节次要参考:MSYS2 介绍与应用创立文件 msys.bat,内容如下 @D:\msys64\msys2_shell.cmd -defterm -mingw64 -no-start -here让后将 msys.bat 所在目录退出到 Windows 的 PATH 环境变量,即可在任意地位输出 msys 进入 MSYS2 环境 C:\Users\qbit\Desktop>msysqbit@qbit MINGW64 /c/Users/qbit/Desktop$Windows Terminal关上 Windows Terminal,在 profiles.list 外面增加以下内容 { "guid": "{D9AD1C27-F33D-39F1-24A7-C3955C4CF2F7}", "hidden": false, "name": "MSYS2 MINGW64", "tabTitle": "MSYS2", "commandline": "D:/msys64/msys2_shell.cmd -mingw64 -defterm -no-start", "icon": "D:/msys64/mingw64.ico"}国内镜像源配置文件目录:D:\msys64\etc\pacman.d在 msys shell 运行以下命令,将首选镜像源改为清华镜像sed -i "s#mirror.msys2.org/#mirrors.tuna.tsinghua.edu.cn/msys2/#g" /etc/pacman.d/mirrorlist*执行 pacman -Sy 命令同步软件包数据库装置 rync用 pacman 装置即可 ...

November 23, 2022 · 1 min · jiezi

服务器之间迁移大文件

Last-Modified: 2019年6月3日15:01:20 背景最近公司有一台服务器从 ucloud 迁移到 华为云, 一坨MongoDB数据库需要迁移. 为什么使用 rsync: 大文件传输就不要想着ftp了: 服务器A -> 本地 -> 服务器Bscp传输超大文件, 万一遇到网络断开就得哭了小提示: 记得在源服务器那边买个临时带宽包, 以免浪费时间传输前准备# 打包压缩的文件zip -r archive.zip ./*# 可选: 将压缩包拆分成1G一个的小文件# -d 使用数字后缀, 而不是字母后缀split -b 1G -d archive.zip archive_split# split 对应的合并命令cat archive_split* > new_archive.ziprsync 传输rsync 文档 # 传输文件# -P,----partial 断点续传(保留那些因故没有完全传输的文件,以便加快随后的再次传输)# -e 以ssh方式进行数据传输, ssh -p2222 指定连接2222端口# --progress 显示传输进度# --bwlimit 限速, 字节/秒# -r,--recursive 对子目录以递归模式处理# -c, --checksum 打开校验开关,强制对文件传输进行校验。# --delete 删除那些DST中SRC没有的文件。# -z, --compress 对备份的文件在传输时进行压缩处理。# --exclude=PATTERN 指定排除不需要传输的文件模式。# --include=PATTERN 指定不排除而需要传输的文件模式。# -v, --verbose 详细模式输出。# -q, --quiet 精简输出模式。# -a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoDrsync -P -e "ssh -p2222" --progress --bwlimit=1024 root@xx.xx.xx.xx:/data/transfer/archive.zip /data/archive.zip解释一下上面执行命令的参数: ...

June 3, 2019 · 1 min · jiezi

PHP的apc扩展导致引入文件错误

最近遇到一个非常奇怪的bug,在主机PHP代码版本回退的过程中,导致备机服务不可用。经过各种复现和文档查询,发现是PHP的apc扩展在和rsync同时使用时,会导致无法正确的处理缓存文件,最终影响服务。解决方案官方也有提供,加上一行配置:# php.ini[apc]apc.stat_ctime=1下面我们来说明下这个问题出现的机制。关键点:使用了PHP+apc扩展+rsync主从同步机制故障表现:引入时找不到文件平台服务上线更新后,访问平台服务时报错信息:Warning: include(Yii.php): failed to open stream: No such file or directory in /home/disk4/htdocs/oss_debug/protected/lib/Yii/framework/YiiBase.php on line 421Warning: include(): Failed opening ‘Yii.php’ for inclusion (include_path=’.:/home/work/lnmp/weblib/phplib:/home/work/lnmp/lib/php’) in /home/disk4/htdocs/oss_debug/protected/lib/Yii/framework/YiiBase.php on line 421Fatal error: Class ‘Yii’ not found in /home/disk4/htdocs/oss_debug/index.php on line 42这里的提示信息表明,问题出现在YiiBase.php文件中,在421行引入Yii.php时找不到该文件,而这里的include为相对路径,当前的引入路径为.:/home/work/lnmp/weblib/phplib:/home/work/lnmp/lib/php,多个引入路径以:分割,所以这里会在./,/home/work/lnmp/weblib/phplib,/home/work/lnmp/lib/php三个目录下查找该文件,分别检索了一下,发现确实均不存在该文件。但是在正常的服务下,却并不会查找该文件。具体为什么会去查找该文件,我猜测是先判断Yii类是否存在,不存在就去引入Yii.php,而Yii类在yii.php文件中有定义,因此猜测是没有正确引入yii.php导致。# yii.php<?phprequire(dirname(FILE).’/YiiBase.php’);class Yii extends YiiBase{}这个问题没有深究,因为最后发现故障跟这个点无关。复现一个小问题:改变目录后无法服务你只需要将你的服务目录换个名字即可复现,如你当前的服务目录是/home/work/lnmp/htdocs/oss/,你将它重名为/home/work/lnmp/htdocs/oss2,这个时候你就会发现服务受到了影响:# 访问 domain.com/oss2/index.phpWarning: file_get_contents(/home/work/lnmp/htdocs/oss/version): failed to open stream: No such file or directory in /home/work/lnmp/htdocs/oss/index.php on line 26Warning: require_once(/home/work/lnmp/htdocs/oss/protected/lib/Yii/framework/yii.php): failed to open stream: No such file or directory in /home/work/lnmp/htdocs/oss/index.php on line 38Fatal error: require_once(): Failed opening required ‘/home/work/lnmp/htdocs/oss6/protected/lib/Yii/framework/yii.php’ (include_path=’.:/home/work/lnmp/weblib/phplib:/home/work/lnmp/lib/php’) in /home/work/lnmp/htdocs/oss6/index.php on line 38可以看到当我们访问oss2目录时,程序却依然在尝试读取oss目录下的文件,这时文件自然不存在,因此报错。那么这是为什么呢?原因是我们使用了PHP的apc扩展。PHP的服务过程学习过计算机原理的同学,都了解语言分为编译型语言和解释型语言,由于语言是人来编写的,而机器无法直接执行,因此,在代码被执行前需要经历一个编译成机器可以识别的操作码的过程。编译型语言在执行前提前编译好,然后发布;解释型语言先发布,在执行时即时编译。因此我们常说编译型语言的性能好,主要就是快在这个地方。PHP属于解释型语言,常规的执行流程是:Nginx转发请求给PHP主进程主进程引入代码文件PHP解释器会先将代码切分为Token生成抽象语法树生成机器可以直接执行的操作码PHP虚拟机执行操作码如果文件有引入其他文件,循环执行上述2-6步骤执行完成,返回结果可以看到每次请求过来,都会对文件做一次编译和缓存,那么这样会非常影响效率,为了保证PHP的灵活性,同时提升效率,我们需要对编译好的操作码进行缓存。这就是apc扩展做的事情:判断文件是否有更新如果更新,重新编译并缓存否则,直接读取缓存的操作码apc扩展apc扩展文档Alternative PHP Cache (APC 可选 PHP 缓存) 是一个开放自由的 PHP opcode 缓存。它的目标是提供一个自由、 开放,和健全的框架,用于缓存、优化 PHP 中间代码。该扩展也提供了一些内置的方法,可以用于手动设置或清空缓存。清空缓存的方法:apc_clear_cache()。调用这个方法后可以解决因apc缓存过期文件导致的bug。另外,我们需要关注的几个配置项:apc.stat integer是否启用脚本更新检查。 改变这个指令值要非常小心。 默认值 On 表示APC在每次请求脚本时都检查脚本是否被更新, 如果被更新则自动重新编译和缓存编译后的内容。但这样做对性能有不利影响。 如果设为 Off 则表示不进行检查,从而使性能得到大幅提高。 但是为了使更新的内容生效,你必须重启Web服务器(译者注:如果采用cgi/fcgi类似的,需重启cgi/fcgi进程)。 生产服务器上脚本文件很少更改, 可以通过禁用本选项获得显著的性能提升。这个指令对于include/require的文件同样有效。但是需要注意的是, 如果你使用的是相对路径,APC就必须在每一次include/require时都进行检查以定位文件。 而使用绝对路径则可以跳过检查,所以鼓励你使用绝对路径进行include/require操作。apc.stat_ctime integer验证ctime(创建时间)可以避免SVN或者rsync带来的问题,确保自上次缓存统计inode没有改变。APC通常只检查mtime(修改时间)。apc.file_update_protection integer当你在一个运行中的服务器上修改文件时,你应当执行原子操作。 也就是先写进一个临时文件,然后将该文件重命名(mv)到最终的名字。 文本编辑器以及 cp, tar 等程序却并不是这样操作的,从而导致有可能缓冲了残缺的文件。 默认值 2 表示在访问文件时如果发现修改时间距离访问时间小于 2 秒则不做缓冲。 那个不幸的访问者可能得到残缺的内容,但是这种坏影响却不会通过缓存扩大化。 如果你能确保所有的更新操作都是原子操作,那么可以用 0 关闭此特性。 如果你的系统由于大量的IO操作导致更新缓慢,你就需要增大此值。可以看到,apc扩展可能会导致两个问题:rsync/svn配合使用时存在无法正确处理文件缓存的问题可能读到残缺文件,导致影响部分人的请求针对这两个问题,也分别提供了解决方案:# php.ini[apc]# 启动ctime检查stat_ctime=1# 默认值为2,变大这个值file_update_protection=5虽然文档中有说明,但还是有很多人会遇到这种问题,可以参考:stack overflow问题:Problems with APC on publish官方Issue:apc.include_once_override turn on issue在遇到这个问题时,除了上面的配置解决问题,还可以:PHP代码中执行apc_clear_cache()重启php-fpm进程另外,我们可以将apc扩展安装时包含的apc.php文件放到web服务目录下,就可以可视化的观察apc扩展的缓存情况。服务使用了rsync同步这次故障的一个关键因素是使用了rsync同步,我的服务架构是:导致这个问题的原因探究具体为什么在apc扩展跟rsync同时使用会产生这个bug,我没有看源码,不太了解,但我做了一些大胆的猜测,下面的内容不够清楚和正确,希望大家能给我更精确的指导:这里可以看出文件是怎么检查是否有更新的,而问题也就出现在这一部分,没有办法判断文件是否被更新,同时正确读取到缓存的文件。参考资料PHP手册 - APC运行时配置:https://www.php.net/manual/zh…stack overflow - Problems with APC on publish:https://stackoverflow.com/que…PHP官方issue - apc.include_once_override turn on issue:https://bugs.php.net/bug.php?…php可选缓存APC:https://www.cnblogs.com/hf805…关于上线系统的一些想法 (for php):http://bikong0411.github.io/2…如何刷新APC类加载器缓存?:http://cn.voidcc.com/question…rsync文件同步服务:https://xdays.me/rsync%E6%96%…APC’s Include Once Override breaks install:https://www.drupal.org/projec…《PHP 7底层设计和源码实现》 ...

April 12, 2019 · 1 min · jiezi

rsync 安装配置实践

前言Rsync代表"remote sync",它是本地和远程主机文件同步工具。它只同步更改的文件,以此实现最小化传输数据。rsync的使用场景非常丰富,相信大家会经常使用,这里做下简单的总结。rsync安装配置实践更新历史2019年03月01日 - 初稿阅读原文 - https://wsgzao.github.io/post…扩展阅读rsync - https://www.samba.org/rsync/rsync简介rsync is a file transfer program capable of efficient remote update via a fast differencing algorithm.rsync 是类 unix 系统下的数据镜像备份工具,从软件的命名上就可以看出来了 ——remote sync。它的特性如下:可以镜像保存整个目录树和文件系统可以很容易做到保持原来文件的权限、时间、软硬链接等等无须特殊权限即可安装优化的流程,文件传输效率高可以使用 rsh、ssh 等方式来传输文件,当然也可以通过直接的 socket 连接支持匿名传输在使用 rsync 进行远程同步时,可以使用两种方式:远程 Shell 方式(用户验证由 ssh 负责)和 C/S 方式(即客户连接远程 rsync 服务器,用户验证由 rsync 服务器负责)。无论本地同步目录还是远程同步数据,首次运行时将会把全部文件拷贝一次,以后再运行时将只拷贝有变化的文件(对于新文件)或文件的变化部分(对于原有文件)。rsync源配置文件示例# 编辑rsync配置文件vim /etc/rsync.conf# /etc/rsyncd: configuration file for rsync daemon mode# See rsyncd.conf man page for more options.# configuration example:# uid = nobody# gid = nobody# use chroot = yes# max connections = 4# pid file = /var/run/rsyncd.pid# exclude = lost+found/# transfer logging = yes# timeout = 900# ignore nonreadable = yes# dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2# [ftp]# path = /home/ftp# comment = ftp export arearsyncd.conf 官方文档请参考https://www.samba.org/ftp/rsy…rsync常用参数注: 在指定复制源时,路径是否有最后的 “/” 有不同的含义,例如:/data 表示将整个 /data 目录复制到目标目录/data/ 表示将 /data/ 目录中的所有内容复制到目标目录rsync is a file transfer program capable of efficient remote update via a fast differencing algorithm.Usage: rsync [OPTION]… SRC [SRC]… DEST or rsync [OPTION]… SRC [SRC]… [USER@]HOST:DEST or rsync [OPTION]… SRC [SRC]… [USER@]HOST::DEST or rsync [OPTION]… SRC [SRC]… rsync://[USER@]HOST[:PORT]/DEST or rsync [OPTION]… [USER@]HOST:SRC [DEST] or rsync [OPTION]… [USER@]HOST::SRC [DEST] or rsync [OPTION]… rsync://[USER@]HOST[:PORT]/SRC [DEST]The ‘:’ usages connect via remote shell, while ‘::’ & ‘rsync://’ usages connectto an rsync daemon, and require SRC or DEST to start with a module name.Options -v, –verbose increase verbosity –info=FLAGS fine-grained informational verbosity –debug=FLAGS fine-grained debug verbosity –msgs2stderr special output handling for debugging -q, –quiet suppress non-error messages –no-motd suppress daemon-mode MOTD (see manpage caveat) -c, –checksum skip based on checksum, not mod-time & size -a, –archive archive mode; equals -rlptgoD (no -H,-A,-X) –no-OPTION turn off an implied OPTION (e.g. –no-D) -r, –recursive recurse into directories -R, –relative use relative path names –no-implied-dirs don’t send implied dirs with –relative -b, –backup make backups (see –suffix & –backup-dir) –backup-dir=DIR make backups into hierarchy based in DIR –suffix=SUFFIX set backup suffix (default ~ w/o –backup-dir) -u, –update skip files that are newer on the receiver –inplace update destination files in-place (SEE MAN PAGE) –append append data onto shorter files –append-verify like –append, but with old data in file checksum -d, –dirs transfer directories without recursing -l, –links copy symlinks as symlinks -L, –copy-links transform symlink into referent file/dir –copy-unsafe-links only “unsafe” symlinks are transformed –safe-links ignore symlinks that point outside the source tree –munge-links munge symlinks to make them safer (but unusable) -k, –copy-dirlinks transform symlink to a dir into referent dir -K, –keep-dirlinks treat symlinked dir on receiver as dir -H, –hard-links preserve hard links -p, –perms preserve permissions -E, –executability preserve the file’s executability –chmod=CHMOD affect file and/or directory permissions -A, –acls preserve ACLs (implies –perms) -X, –xattrs preserve extended attributes -o, –owner preserve owner (super-user only) -g, –group preserve group –devices preserve device files (super-user only) –copy-devices copy device contents as regular file –specials preserve special files -D same as –devices –specials -t, –times preserve modification times -O, –omit-dir-times omit directories from –times -J, –omit-link-times omit symlinks from –times –super receiver attempts super-user activities –fake-super store/recover privileged attrs using xattrs -S, –sparse handle sparse files efficiently –preallocate allocate dest files before writing them -n, –dry-run perform a trial run with no changes made -W, –whole-file copy files whole (without delta-xfer algorithm) -x, –one-file-system don’t cross filesystem boundaries -B, –block-size=SIZE force a fixed checksum block-size -e, –rsh=COMMAND specify the remote shell to use –rsync-path=PROGRAM specify the rsync to run on the remote machine –existing skip creating new files on receiver –ignore-existing skip updating files that already exist on receiver –remove-source-files sender removes synchronized files (non-dirs) –del an alias for –delete-during –delete delete extraneous files from destination dirs –delete-before receiver deletes before transfer, not during –delete-during receiver deletes during the transfer –delete-delay find deletions during, delete after –delete-after receiver deletes after transfer, not during –delete-excluded also delete excluded files from destination dirs –ignore-missing-args ignore missing source args without error –delete-missing-args delete missing source args from destination –ignore-errors delete even if there are I/O errors –force force deletion of directories even if not empty –max-delete=NUM don’t delete more than NUM files –max-size=SIZE don’t transfer any file larger than SIZE –min-size=SIZE don’t transfer any file smaller than SIZE –partial keep partially transferred files –partial-dir=DIR put a partially transferred file into DIR –delay-updates put all updated files into place at transfer’s end -m, –prune-empty-dirs prune empty directory chains from the file-list –numeric-ids don’t map uid/gid values by user/group name –usermap=STRING custom username mapping –groupmap=STRING custom groupname mapping –chown=USER:GROUP simple username/groupname mapping –timeout=SECONDS set I/O timeout in seconds –contimeout=SECONDS set daemon connection timeout in seconds -I, –ignore-times don’t skip files that match in size and mod-time -M, –remote-option=OPTION send OPTION to the remote side only –size-only skip files that match in size –modify-window=NUM compare mod-times with reduced accuracy -T, –temp-dir=DIR create temporary files in directory DIR -y, –fuzzy find similar file for basis if no dest file –compare-dest=DIR also compare destination files relative to DIR –copy-dest=DIR … and include copies of unchanged files –link-dest=DIR hardlink to files in DIR when unchanged -z, –compress compress file data during the transfer –compress-level=NUM explicitly set compression level –skip-compress=LIST skip compressing files with a suffix in LIST -C, –cvs-exclude auto-ignore files the same way CVS does -f, –filter=RULE add a file-filtering RULE -F same as –filter=‘dir-merge /.rsync-filter’ repeated: –filter=’- .rsync-filter’ –exclude=PATTERN exclude files matching PATTERN –exclude-from=FILE read exclude patterns from FILE –include=PATTERN don’t exclude files matching PATTERN –include-from=FILE read include patterns from FILE –files-from=FILE read list of source-file names from FILE -0, –from0 all *-from/filter files are delimited by 0s -s, –protect-args no space-splitting; only wildcard special-chars –address=ADDRESS bind address for outgoing socket to daemon –port=PORT specify double-colon alternate port number –sockopts=OPTIONS specify custom TCP options –blocking-io use blocking I/O for the remote shell –stats give some file-transfer stats -8, –8-bit-output leave high-bit chars unescaped in output -h, –human-readable output numbers in a human-readable format –progress show progress during transfer -P same as –partial –progress -i, –itemize-changes output a change-summary for all updates –out-format=FORMAT output updates using the specified FORMAT –log-file=FILE log what we’re doing to the specified FILE –log-file-format=FMT log updates using the specified FMT –password-file=FILE read daemon-access password from FILE –list-only list the files instead of copying them –bwlimit=RATE limit socket I/O bandwidth –outbuf=N|L|B set output buffering to None, Line, or Block –write-batch=FILE write a batched update to FILE –only-write-batch=FILE like –write-batch but w/o updating destination –read-batch=FILE read a batched update from FILE –protocol=NUM force an older protocol version to be used –iconv=CONVERT_SPEC request charset conversion of filenames –checksum-seed=NUM set block/file checksum seed (advanced) -4, –ipv4 prefer IPv4 -6, –ipv6 prefer IPv6 –version print version number(-h) –help show this help (-h is –help only if used alone)Use “rsync –daemon –help” to see the daemon-mode command-line options.Please see the rsync(1) and rsyncd.conf(5) man pages for full documentation.See http://rsync.samba.org/ for updates, bug reports, and answers# rsync常用参数-v :展示详细的同步信息-a :归档模式,相当于 -rlptgoD -r :递归目录 -l :同步软连接文件 -p :保留权限 -t :将源文件的"modify time"同步到目标机器 -g :保持文件属组 -o :保持文件属主 -D :和–devices –specials一样,保持设备文件和特殊文件-z :发送数据前,先压缩再传输-H :保持硬链接-n :进行试运行,不作任何更改-P same as –partial –progress –partial :支持断点续传 –progress :展示传输的进度–delete :如果源文件消失,目标文件也会被删除–delete-excluded :指定要在目的端删除的文件–delete-after :默认情况下,rsync是先清理目的端的文件再开始数据同步;如果使用此选项,则rsync会先进行数据同步,都完成后再删除那些需要清理的文件。–exclude=PATTERN :排除匹配PATTERN的文件–exclude-from=FILE :如果要排除的文件很多,可以统一写在某一文件中-e ssh :使用SSH加密隧道传输# 远程Shell方式rsync [OPTION]… SRC [SRC]… [USER@]HOST:DEST # 执行“推”操作or rsync [OPTION]… [USER@]HOST:SRC [DEST] # 执行“拉”操作# 远程C/S方式rsync [OPTION]… SRC [SRC]… [USER@]HOST::DEST # 执行“推”操作or rsync [OPTION]… SRC [SRC]… rsync://[USER@]HOST[:PORT]/DEST # 执行“推”操作or rsync [OPTION]… [USER@]HOST::SRC [DEST] # 执行“拉”操作or rsync [OPTION]… rsync://[USER@]HOST[:PORT]/SRC [DEST] # 执行“拉”操作rsync同步方式Rsync 远程同步主要有两种方式:使用远程 shell(ssh或rsh) 或使用 rsync 的 daemon 方式rsync 命令和 ssh,scp 命令有点相似。我们创建两个测试目录和一些文件:mkdir dir1mkdir dir2touch dir1/somefile{1..100}# dir1 中有 100 文件,dir2 中为空。使用 rsync 把 dir1 内容同步到 dir2,-r 选项代表递归,在同步目录时使用。rsync -r dir1/ dir2# 你也可以使用 -a 选项,代表同步所有,包括修改时间、群组、权限、特殊文件、也包括递归。rsync -anv dir1/ dir2# 注意上面的 dir1 / 中的 “/” 不能少,它代表同步目录下文件, 如果没有 “/” 代表同步这个目录。# 和远程主机进行同步目录首先,你要确保有远程主机的 SSH 访问权限# 把本地目录同步到远程主机:rsync -a dir1/ root@linux:/dir2# 把远程主机目录同步到本地:rsync -a root@linux:/dir2/ dir1本地文件同步# 如果没有desc目录,会自动创建rsync -avH /opt/resource/ /tmp/desc/远程文件同步 –shell 方式# 从本地传到远端,目标文件会被写成ssh登录用户的属组和属主(如下 www)rsync -avH /opt/nginx-1.12.1/ www@172.18.50.125:/tmp/nginx/# 使用 ssh 加密隧道方式传输,保障数据的安全性rsync -avHe ssh /opt/nginx-1.12.1/ www@172.18.50.125:/tmp/nginx/# 从远端传到本地,只要对目标文件有读的权限,就可以同步到本地rsync -avH www@172.18.50.125:/tmp/nginx/ /tmp/nginx/# 如果远程服务器ssh端口不是默认的22rsync -avHe “ssh -p 11222” /opt/nginx-1.12.1/ www@172.18.50.125:/tmp/nginx/远程文件同步 –daemon 方式rsync服务端配置# 创建 rsync 服务的目录和配置文件 (可选)mkdir /etc/rsync cd /etc/rsynctouch rsyncd.conftouch rsyncd.secretstouch rsyncd.motdchmod 600 rsyncd.secrets### rsyncd.conf 文件的配置vim /etc/rsync/rsyncd.conf# /etc/rsyncd: configuration file for rsync daemon mode# See rsyncd.conf man page for more options.# 传输文件使用的用户和用户组,如果是从服务器=>客户端,要保证www用户对文件有读取的权限;如果是从客户端=>服务端,要保证www对文件有写权限。uid = wwwgid = www# 允许chroot,提升安全性,客户端连接模块,首先chroot到模块path参数指定的目录下,chroot为yes时必须使用root权限,且不能备份path路径外的链接文件use chroot = yes# 只读read only = no# 只写write only = no# 设定白名单,可以指定IP段(172.18.50.1/255.255.255.0),各个Ip段用空格分开hosts allow = 172.18.50.110 172.18.50.111hosts deny = *# 允许的客户端最大连接数max connections = 4# 欢迎文件的路径,非必须motd file = /etc/rsync/rsyncd.motd# pid文件路径pid file = /var/run/rsyncd.pid# 记录传输文件日志transfer logging = yes# 日志文件格式log format = %t %a %m %f %b# 指定日志文件log file = /var/log/rsync.log# 剔除某些文件或目录,不同步exclude = lost+found/# 设置超时时间timeout = 900ignore nonreadable = yes# 设置不需要压缩的文件dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2# 模块,可以配置多个,使用如: sate@172.18.50.125::125to110[125to110]# 模块的根目录,同步目录,要注意权限path = /tmp/nginx# 是否允许列出模块内容list = no# 忽略错误ignore errors# 添加注释comment = ftp export area# 模块验证的用户名称,可使用空格或者逗号隔开多个用户名auth users = sate# 模块验证密码文件 可放在全局配置里secrets file = /etc/rsync/rsyncd.secrets# 剔除某些文件或目录,不同步exclude = lost+found/ conf/ man/### rsyncd.secrets 文件的配置cat rsyncd.secrets # 用户名:密码sate:111111### rsync启动rsync –daemon –config=/etc/rsync/rsyncd.confrsync客户端配置# 从 服务端 => 客户端 同步数据,会提示输入密码rsync -avzP –delete sate@172.18.50.125::125to110 /tmp/sync/# 从 客户端 => 服务端 同步数据,会提示输入密码rsync -avzP –delete /tmp/sync/ sate@172.18.50.125::125to110# 注: 如果是 /tmp/sync,则同步sync目录;如果 /tmp/sync/,则同步sync目录下的文件# 免密码同步,将密码写到文件,再通过 –password-file 指定该文件,注:该文件的权限必须是 600echo “111111” > /tmp/secrets.filechmod 600 /tmp/secrets.filersync -avzP –delete –password-file=/tmp/secrets.file sate@172.18.50.125::125to110 /tmp/sync/# –exclude 排除文件目录时,如果有多个同名目录的情况# 目录结构tree.├── dir1│ └── test│ ├── 3.file│ ├── 4.file│ └── 5.file├── dir2└── test ├── 1.file ├── 2.file └── 3.file# 情况一 : 排除 /test 目录,同步其他目录(同步的是/tmp/sync/ 下边的文件)rsync -avP –delete –password-file=/tmp/secrets.file –exclude=test /tmp/sync/ sate@172.18.50.125::125to110 # 会发现,该目录下所有 test 目录都被排除了,如果想只排除第一层目录的 test,可以如下(/ 代表所同步目录第一层):rsync -avP –delete –password-file=/tmp/secrets.file –exclude=/test/ /tmp/sync/ sate@172.18.50.125::125to110 # 情况二 : 和情况一不同的是 同步的 /tmp/sync 这个目录(同步的是/tmp/sync 目录本身,导致 exclude 后边的参数也会变化)rsync -avP –delete –password-file=/tmp/secrets.file –exclude=/sync/test/ /tmp/sync sate@172.18.50.125::125to110 rsync简化配置实践# 配置服务端rsyncd.confvim /etc/rsyncd.confread only = nolist = yesuid = rootgid = root[backup]path= /data/hosts allow = 10.71.12.0/23# 设置服务systemctl start rsyncdsystemctl enable rsyncd# 配置rsync客户端# 编辑backup.sh同步脚本vim backup.sh#!/bin/shSOURCE=$1DEST=$2CMD=“rsync -ravz –bwlimit=2000 $1 rsync://{{log_server_ip}}:873/backup/$2"PROCS=$(pgrep -f “{{log_server_ip}}:873/backup/$2”)if [ “x” != “x$PROCS” ]; then echo “not finished” exitfi$CMD# 修改crontabvim /etc/crontab15 * * * * root cd /opt/sa_scripts/ && ./backup.sh /var/log/ocha/pos_python_server/ 10.71.12.89/$(date +%Y-%m) rsync 有用的选项-z 选项,压缩传输的文件rsync -az source dest-P 选项非常有用,它是 -progress 和 -partial 的组合。第一个选项是用来显示传输进度条,第二个选项允许断点续传和增量传输:rsync -azP source dest–bwlimit选项,限制传输带宽,参数值的默认单位是 KBPS,也就是每秒多少 KBrsync -avzP –bwlimit=100 ...

March 5, 2019 · 8 min · jiezi

rsync算法原理及使用

如果服务器之间需要保持某些文件的一致,我们可以使用scp来复制,如果需要长期保持一致,可以配合crontab脚本来使用。但是此时我们有更优的方式,就是rsync+crontab来实现定时增量传输保持文件一致。rsync功能很强大,网上的资料也都很全,这里做一些简单的汇总。rsync原理这一小节内容大幅度转载了 RSYNC 的核心算法 的内容,因为原文章写的太好,就不再狗尾续貂了,感兴趣的可以直接查看原文。他的翻译原文是:The rsync algorithm。rsync是linux下同步文件的一个高效算法,用于同步更新两处计算机的文件和目录,并适当利用查找文件中的不同块以减少数据传输。rsync的主要特点就是增量传输,只对变更的部分进行传送。增量同步算法假如我们现在需要同步两个文件保持一致,并且只想传送不同的部分,那么我们就需要对两边的文件做diff,但是这两个问题在两台不同的机器上,无法做diff。如果我们做diff,就要把一个文件传到另一台机器上做diff,但这样一来,我们就传了整个文件,这与我们只想传输不同部的初衷相背。于是我们就要想一个办法,让这两边的文件见不到面,但还能知道它们间有什么不同。这就是rsync的算法。rsync同步算法我们将同步源文件名称为fileSrc,同步目的文件叫fileDst。1. 分块Checksum算法首先,我们会把fileDst的文件平均切分成若干个小块,比如每块512个字节(最后一块会小于这个数),然后对每块计算两个checksum:一个叫rolling checksum,是弱checksum,32位的checksum另一个是强checksum,128位的,以前用md4,现在用md5 hash算法。为什么要这样?因为若干年前的硬件上跑md4的算法太慢了,所以,我们需要一个快算法来鉴别文件块的不同,但是弱的adler32算法碰撞概率太高了,所以我们还要引入强的checksum算法以保证两文件块是相同的。也就是说,弱的checksum是用来区别不同,而强的是用来确认相同。2. 传输算法同步目标端会把fileDst的一个checksum列表传给同步源,这个列表里包括了三个东西,rolling checksum(32bits),md5 checksume(128bits),文件块编号。同步源机器拿到了这个列表后,会对fileSrc做同样的checksum,然后和fileDst的checksum做对比,这样就知道哪些文件块改变了。但是,聪明的你一定会有以下两个疑问:如果我fileSrc这边在文件中间加了一个字符,这样后面的文件块都会位移一个字符,这样就完全和fileDst这边的不一样了,但理论上来说,我应该只需要传一个字符就好了。这个怎么解决?如果这个checksum列表特别长,而我的两边的相同的文件块可能并不是一样的顺序,那就需要查找,线性的查找起来应该特别慢吧。这个怎么解决?很好,让我们来看一下同步源端的算法。3. checksum查找算法同步源端拿到fileDst的checksum数组后,会把这个数据存到一个hash table(特殊的数据结构体,可以快速检索)中,用rolling checksum做hash,以便获得O(1)时间复杂度的查找性能。这个hash table是16bits的,所以,hash table的尺寸是2的16次方,对rolling checksum的hash会被散列到0 到 2^16 – 1中的某个整数值。4. 比对算法取fileSrc的第一个文件块(我们假设的是512个长度),也就是从fileSrc的第1个字节到第512个字节,取出来后做rolling checksum计算。计算好的值到hash表中查。如果查到了,说明发现在fileDst中有潜在相同的文件块,于是就再比较md5的checksum,因为rolling checksume太弱了,可能发生碰撞。于是还要算md5的128bits的checksum,这样一来,我们就有 2^-(32+128) = 2^-160的概率发生碰撞,这太小了可以忽略。如果rolling checksum和md5 checksum都相同,这说明在fileDst中有相同的块,我们需要记下这一块在fileDst下的文件编号。如果fileSrc的rolling checksum 没有在hash table中找到,那就不用算md5 checksum了。表示这一块中有不同的信息。总之,只要rolling checksum 或 md5 checksum 其中有一个在fileDst的checksum hash表中找不到匹配项,那么就会触发算法对fileSrc的rolling动作。于是,算法会住后step 1个字节,取fileSrc中字节2-513的文件块要做checksum,go to (1.) – 现在你明白什么叫rolling checksum了吧。这样,我们就可以找出fileSrc相邻两次匹配中的那些文本字符,这些就是我们要往同步目标端传的文件内容了。5. 传输最终在同步源这端,我们的rsync算法可能会得到这个样子的一个数据数组,图中,红色块表示在目标端已匹配上,不用传输(注:我专门在其中显示了两块chunk #5,代表数据中有复制的地方,不用传输),而白色的地方就是需要传输的内容(注意:这些白色的块是不定长的),这样,同步源这端把这个数组(白色的就是实际内容,红色的就放一个标号)压缩传到目的端,在目的端的rsync会根据这个表重新生成文件,这样,同步完成。最后想说一下,对于某些压缩文件使用rsync传输可能会传得更多,因为被压缩后的文件可能会非常的不同。对此,对于gzip和bzip2这样的命令,记得开启 “rsyncalbe” 模式。rsync的使用同样的,这一小节内容也是大幅度转载了 第2章 rsync(一):基本命令和用法 的内容,因为原文章很全面,感兴趣的可以直接查看原文。rsync是实现增量备份的工具。配合任务计划,rsync能实现定时或间隔同步,配合inotify或sersync,可以实现触发式的实时同步。它的目的是实现本地主机和远程主机上的文件同步(包括本地推到远程,远程拉到本地两种同步方式),也可以实现本地不同路径下文件的同步,但不能实现远程路径1到远程路径2之间的同步(scp可以实现)。rsync同步过程中由两部分组成:决定哪些文件需要同步的检查模式以及文件同步时的同步模式。检查模式是指按照指定规则来检查哪些文件需要被同步,例如哪些文件是明确被排除不传输的。默认情况下,rsync使用"quick check"算法快速检查源文件和目标文件的大小、mtime(修改时间)是否一致,如果不一致则需要传输。当然,也可以通过在rsync命令行中指定某些选项来改变quick check的检查模式,比如"–size-only"选项表示"quick check"将仅检查文件大小不同的文件作为待传输文件。rsync支持非常多的选项,其中检查模式的自定义性是非常有弹性的。同步模式是指在文件确定要被同步后,在同步过程发生之前要做哪些额外工作。例如上文所说的是否要先删除源主机上没有但目标主机上有的文件,是否要先备份已存在的目标文件,是否要追踪链接文件等额外操作。rsync也提供非常多的选项使得同步模式变得更具弹性。相对来说,为rsync手动指定同步模式的选项更常见一些,只有在有特殊需求时才指定检查模式,因为大多数检查模式选项都可能会影响rsync的性能。rsync四种工作方式rsync的基础语法为:rsync [OPTION…] SRC… [DEST]支持的参数高达一百多个,最常用的选项组合是"avz",即压缩和显示部分信息,并以归档模式传输。详细的可以参考 博客园-man rsync翻译(rsync命令中文手册),下面是部分参数说明:-v:显示rsync过程中详细信息。可以使用"-vvvv"获取更详细信息。-P:显示文件传输的进度信息。(实际上"-P"="–partial –progress",其中的"–progress"才是显示进度信息的)。-n –dry-run :仅测试传输,而不实际传输。常和"-vvvv"配合使用来查看rsync是如何工作的。-a –archive :归档模式,表示递归传输并保持文件属性。等同于"-rtopgDl"。-r –recursive:递归到目录中去。-t –times:保持mtime属性。强烈建议任何时候都加上"-t",否则目标文件mtime会设置为系统时间,导致下次更新 :检查出mtime不同从而导致增量传输无效。-o –owner:保持owner属性(属主)。-g –group:保持group属性(属组)。-p –perms:保持perms属性(权限,不包括特殊权限)。-D :是"–device –specials"选项的组合,即也拷贝设备文件和特殊文件。-l –links:如果文件是软链接文件,则拷贝软链接本身而非软链接所指向的对象。-z :传输时进行压缩提高效率。-R –relative:使用相对路径。意味着将命令行中指定的全路径而非路径最尾部的文件名发送给服务端,包括它们的属性。用法见下文示例。–size-only :默认算法是检查文件大小和mtime不同的文件,使用此选项将只检查文件大小。-u –update :仅在源mtime比目标已存在文件的mtime新时才拷贝。注意,该选项是接收端判断的,不会影响删除行为。-d –dirs :以不递归的方式拷贝目录本身。默认递归时,如果源为"dir1/file1",则不会拷贝dir1目录,使用该选项将拷贝dir1但不拷贝file1。–max-size :限制rsync传输的最大文件大小。可以使用单位后缀,还可以是一个小数值(例如:"–max-size=1.5m")–min-size :限制rsync传输的最小文件大小。这可以用于禁止传输小文件或那些垃圾文件。–exclude :指定排除规则来排除不需要传输的文件。–delete :以SRC为主,对DEST进行同步。多则删之,少则补之。注意"–delete"是在接收端执行的,所以它是在 :exclude/include规则生效之后才执行的。-b –backup :对目标上已存在的文件做一个备份,备份的文件名后默认使用"“做后缀。–backup-dir:指定备份文件的保存路径。不指定时默认和待备份文件保存在同一目录下。-e :指定所要使用的远程shell程序,默认为ssh。–port :连接daemon时使用的端口号,默认为873端口。–password-file:daemon模式时的密码文件,可以从中读取密码实现非交互式。注意,这不是远程shell认证的密码,而是rsync模块认证的密码。-W –whole-file:rsync将不再使用增量传输,而是全量传输。在网络带宽高于磁盘带宽时,该选项比增量传输更高效。–existing :要求只更新目标端已存在的文件,目标端还不存在的文件不传输。注意,使用相对路径时如果上层目录不存在也不会传输。–ignore-existing:要求只更新目标端不存在的文件。和”–existing"结合使用有特殊功能,见下文示例。–remove-source-files:要求删除源端已经成功传输的文件。1. 本地文件系统上实现同步rsync [OPTION…] SRC… [DEST]2. 本地主机使用远程shell和远程主机通信 Pull: rsync [OPTION…] [USER@]HOST:SRC… [DEST] Push: rsync [OPTION…] SRC… [USER@]HOST:DEST3. 本地主机通过网络套接字连接远程主机上的rsync daemon Pull: rsync [OPTION…] [USER@]HOST::SRC… [DEST] rsync [OPTION…] rsync://[USER@]HOST[:PORT]/SRC… [DEST] Push: rsync [OPTION…] SRC… [USER@]HOST::DEST rsync [OPTION…] SRC… rsync://[USER@]HOST[:PORT]/DEST前两者的本质是通过管道通信,即使是远程shell。而方式(3)则是让远程主机上运行rsync服务,使其监听在一个端口上,等待客户端的连接。路径的格式可以是本地路径,也可以是使用user@host:path或user@host::path的远程路径,如果主机和path路径之间使用单个冒号隔开,表示使用的是远程shell通信方式,而使用双冒号隔开的则表示的是连接rsync daemon。另外,连接rsync daemon时,还提供了URL格式的路径表述方式rsync://user@host/path。4. 远程shell临时启动一个rsync daemonrsync [options] –rsh=ssh auth_user@host::modulersync [options] –rsh=“ssh -l ssh_user” auth_user@host::modulersync [options] -e “ssh -l ssh_user” auth_user@host::modulersync [options] -e “ssh -l ssh_user” rsync://auth_user@host/module这不同于方式(3),它不要求远程主机上事先启动rsync服务,而是临时派生出rsync daemon,它是单用途的一次性daemon,仅用于临时读取daemon的配置文件,当此次rsync同步完成,远程shell启动的rsync daemon进程也会自动消逝。此通信方式的命令行语法格式同"Access via rsync daemon",但要求options部分必须明确指定"–rsh"选项或其短选项"-e"。一些用法示例# 将/etc/fstab拷贝到/tmp目录下rsync /etc/fstab /tmp# 将/etc/cron.d目录拷贝到/tmp下rsync -r /etc/cron.d /tmp# 将/etc/cron.d目录拷贝到/tmp下,但要求在/tmp下也生成etc子目rsync -R -r /etc/cron.d /tmp# 拷贝源路径较长,但只保留一部分目录结构,使用一个点代表相对路径的起始位置rsync -R -r /var/./log/anaconda /tmp# 对远程目录下已存在文件做备份,备份后缀为"",使用"–suffix"指定后缀rsync -R -r –backup /var/./log/anaconda /tmp# 指定备份文件保存路径,默认将不会加备份后缀,使用"–suffix"显式指定后缀rsync -R -r –backup –backup-dir=/tmp/log_back /var/./log/anaconda /tmp# .指定ssh连接参数,如端口、连接的用户、ssh选项等rsync -e “ssh -p 22 -o StrictHostKeyChecking=no” /etc/fstab 172.16.10.5:/tmp# 使用"–existing"选项使得只更新目标端已存在的文件rsync -r -v –existing /tmp/a/ /tmp/b # “–ignore-existing"更新目标端不存在的文件rsync -r -v –ignore-existing /tmp/a/ /tmp/b# “–remove-source-files"删除源端文件rsync -r -v –remove-source-files /tmp/a/anaconda /tmp/a/audit /tmp# 使用”–exclude"选项指定排除规则,排除那些不需要传输的文件。rsync -r -v –exclude=“anaconda/*.log” /var/log/anaconda /var/log/audit /tmp如果仅有一个SRC或DEST参数,则将以类似于"ls -l"的方式列出源文件列表(只有一个路径参数,总会认为是源文件),而不是复制文件。源路径如果是一个目录的话,带上尾随斜线和不带尾随斜线是不一样的,不带尾随斜线表示的是整个目录包括目录本身,带上尾随斜线表示的是目录中的文件,不包括目录本身。# 在/tmp目录下创建etc目录[root@xuexi ~]# rsync -a /etc /tmp# 不会在/tmp目录下创建etc目录,源路径/etc/中的所有文件都直接放在/tmp目录下[root@xuexi ~]# rsync -a /etc/ /tmp参考资料酷壳-RSYNC 的核心算法:https://coolshell.cn/articles…The rsync algorithm:https://rsync.samba.org/tech_…博客园-rsync(一):基本命令和用法:http://www.cnblogs.com/f-ck-n…博客园-man rsync翻译(rsync命令中文手册): http://www.cnblogs.com/f-ck-n… ...

March 5, 2019 · 2 min · jiezi

rsync同步和备份文件到本地

转载请注明文章出处:https://tlanyan.me/use-rsync-…rsync是主机间同步和备份的神器。相对于ftp、scp等工具,rsync功能更强大,同步/传输效率更高,实属服务器的必备工具。最近使用rsync时发现一个问题:PC和移动硬盘之间用rsync同步,修改过的二进制大文件会整个文件重传,效率十分低下。说好的rsync只传输差异部分呢?还是二进制文件的问题?但rsync的man手册明明这样写的:Rsync is a fast and extraordinarily versatile file copying tool. It can copy locally, to/from another host over any remote shell, or to/from a remote rsync daemon. It offers a large number of options that control every aspect of its behavior and permit very flexible specification of the set of files to be copied. It is famous for its delta-transfer algorithm, which reduces the amount of data sent over the network by sending only the differences between the source files and the existing files in the destination. Rsync is widely used for backups and mirroring and as an improved copy command for everyday use.带着这个疑问上网查询,找到一个和我有同样困惑的人:Smarter filetransfers than rsync?。幸运的是有人完美的回答了这个问题:Rsync will not use deltas but will transmit the full file in its entirety if it - as a single process - is responsible for the source and destination files. It can transmit deltas when there is a separate client and server process running on the source and destination machines.The reason that rsync will not send deltas when it is the only process is that in order to determine whether it needs to send a delta it needs to read the source and destination files. By the time it’s done that it might as well have just copied the file directly.翻译过来是:主机间通过网络同步文件,每个主机各运行一个rsync进程分别本机内的文件hash,然后通过网络传输差异部分;主机内的同步只有一个进程,rsync认为与其先对比文件再复制差异部分,不如直接进行复制来得快,故而选择传送整个文件。仔细想一下,rsync的行为是合理的:主机间通讯的瓶颈在网络带宽,先计算差异部分再传效率高;同主机内是硬盘对拷,速度是网络速度的十来倍,直接拷贝比一般比先对比再传输更快,直接复制整个文件是很好的选择。写了个脚本测试rsync的行为:<pre>#!/bin/bashecho “make test file"dd if=/dev/zero of=testfile bs=1024k count=512echo “cp test file"cp testfile syncfileecho “make changes to test file"echo ‘1234567890’ >> testfileecho “rsync file in local…“rsync -avh -P testfile syncfileecho ““echo “restore sync file"dd if=/dev/zero of=syncfile bs=1024k count=512echo “rsync file via network"rsync -avh -P testfile localhost:~/syncfile</pre>测试脚本输出结果如下:<img src=“https://tlanyan.me/wp-content...; alt=”” width=“665” height=“444” class=“aligncenter size-large wp-image-3233” />结果和预期的一致:本机内同步时,直接全量复制;走SSH协议后,仅发送差异部分,显著提高效率。rsync的做法没毛病,但仅做过小部分修改的大文件,同主机内全量拷贝也很伤人。解决办法是用测试脚本内的模拟网络传输。Linux系统的主机基本都内置SSHD,写命令时加上localhost和代表网络的冒号即可;Windows 10的1809版本上,OpenSSH已经成为系统的内置组建,安装和使用也省心。此外有Cygwin、Bitvise SSH Server等可供选择,安装好后也同步大文件也不再是问题。另一个需要注意的问题是跨分区或设备进行同步时,文件系统应当互相兼容,否则可能会出现问题。例如从NTFS文件系统向(ex)FAT优盘同步文件,使用常用的-avhP选项,每次同步都会将所有文件复制一遍。问题在于两个文件系统支持的功能不同,FAT不支持-l、-p等功能,加上这些选项会让rsync判断为两个不同的文件,从而再次复制。针对这种情况,要使用-cvrhP选项。参考Smarter filetransfers than rsync?OpenSSH in WindowsInstalling CYGWIN + SSHD for remote access through SSH on windowsInstalling SFTP/SSH Server on Windows using OpenSSHBitvise SSH Serverrsync not working between NTFS/FAT and EXT ...

February 11, 2019 · 2 min · jiezi

rsync+inotify实时同步

数据实时同步在生产中有一种需求是,当目录下的文件数据发生变化时,就将数据备份到备份服务器上。实现这样的需求需要做到以下两点:利用监控服务(inotify),监控到要同步服务器的目录文件的变化发现目录数据发生变化就利用rsync服务将数据发送到备份服务器因此,利用rsync+inotify可实现数据的实时同步。Inotify介绍Inotify是一种强大的,细粒度的。异步的文件系统事件监控机制,linux内核从2.6.13起,加入了 Inotify支持,通过Inotify可以监控文件系统中添加、删除,修改、移动等各种事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而 inotify-tools 正是实施这样监控的软件。Inotify实际是一种事件驱动机制,它为应用程序监控文件系统事件提供了实时响应事件的机制,而无须通过诸如cron等的轮询机制来获取事件。cron等机制不仅无法做到实时性,而且消耗大量系统资源。相比之下,inotify基于事件驱动,可以做到对事件处理的实时响应,也没有轮询造成的系统资源消耗,是非常自然的事件通知接口,也与自然世界事件机制相符合。Inotify安装环境介绍[root@moli-linux03 ~] uname -r3.10.0-862.2.3.el7.x86_64[root@moli-linux03 ~] cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core)安装前提需要2.6.13以后内核版本才能支持inotify软件。2.6.13内核之后版本,在没有安装inotify软件之前,应该有这三个文件。[root@moli-linux03 ~] ll /proc/sys/fs/inotify/总用量 0-rw-r–r–. 1 root root 0 2月 3 12:24 max_queued_events-rw-r–r–. 1 root root 0 2月 3 12:24 max_user_instances-rw-r–r–. 1 root root 0 2月 3 12:24 max_user_watches[root@moli-linux03 ~] 三个文件的说明文件默认值作用说明 max_user_watches8192设置inotifywait或inotifywatch命令可以监视的文件数量(单进程)max_user_instances128设置每个用户可以运行的inotifywait或inotifywatch命令的进程数max_queued_events16384设置inotify实例事件(event)队列可容纳的事件数量注:可以将三个文件的数值调大,监听更大的范围安装方式可选择yum安装或者编译安装,yum安装需要配置有epel源,编译安装需要到github下载源码包。yum安装yum install -y inotify-tools编译安装(源码包地址:https://github.com/rvoicilas/…tar -zxf tar -zxf inotify-tools-3.13.tar.gz ./configuremakemake installinotify主要安装的两个软件inotifywait: (主要) 在被监控的文件或目录上等待特定文件系统事件(open close delete等)发生,执行后处于阻塞状态,适合在shell脚本中使用inotifywatch: 收集被监控的文件系统使用的统计数据,指文件系统事件发生的次数统计。 说明:在实时实时同步的时候,主要是利用inotifywait对目录进行监控inotifywait重要命令参数说明参数说明-m始终保持事件监听-r递归监控目录数据信息变化-q输出信息少(只打印事件信息)-timefmt指定时间输出格式-format打印使用指定的输出类似格式字符串;即实际监控输出内容-e指定监听指定的事件,如果省略,表示所有事件都进行监听 -e[参数] 可以指定的事件类型事件名称说明close_write文件或目录关闭,在写入模式打开之后关闭的。move文件或目录不管移动到或是移出监控目录都触发事件create文件或目录创建在监控目录中delete文件或目录被删除在监控目录中示例测试对一个服务器打开两个终端窗口,终端1执行创建,删除,修改,移动文件等操作,终端2执行inotifywait命令。创建事件[root@终端2 ~] inotifywait -mrq /root/rsync_test –timefmt “%d-%m-%y %H:%M” –format “%T %w%f 事件信息: %e” -e create[root@终端1 rsync_test]# touch 1.txt下面显示出事件信息,在终端一执行创建文件操作之后终端二才显示的事件03-02-19 12:48 /root/rsync_test/1.txt 事件信息: CREATE删除事件[root@moli_linux1 ~]# inotifywait -mrq /data –timefmt “%d-%m-%y %H:%M” –format “%T %w%f 事件信息: %e” -e delete[root@moli_data ~]# rm -f 1.txt修改事件[root@moli_linux1 ~]# inotifywait -mrq /data –timefmt “%d-%m-%y %H:%M” –format “%T %w%f 事件信息: %e” -e close_write[root@moli_data ~]# echo “hahaha” > 2 .txt移动事件move_to把其他目录文件移动到监控目录[root@moli_linux1 ~]# inotifywait -mrq /data –timefmt “%d-%m-%y %H:%M” –format “%T %w%f 事件信息: %e” -e moved_to[root@moli_data ~]# mv /etc/passwd .移动事件move_from把监控目录文件移到其他目录[root@moli_linux1 ~]# inotifywait -mrq /data –timefmt “%d-%m-%y %H:%M” –format “%T %w%f 事件信息: %e” -e moved_from[root@moli_data ~]# mv 2.txt /tmp inotifywait –timefmt时间参数说明命令参数说明%y年份信息,显示信息为十进制,并且没有世纪信息%m显示月份,显示信息为十进制(范围 01-12 )%d每月的第几天,显示倍息为十进制数(范围是 01-31 )%H小时信息,显示信息为十进制,使用 24小时制(范围 00-23 )%M显示分钟,显示信息为十进制(范围 00-59 )inotifywait –format参数说明命令参数说明%w事件出现时,监控文件或目录的名称信息%f事件出现时,将显示监控目录下触发事件的文件或目录信息,否则为空%e显示发生的事件信息,不同的事件信息用逗号进行分隔%T输出时间格式中定义的时间格式信息,通过 –timefmt option 语法格式指定时间信息这个格式是通过strftime函数进行匹配时间格式信息的Linux文件同步工具rsync介绍rsync是一款开源,快速,多功能的可实现增量的本地或远程的数据镜像同步备份的优秀工具。适用于多个平台。从软件名称可以看出来是远程同步的意思(remote sync)。可使本地主机不同分区或目录之间及本地和远程两台主机之间的数据快速同步镜像,远程备份等功能。在同步备份时,默认情况下,rsync通过其独特的“quick check”算法,仅同步大小或者最后修改时间发生变化的文件或目录(也可根据权限,属主等变化同步,需要制定参数)。甚至是只同步一个文件里变化的内容部分,所以可以实现快速的同步数据的功能。提示:传统的cp,scp工具拷贝每次均为完整拷贝,而rsync除了完整拷贝,还具备增量拷贝的功能,因此从此性能及效率上更胜一筹。Rsync的特性1)支持拷贝特殊文件如链接,设备等2)可以有排除指定文件或目录同步的功能,相当于打包命令tar3)可以保持原来文件或目录的权限,时间,软硬链接等所有属性均不改变。4)可实现增量同步,即只同步发生变化的数据,因此数据传输效率更高5)可以使用rcp,rsh,ssh等方式来配合传输文件,也可以通过直接的socker链接6)支持匿名的或认证的进程模式传输,方便进行数据备份及镜像。核心算法介绍假定在名为和的两台计算机之间同步相似的文件 A 与 B ,其中对文件 A 拥有访问权,对文件 B 拥有访问权。并且假定主机与之间的网络带宽很小。那么 rsync 算法将通过下面的五个步骤来完成:将文件 B 分割成一组不重叠的固定大小为 S 字节的数据块。最后一块可能会比 S 小。对每一个分割好的数据块执行两种校验:一种是 32 位的滚动弱校验,另一种是 128 位的 MD4 强校验。将这些校验结果发给。通过搜索文件 A 的所有大小为 S 的数据块 ( 偏移量可以任选,不一定非要是 S 的倍数 ) ,来寻找与文件 B 的某一块有着相同的弱校验码和强校验码的数据块。这项工作可以借助滚动校验的特性很快完成。发给一串指令来生成文件 A 在上的备份。这里的每一条指令要么是对文件 B 经拥有某一个数据块而不须重传的证明,要么是一个数据块,这个数据块肯定是没有与文件 B 的任何一个数据块匹配上的。结论:rsync就是会同步我们指定的两端目录之间的数据,这个数据可以是特殊的数据。同步之前就先进行两端的数据的比对,只会同步两者之间不同的部分,并保留文件原本的属性。并且支持匿名的方式进行同步传输。所以rsync在备份,同步上就会较为快速。rsync命令常用选项选项说明-a(重要)包含-rtplgoD选项-r(重要)同步目录时要加上,类似cp命令的-r选项-v(重要)同步时显示一些信息,让我们知道同步的过程-l保留软链接-L同步软链接时会把源文件给同步-p保持文件的权限属性-o保持文件的属主-g保持文件的属组-D保持设备文件信息-t保持文件的时间属性–delete删除DEST中SRC没有的文件–exclude过滤指定文件,如–exclude “logs” 会把文件名包含logs的文件或者目录过滤掉,不同步-p显示同步过程,比如速率,比-v更加详细-u如果DEST中的文件比SRC新,就不会同步-z传输时压缩rsync的简单示例示例1 将目录下1.txt拷贝到本目录下的2.txt在本地里使用rsync就类似于cp命令[root@moli-linux03 rsync_test]# ls1.txt[root@moli-linux03 rsync_test]# rsync -av 1.txt 2.txtsending incremental file list1.txtsent 87 bytes received 35 bytes 244.00 bytes/sectotal size is 0 speedup is 0.00[root@moli-linux03 rsync_test]# ls1.txt 2.txt示例2 把/etc/passwd文件拷贝到远程主机的/tmp目录下,并改名叫1.txtrsync -av /etc/passwd root@192.168.199.7:/tmp/1.txt示例3 通过ssh同步,指定端口号rsync -av -e “ssh -p 22” /etc/passwd 192.168.199.3:/tmp/test示例4 通过服务进行同步(休息一下…) ...

February 3, 2019 · 2 min · jiezi

辟谣网传的删除许多个本地文件,rsync 比 rm 快

这是我的原创的个人心得,若有纰漏,多多指教更多内容可以访问我的博客前言公司有台服务器产生太多临时文件,同事在删除文件的时候,说使用 rsync 会更快一些,使用 rm 可能会把机器搞挂,还引用网上一篇文章说 “rsync所做的系统调用很少:没有针对单个文件做lstat和unlink操作。命令执行前期,rsync开启了一片共享内存,通过mmap方式加载目录信息。只做目录同步,不需要针对单个文件做unlink"我对此抱有好奇与怀疑,在我的Linux知识中,从 Linux 中删除文件,需要是文件的硬连接数n_link归零、进程正在打开该文件的数n_count归零,才可以触发文件系统对 inode 与对应磁盘块的回收,实现删除操作。这是金科玉言,彻底删除文件的系统调用必然用到 unlink 与 close。对于网传的理论,我在互联网上仔细搜索,发现太多转载的雷同的文章,却没有精华文章对上面的话做详细的解释。我决定自己研究下删除大量文件的方法网传这样的方法例如删除某目录下一万个以上小文件,使用 rm * -rf,既有操作上的风险,又耗时。建议使用 rsyncmkdir /tmp/blank_dirrsync –delete-before -a -H -v /tmp/blank_dir/ target_dir先建立空目录,再同步空目录到目标目录注意以上命令中 blank_dir 后带 /rsync 选项说明:–delete-before 接收者在传输之前进行删除操作–progress 在传输时显示传输过程–a 归档模式,表示以递归方式传输文件,并保持所有文件属性–H 保持硬连接的文件–v 详细输出模式–stats 给出某些文件的传输状态为什么删除一万个文件以上, rsync 比 rm 快从根本入手,直接查看系统调用情况,于是动手测试实验环境:Linux Arch 4.19创建一定数量的空白文件,分别使用 rm 与 rsync 删除,并使用 strace -c 统计系统调用,需要额外注意的是 rsync 在本地使用了三个进程(generator, sender, receiver),所以需要 -f 选项告诉 strace 同时跟踪所有fork和vfork出来的进程。(由于 strace 输出的信息太多,为了阅读体验,打印详情在附录)第一次,创建10个文件,分别删除,查看统计输出查看 rm 的系统调用,耗时0.000000,总次数62for i in $(seq 10); do touch tmp_$i;done strace -c rm * -rf查看 rsync 的系统调用,总耗时0.008647,总次数365for i in $(seq 10); do touch tmp_$i;donestrace -c -f rsync –delete -a -H ../blank_dir/ ./因为10个文件的删除,几乎看不到时间,我第二次测试,删除一万个文件,结果:rm 的系统调用,总耗时0.201209,总次数20063rsync 的系统调用,总耗时0.625734,总次数20374从这个结果来看,似乎 rsync 比 rm 要慢,这里有我使用 strace -f 统计 rsync 三个进程总耗时的原因,改用使用 time 命令来计时,删除一万个文件以上,rsync 确实是比 rm 快上一些,那是因为我电脑cpu在三个以上,三个进程的rsync当然快一些我的结论网传的 “删除多个文件,rsync 比 rm 快” 的方法,我认为不一定准确,理由如下:我电脑版本为Linux Arch 4.19,测试中 rm 与 rsync 同样使用了 mmap 的磁盘映射内存的性能优化操作,这个可以在附录中看到。无论是 rm 还是 rsync,都使用了 unlink, unlink 的次数等同文件数量, 这与网传的不符合。可能旧版本 Linux 的 rm 优化做的不好,对目录的文件列表,缺少优化的缓存处理rm 命令一般是单进程的,而 rsync 有三个不同职责的进程(sender, receiver, generator),在多核机器上,rsync 执行效率更高,但是在单核机器可能表现比较低网传的 rsync 删除多文件的效率高是因为“目录同步”,我多加搜索也没有详细说明,认为这是误传。我想,可能是有人对 rsync 的评测不严谨,在本地删除文件时,漏了检查 rsync 的两个进程的系统调用,才导致的以讹传讹。附录第一次,创建10个文件,分别删除,查看统计输出使用 rm :for i in $(seq 10); do touch tmp_$i;done strace -c rm * -rf% time seconds usecs/call calls errors syscall—— ———– ———– ——— ——— —————- 0.00 0.000000 0 4 read 0.00 0.000000 0 6 close 0.00 0.000000 0 3 fstat 0.00 0.000000 0 1 lstat 0.00 0.000000 0 4 1 lseek 0.00 0.000000 0 8 mmap 0.00 0.000000 0 4 mprotect 0.00 0.000000 0 1 munmap 0.00 0.000000 0 3 brk 0.00 0.000000 0 1 ioctl 0.00 0.000000 0 1 1 access 0.00 0.000000 0 1 execve 0.00 0.000000 0 2 1 arch_prctl 0.00 0.000000 0 3 openat 0.00 0.000000 0 10 newfstatat 0.00 0.000000 0 10 unlinkat—— ———– ———– ——— ——— —————-100.00 0.000000 62 3 total使用 rsync, strace 的输出中可以看到 rsync fork 出两个子进程for i in $(seq 10); do touch tmp_$i;done strace -c -f rsync –delete -a -H ../blank_dir/ ./strace: Process 17207 attachedstrace: Process 17208 attached% time seconds usecs/call calls errors syscall—— ———– ———– ——— ——— —————- 61.13 0.005286 587 9 5 wait4 5.39 0.000466 46 10 unlink 3.80 0.000329 9 34 1 select 3.59 0.000310 8 37 mmap 3.27 0.000283 5 51 read 2.88 0.000249 62 4 getdents64 2.68 0.000232 29 8 munmap 2.43 0.000210 5 37 close 2.36 0.000204 8 23 4 openat 2.32 0.000201 10 19 write 2.32 0.000201 14 14 lstat 1.28 0.000111 5 19 fstat 1.14 0.000099 12 8 8 connect 0.83 0.000072 9 8 socket 0.73 0.000063 31 2 utimensat 0.67 0.000058 3 17 fcntl 0.49 0.000042 14 3 socketpair 0.45 0.000039 5 7 lseek 0.40 0.000035 17 2 2 nanosleep 0.38 0.000033 3 11 mprotect 0.37 0.000032 2 12 rt_sigaction 0.24 0.000021 10 2 1 stat 0.23 0.000020 10 2 2 rt_sigreturn 0.22 0.000019 9 2 chdir 0.22 0.000019 9 2 getgroups 0.15 0.000013 6 2 clone 0.00 0.000000 0 6 brk 0.00 0.000000 0 1 rt_sigprocmask 0.00 0.000000 0 1 1 access 0.00 0.000000 0 2 dup2 0.00 0.000000 0 1 getpid 0.00 0.000000 0 1 execve 0.00 0.000000 0 1 kill 0.00 0.000000 0 1 getcwd 0.00 0.000000 0 2 umask 0.00 0.000000 0 1 geteuid 0.00 0.000000 0 1 getegid 0.00 0.000000 0 2 1 arch_prctl—— ———– ———– ——— ——— —————-100.00 0.008647 365 25 total删除 10 个文件,看起来 rsync 的系统调用次数比 rm 要多,我决定加大文件数量测试第二次测试,删除一万个文件for i in $(seq 10000); do touch tmp_$i;done strace -c rm * -rf % time seconds usecs/call calls errors syscall—— ———– ———– ——— ——— —————- 70.08 0.141015 14 10000 unlinkat 29.67 0.059692 5 10000 newfstatat 0.08 0.000158 6 24 brk 0.04 0.000083 10 8 mmap 0.02 0.000048 12 4 mprotect 0.02 0.000036 12 3 openat 0.02 0.000035 5 6 close 0.01 0.000025 6 4 read 0.01 0.000024 24 1 munmap 0.01 0.000023 5 4 1 lseek 0.01 0.000019 6 3 fstat 0.01 0.000013 6 2 1 arch_prctl 0.01 0.000011 11 1 1 access 0.00 0.000010 10 1 execve 0.00 0.000009 9 1 ioctl 0.00 0.000008 8 1 lstat—— ———– ———– ——— ——— —————-100.00 0.201209 20063 3 totalstrace -c -f rsync –delete -a -H ../blank_dir/ ./strace: Process 16414 attachedstrace: Process 16415 attached% time seconds usecs/call calls errors syscall—— ———– ———– ——— ——— —————- 61.75 0.386408 42934 9 5 wait4 19.18 0.120021 12 10000 unlink 15.97 0.099912 9 10004 lstat 2.21 0.013827 1063 13 getdents64 0.14 0.000860 20 41 mmap 0.12 0.000755 32 23 4 openat 0.10 0.000604 11 54 read 0.08 0.000479 12 37 close 0.07 0.000422 35 12 munmap 0.05 0.000338 30 11 mprotect 0.05 0.000284 35 8 8 connect 0.04 0.000251 13 19 fstat 0.04 0.000239 19 12 rt_sigaction 0.04 0.000236 5 40 1 select 0.03 0.000192 24 8 socket 0.03 0.000157 7 22 write 0.02 0.000156 26 6 brk 0.01 0.000084 4 17 fcntl 0.01 0.000079 39 2 utimensat 0.01 0.000078 11 7 lseek 0.01 0.000060 20 3 socketpair 0.01 0.000041 41 1 getcwd 0.01 0.000036 18 2 umask 0.00 0.000027 27 1 rt_sigprocmask 0.00 0.000026 13 2 chdir 0.00 0.000025 25 1 1 access 0.00 0.000022 11 2 1 stat 0.00 0.000022 22 1 geteuid 0.00 0.000021 10 2 1 arch_prctl 0.00 0.000020 20 1 execve 0.00 0.000019 19 1 getegid 0.00 0.000014 7 2 2 nanosleep 0.00 0.000010 5 2 clone 0.00 0.000009 4 2 2 rt_sigreturn 0.00 0.000000 0 2 dup2 0.00 0.000000 0 1 getpid 0.00 0.000000 0 1 kill 0.00 0.000000 0 2 getgroups—— ———– ———– ——— ——— —————-100.00 0.625734 20374 25 total ...

January 31, 2019 · 5 min · jiezi

跨平台的fswatch+rsync同步备份

rsync是非常好用,但是只是极好的cp而已。如果要监控本地某些文件变化,自动上传,还需要配合其它监控工具。一般都叫watch, notify什么的。最有名的是inotify。但是inotify是linux内核的东西,没法在Mac上运行。Mac上的替代方案是fswatch,而且可以跨平台运行(但是目前发现只有mac支持的最好)。fswatch意料之外的简单好用,不需要配置文件,不需要复杂的参数,几分钟的学习就能完成一个真正可行的自动备份脚本,实际上作为“替代品”,远比inotify等要好用很多。在其Github官方说明上,也例数了当前最常用的各种inotify、kqueue等的缺点。参考GIthub官方网址:https://github.com/emcrisosto…安装 (Mac):$ brew install fswatch使用,先直接输入命令试试:# 开始监控(进入block堵塞模式,动态输出变动)# 假设监控/tmp文件夹fswatch -0 /tmp | while read -d "" event; do echo “This file ${event} has changed.“done然后随意往/tmp文件夹创建个文件什么的: touch /tmp/000000.txt这时候,刚才正在监控的shell,就会立马显示出新创建的文件名/tmp/000000.txt利用fswatch+rsync备份假如要监控/path/to/source/文件夹,那么就:fswatch $1 | while read -d "” event; do rsync -rauv –delete –progress /path/to/source/ /path/to/target/done但是fswatch默认会进入堵塞模式,也就是一直挂在shell中。如果我们让它后台运行,只需要在done后加一个&,转入后台运行即可。多路径备份虽然fswatch能够同时监控多个目录:如fswatch [options] … path-0 … path-n,但是一般我们是针对每个不同的文件夹做不同的事。所以,最简单最方便的方法,就是同时运行多个fswatch 。但是默认一个fswatch就进入堵塞模式,所以必须每次结束后转入后台,如done &。直接创建一个脚本rsync.sh,输入代码如下:# 任务1fswatch $1 | while read -d "” event; do rsync -rauv –delete –progress /path/to/source1/ /path/to/target1/done &# 任务2fswatch $1 | while read -d "" event; do rsync -rauv –delete –progress /path/to/source2/ /path/to/target2/done &这样一来,我们不需要利用crontab来定时执行了。取而代之的是fswatch每次监控到变化就自动执行其中的语句。至于fswatch的实现原理,这要涉及到Kernel内核的多任务运行机制。比如cron job是采用定期循环式运行一个任务,但是fswatch是采用消息通知式,有变化才运行任务。要了解更多原理,就去查epoll和异步IO等相关话题。这里,只知道怎么用就好了。 ...

January 25, 2019 · 1 min · jiezi

LNMP+HAProxy+Keepalived负载均衡(五)- 通过rsyncd实现文件的相互同步

上接前文,前文提到web服务器附件不同步的问题,这里补上文件同步的配置。安装同步软件# 安装同步服务所需的软件yum -y install rsync配置密码本mkdir -p /etc/rsyncfg/# 注意:下面的两个SyncPwd必须一致echo ‘SyncName:SyncPwd’ > /etc/rsyncfg/server.pwdecho ‘SyncPwd’ > /etc/rsyncfg/client.pwd# 密码文件配置权限chmod 600 /etc/rsyncfg/server.pwdchmod 600 /etc/rsyncfg/client.pwd配置防火墙端口# 开启防火墙端口firewall-cmd –zone=public –add-port=873/tcp –permanentfirewall-cmd –reload配置同步软件# 编辑配置文件vim /etc/rsyncd.conf# 配置文件内容uid = rootgid = rootuse chroot = yesmax connections = 4exclude = lost+found/transfer logging = yestimeout = 900ignore nonreadable = yesdont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2[uploads]path = /home/wwwroot/PublishPath/uploadscomment = Host:192.168.6.100 uploads filesignore errorsread only = yeswrite only = nolist = noauth users = syncersecrets file = /etc/rsyncfg/server.pwdhosts allow = 192.168.6.110重启服务service rsyncd restart && service rsyncd status执行同步操作echo ’’ > /etc/rsyncfg/sync.logecho ‘rsync -auv –password-file=/etc/rsyncfg/client.pwd SyncName@192.168.6.100::uploads /home/wwwroot/PublishPath/uploads/’ > /etc/rsyncfg/sync.shchmod +x /etc/rsyncfg/sync.shcp /etc/rsyncfg/sync.sh /usr/sbin/配置计划任务crontab -e# 添加任务# * * * * * /etc/rsyncfg/sync.sh # 取消前面的注释即可# 重启定时任务服务service crond restart && service crond status问题汇总ERROR: auth failed on module XXX@ERROR: auth failed on module XXXrsync error: error starting client-server protocol (code 5) at main.c(xxx) [Receiver=x.x.x]1、密码输入错误:请再次确认你登录用户的密码无误2、secrets file格式错误:secrets file的文件格式是 upload:123456表示upload用户的rsync密码是1234563、配置文件写错:最坑爹的一个,看看自己模块配置下面的auth users、secrets file有没写错4、secrets file权限问题服务端的secrets file权限必须是600,可以使用chmod 600 /home/user/test/rsync/etc/test.pass5、secrets file文件拥有者与rsync运行者服务端rsync服务是以什么用户运行,则必须保证secrets file文件拥有者必须是同一个假设root运行rsync –daemon,则secrets file的owner也必须是root6、如果是以–password-file=file的方式附带密码确保客户端密码文件格式无误,与服务端的密码文件不同,客户端的不用加上用户名,即直接是 123456rsync: failed to connect to X.X.X.X Connection timed out (110)rsync: failed to connect to 192.168.6.100 (192.168.6.100): Connection timed out (110)rsync error: error in socket IO (code 10) at clientserver.c(125) [Receiver=3.1.2]端口不通,开启防火墙的873端口:firewall-cmd –zone=public –add-port=873/tcp –permanentfirewall-cmd –reloadERROR: password file must not be other-accessibleERROR: password file must not be other-accessiblersync error: syntax or usage error (code 1) at authenticate.c(196) [Receiver=3.1.2]密码本权限不对:chmod 600 /etc/rsyncfg/server.pwdchmod 600 /etc/rsyncfg/client.pwd ...

January 14, 2019 · 1 min · jiezi

lsyncd —— 多机器实时同步文件神器

lsyncd 是一个支持实时、双向、多机器的多模式文件同步工具。使用 Lua 语言封装了 inotify 和 rsync 工具,采用了 Linux 内核(2.6.13 及以后)里的 inotify 触发机制,然后通过 rsync 去差异同步,达到实时的效果。安装在源文件服务器上安装:yum -y install lsyncd配置lsyncd 主配置文件,假设放置在/etc/lsyncd.conf:settings { nodaemon = false, logfile = “/var/log/lsyncd.log”, statusFile = “/var/log/lsyncd.status”, inotifyMode = “CloseWrite”, maxProcesses = 8}– 可以有多个sync,各自的source,各自的target,各自的模式,互不影响。sync { default.rsyncssh, source = “/home/wwwroot/web1/”, host = “111.222.333.444”, targetdir = “/home/wwwroot/web1/”, – 忽略文件路径规则,可用table也可用外部配置文件 – excludeFrom = “/etc/lsyncd_exclude.lst”, exclude = { “.svn”, “Runtime/”, “Uploads/”, }, – maxDelays = 5, delay = 0, – init = false, rsync = { binary = “/usr/bin/rsync”, archive = true, compress = true, verbose = true, _extra = {"–bwlimit=2000"}, },}忽略规则需要忽略同步的文件或文件夹,excludeFrom 选项才配置该文件,exclude 类型的配置不用该配置文件。假设配置文件放在/etc/lsyncd_exclude.lst。.svnRuntime/**Uploads/**免密登录为避免每次都需要手动输入密码,可设置为 SSH 免密登录。启动lsyncd -log Exec /etc/lsyncd.conf参考官方 Wikilsyncd实时同步搭建指南——取代rsync+inotify原文地址: https://shockerli.net/post/li… ...

December 13, 2018 · 1 min · jiezi