服务器静态资源的处理 unison+inotify双向同步
unison双向同步工具命令行使用说明

unison双向同步工具命令行使用说明Unison 是一个文件同步工具,采用rsync 类似的算法,但是提高了一步,双向同步以及一个统一的版本控制系统。
1. unison 命令行可以用如下格式调用unisonunison profile_name [options]读取~/.unison 目录下的配置文件"profile_name.prf"。
注意到命令行没有指出要进行文件同步的两个地址,实际上应该在配置文件<profile_name.prf> 中有相关的root 指令进行了设置。
如:less..# Roots of the synchronizationroot = /home/bcpierceroot = ssh://saul//home/bcpierce# Paths to synchronizepath = currentpath = commonpath = .netscape/bookmarks.htmlunison profile root1 root2 [options]root1, root2 分别是要执行同步的两个路径。
这时"profile.prf" 配置文件中,应该不包含root 设置;root1, root2 路径的格式可以是本地目录,也可以是远程服务器的路径,例如:ssh://username@remotehost//home/jiangxin/workunison root1 root2 [options]相当于unison default root1 root2。
即读取"default.prf" 的配置。
2. 常用参数-testserver测试连通性,连接到服务器即退出。
示例:$ unison / ssh://opensou1@bluehost/-servercmd=~/bin/unison -testserver如果服务器端unison 可执行文件不在默认目录下,甚至没有unison 命令(需要你编译一个上传到服务器),则需要使用-servercmd参数告诉要执行的服务器unison 命令位置。
inotify+rsync实现实时同步的方法

inotify+rsync实现实时同步的⽅法1.1 什么是实时同步:如何实现实时同步要利⽤监控服务(inotify),监控同步数据服务器⽬录中信息的变化发现⽬录中数据产⽣变化,就利⽤rsync服务推送到备份服务器上1.2 实现实时同步的⽅法inotify+rsync ⽅式实现数据同步sersync ⽅式实现实时数据同步详情参照:1.2.1 实时同步原理介绍1.3 inotify+rsync ⽅式实现数据同步1.3.1 Inotify简介Inotify是⼀种强⼤的,细粒度的。
异步的⽂件系统事件监控机制,linux内核从2.6.13起,加⼊了 Inotify⽀持,通过Inotify可以监控⽂件系统中添加、删除,修改、移动等各种事件,利⽤这个内核接⼝,第三⽅软件就可以监控⽂件系统下⽂件的各种变化情况,⽽ inotify-tools 正是实施这样监控的软件。
国⼈周洋在⾦⼭公司也开发了类似的实时同步软件sersync。
提⽰信息:sersync软件实际上就是在 inotify软件基础上进⾏开发的,功能要更加强⼤些,多了定时重传机制,过滤机制了提供接⼝做CDN,⽀持多线程橾作。
Inotify实际是⼀种事件驱动机制,它为应⽤程序监控⽂件系统事件提供了实时响应事件的机制,⽽⽆须通过诸如cron等的轮询机制来获取事件。
cron等机制不仅⽆法做到实时性,⽽且消耗⼤量系统资源。
相⽐之下,inotify基于事件驱动,可以做到对事件处理的实时响应,也没有轮询造成的系统资源消耗,是⾮常⾃然的事件通知接⼝,也与⾃然世界事件机制相符合。
inotify的实现有⼏款软件:inotify-tools,sersync,lrsyncd1.3.2 inotify+rsync使⽤⽅式inotify 对同步数据⽬录信息的监控rsync 完成对数据信息的实时同步利⽤脚本进⾏结合1.4 部署inotify软件的前提需要2.6.13以后内核版本才能⽀持inotify软件。
inotify+rsync实时数据同步配置

1服务器部署准备2模拟环境2.1 rsync服务器端操作系统及内核版本信息[root@NFS-server ~]# cat /etc/redhat-releaseCentOS release 6.6 (Final)[root@NFS-server ~]# uname -r2.6.32-504.el6.x86_64[root@NFS-server ~]# uname -mx86_642.2 web客户端操作系统及内核版本信息[root@lamp01 ~]# cat /etc/redhat-releaseCentOS release 6.6 (Final)[root@lamp01 ~]# uname -r2.6.32-504.el6.x86_64[root@lamp01 ~]# uname -mx86_643 在rsync数据备份服务器上安装inotify工具[root@NFS-server ~]# wget /downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz#下载inotify 工具[root@NFS-server ~]# tar zxf inotify-tools-3.14.tar.gz #解压到当前目录下[root@NFS-server ~]# cd inotify-tools-3.14 #切进inotify-tools-3.14目录下[root@NFS-server inotify-tools-3.14]# ./configure --prefix=/usr/local/inotify-tools-3.14#编译安装到/usr/local/inotify-tools-3.14目录下[root@NFS-server inotify-tools-3.14]# make && make install #安装[root@NFS-server ~]# ln -s /usr/local/inotify-tools-3.14/ /usr/local/inotify-tools #创建软链接[root@NFS-server ~]# cd /usr/local/inotify-tools #切到软链接安装的目录[root@NFS-server inotify-tools]# ll #查看。
大量小文件的实时同步方案

⼤量⼩⽂件的实时同步⽅案传统的⽂件同步⽅案有rsync(单向) 和 unison(双向)等,它们需要扫描所有⽂件后进⾏⽐对,差量传输。
如果⽂件数量达到了百万甚⾄千万量级,扫描所有⽂件将⾮常耗时。
⽽且正在发⽣变化的往往是其中很少的⼀部分,这是⾮常低效的⽅式。
之前看了,它们每个节点的数据是通过Hash Tree来实现同步,既有通过⽇志来同步的软实时特点(msyql, bdb等),也可以保证最终数据的⼀致性(rsync, unison等)。
Hash Tree的⼤体思路是将所有数据存储成树状结构,每个节点的Hash是其所有⼦节点的Hash的Hash,叶⼦节点的Hash是其内容的Hash。
这样⼀旦某个节点发⽣变化,其Hash的变化会迅速传播到根节点。
需要同步的系统只需要不断查询跟节点的hash,⼀旦有变化,顺着树状结构就能够在logN级别的时间找到发⽣变化的内容,马上同步。
⽂件系统天然的是树状结构,尽管不是平衡的数。
如果⽂件的修改时间是可靠的,可以表征⽂件的变化,那就可以⽤它作为⽂件的Hash 值。
另⼀⽅⾯,⽂件的修改通常是按顺序执⾏的,后修改的⽂件⽐早修改的⽂件具有更⼤的修改时间,这样就可以把⼀个⽬录内的最⼤修改时间作为它的修改时间,以实现Hash Tree。
这样,⼀旦某个⽂件被修改,修改时间的信息就会迅速传播到根⽬录。
⼀般的⽂件系统都不是这样做的,⽬录的修改时间表⽰的是⽬录结构最后发⽣变化的时间,不包括⼦⽬录,否则会不堪重负。
因为我们需要⾃⼰实现这个功能,利⽤Linux 2.6内核的新特性inotify获得某个⽬录内⽂件发⽣变化的信息,并把其修改时间传播到它的上级⽬录(以及再上级⽬录)。
Python 有,watch.py的代码如下:1. #!/usr/bin/python2.3. from pyinotify import *4. import os, os.path5.6. flags = IN_CLOSE_WRITE|IN_CREATE|IN_Q_OVERFLOW7. dirs = {}8. base = '/log/lighttpd/cache/images/icon/u241'9. base = 'tmp'10.11. class UpdateParentDir(ProcessEvent):12. def process_IN_CLOSE_WRITE(self, event):13. print 'modify', event.pathname14. mtime = os.path.getmtime(event.pathname)15. p = event.path16. while p.startswith(base):17. m = os.path.getmtime(p)18. if m < mtime:19. print 'update', p20. os.utime(p, (mtime,mtime))21. elif m > mtime:22. mtime = m23. p = os.path.dirname(p)24.25. process_IN_MODIFY = process_IN_CLOSE_WRITE26.27. def process_IN_Q_OVERFLOW(self, event):28. print 'over flow'29. max_queued_events.value *= 230.31. def process_default(self, event):32. pass33.34. wm = WatchManager()35. notifier = Notifier(wm, UpdateParentDir())36. dirs.update(wm.add_watch(base, flags, rec=True, auto_add=True))37.38. notifier.loop()在已经有Hash Tree的时候,同步就⽐较简单了,不停地获取根⽬录的修改时间并顺着⽬录结构往下找即可。
Linux命令行中的文件同步和数据迁移技巧

Linux命令行中的文件同步和数据迁移技巧在Linux命令行中,文件同步和数据迁移是一项非常常见且重要的操作。
无论是跨服务器迁移数据还是在本地进行文件同步,掌握一些文件同步和数据迁移技巧可以帮助高效完成任务。
本文将介绍一些常用的Linux命令和工具,帮助您掌握文件同步和数据迁移的技巧。
1. 常用的文件同步命令1.1. rsync命令rsync是一种功能强大的文件同步和备份工具,可以在本地或网络上同步文件和目录。
其基本的命令格式如下:```shellrsync [option] source destination```其中,source表示源文件或源目录,destination表示目标文件或目标目录。
rsync命令的一些常用选项包括:- `-a`:归档模式,同步并保持文件属性、权限等信息。
- `-v`:显示详细输出。
- `-z`:启用压缩传输,减少数据传输量。
- `-r`:递归同步子目录。
- `-u`:仅同步更新的文件。
例如,将本地目录/tmp/myfiles同步到远程服务器的/home/user目录下,可以使用以下命令:```shellrsync -avz /tmp/myfiles user@remote:/home/user```1.2. scp命令scp是secure copy的缩写,是一个在本地和远程系统之间进行文件拷贝的命令行工具。
其基本的命令格式如下:```shellscp [option] source destination```其中,source表示源文件或源目录,destination表示目标文件或目标目录。
scp命令的一些常用选项包括:- `-r`:递归拷贝目录。
- `-P`:指定端口号。
- `-i`:指定密钥文件。
- `-v`:显示详细输出。
例如,将本地目录/tmp/myfiles拷贝到远程服务器的/home/user目录下,可以使用以下命令:```shellscp -r /tmp/myfiles user@remote:/home/user```2. 实现文件同步的工具2.1. lsyncdlsyncd是一种基于rsync的实时文件同步工具,能够实时监测文件变化并同步更新到指定目录。
如何在Shell脚本中实现文件同步

如何在Shell脚本中实现文件同步Shell脚本是一种在Unix操作系统中使用的脚本语言,可用于自动化任务和进行系统管理。
文件同步是一种将文件从一个位置复制到另一个位置的过程。
在Shell脚本中,我们可以使用一些命令和技术来实现文件同步的功能。
本文将介绍如何在Shell脚本中实现文件同步,包括使用rsync命令、使用scp命令以及使用inotify工具。
一、使用rsync命令实现文件同步rsync是一个强大的文件同步和备份工具,它能够快速、安全地将文件从一个位置复制到另一个位置。
我们可以通过在Shell脚本中使用rsync命令来实现文件同步。
以下是一个使用rsync命令实现文件同步的示例脚本:```#!/bin/bashSOURCE_DIR="/path/to/source"DEST_DIR="/path/to/destination"rsync -av --delete $SOURCE_DIR/ $DEST_DIR/```在这个脚本中,我们指定了源目录和目标目录的路径。
通过`rsync -av --delete $SOURCE_DIR/ $DEST_DIR/`命令,我们可以将源目录下的文件和文件夹同步到目标目录,并且删除目标目录中不存在于源目录中的文件和文件夹。
二、使用scp命令实现文件同步scp命令用于在本地系统和远程系统之间进行文件传输。
我们可以通过在Shell脚本中使用scp命令来实现文件同步。
以下是一个使用scp命令实现文件同步的示例脚本:```#!/bin/bashSOURCE_FILE="/path/to/source/file"DEST_HOST="user@remotehost"DEST_DIR="/path/to/destination"scp $SOURCE_FILE $DEST_HOST:$DEST_DIR```在这个脚本中,我们指定了源文件的路径、目标主机和目标目录的路径。
实现 双向实时远程同步文件(inotify rsync与nfs)配置过程

实现双向实时远程同步文件(inotify rsync与nfs)配置过程项目中碰到两台机子上文件需要实时同步的状况,尝试了下面两种办法:项目要求:A机(190)与B机(217)要求一个文件夹内容同对方全都,A 机与B机都有可能单独接收到文件从而同步到对方。
办法一、用法rsy-server与inotify协作同步文件 1、r-server配置(217) vi /etc/xinetd.d/rsync default: off allows crc checkmming etc.service rsync disable = no socket_type = seam wait = no user = root server = /usr/bin/rsync server_args = --daemonlog_on_failure = USERID } 2、指定文件位置 vi /etc/rsyn.conf u = root gid = root use chroot = yes max connections = 4 strict modes = yes syslog facility = local5 port = 873 [backup] path = /home/rsync/test/ ##要同步的文件夹 comment = This is a test ignore errors read only = no ##写权限 list = yes auth users = rsync secrets = /etc/rsync.pas ##验证文件,对方机子也要存在这个文件 hosts allow = 192.168.1.190 ##客户端IP 3、创建rsync.pas vi /etc/rsync.pas sync:test 4、客户端同步脚本(190)#vi inotify_rsync.sh !/bin/bash SRC=/home/rsync/test/DST=rsync@192.168.1.217::backup /usr/bin/inotifywait -mrq -e modify,delete,create,attrib ${SRC} | while read D E F/usr/bin/rsync -ahqzt --progress --delete--password-file=/etc/rsync.pas $SRC $DST done 5、设置脚本开机自启动 /root/inotify_rsync.sh /etc/rc.local 6、双向同步的实现及存在问题以上只是实现A机(190)同步到B机(217)的操作,把配置改一下在A机(190)上建立rsync服务器,即可实现双向同步,但不能执行删除操作,由于它们并没有办法推断以谁的操作为主,会造成新建文件被删除。
双向数据同步方法及系统与制作流程

双向数据同步方法及系统与制作流程一、双向数据同步的方法1.数据库复制:通过在源数据库和目标数据库之间建立复制链路,将数据在不同数据库之间进行同步。
常用的数据库复制方法有基于日志的复制、基于时间戳的复制等。
2. ETL工具:ETL(Extract-Transform-Load)工具用于将数据从一个系统提取出来,经过转换和加工后加载到目标系统中。
ETL工具可以实现多系统之间的数据同步和转换。
3. 数据接口对接:通过定义数据接口,实现多个系统之间的数据交互。
可以使用Web API、SOAP等不同的接口标准,通过接口调用实现数据的双向同步。
4. 消息队列:消息队列是一种异步通信机制,可以将数据发送到队列中,再通过队列实现数据在系统之间的同步。
消息队列常用的实现方式有ActiveMQ、RabbitMQ等。
5.事件驱动架构:通过定义事件和订阅者,实现系统之间的事件通知和数据同步。
当一个系统发生变化时,会发送对应的事件通知给订阅者,订阅者可以根据事件进行相应的处理。
二、双向数据同步的系统制作流程1.确定需求:首先需要明确双向数据同步的需求,包括需要同步的数据内容、同步的频率、同步的方式等。
根据需求确定系统的功能和架构设计。
2.数据源接入:将需要同步的数据源接入到系统中,包括源数据库、接口对接等。
需要根据不同的数据源选择合适的接入方式和工具。
3.数据同步逻辑设计:根据需求和系统架构设计数据同步的逻辑,包括数据转换、数据校验、数据更新等。
需要考虑数据的一致性和完整性。
4.开发和实施:根据逻辑设计进行系统的开发和实施,包括编码、配置、测试等。
需要根据实际情况进行系统调优和性能优化。
5.监测和维护:系统上线后需要进行监测和维护,包括监控系统的运行状态、处理异常情况、数据同步的效果评估等。
如果有需要,可以进行系统的优化和升级。
6.安全保护:数据同步过程中需要考虑数据的安全保护,包括数据加密、权限控制等。
需要制定相应的安全策略和措施。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
服务器静态资源的处理unison+inotify双向同步目录1 部署环境 (1)1.1 服务器IP (1)1.2 编译环境 (1)2 编译安装 (2)2.1 编译安装ocaml (2)2.2 编译安装Unison (2)3 配置ssh key信任 (3)3.1 确认系统已经安装好OpenSSH的server 和client (3)3.2 确认本机sshd的配置文件(需要root权限) (3)3.3 如果修改了配置文件需要重启sshd服务 (需要root权限) (3)3.4 ssh登陆系统后执行测试命令: (3)3.5 生成证书公私钥的步骤: (3)3.6 测试登陆ssh localhost: (4)4 生成unison目录和文件 (4)4.1 在用户目录下使用unison指令 (4)4.2 修改unison配置文件 (4)4.3 测试是否工作正常 (6)5 自动化整个过程 (6)5.1 inotify工具安装: (6)5.2 编写脚本 (7)1部署环境1.1服务器IP192.168.11.11 vm1192.168.11.12 vm21.2编译环境yum install ctags-etags2编译安装2.1编译安装ocaml可以yum install -y ocaml[root@vm1 ~]# tar -xzvf ocaml-3.12.1.tar.gz[root@vm1 ~]# cd ocaml-3.12.1[root@vm1 ~]# more INSTALL[root@vm1 ocaml-3.12.1]# ./configure[root@vm1 ocaml-3.12.1]# make world.opt[root@vm1 ocaml-3.12.1]# make install2.2编译安装Unison[root@vm1 ~]# tar -xzvf unison-2.48.4.tar.gz[root@vm1 ~]# cd src[root@vm1 unison-2.40.63]# make UISTYLE=text[root@vm1 unison-2.40.63]# make install在执行make install的过程中,可能会出现以下错误提示:mv: cannot stat '/root/bin//unison': No such file ordirectorymake: [doinstall] Error 1 (ignored)cp unison /root/bin/cp: cannot create regular file '/root/bin/': Is a directorymake: *** [doinstall] Error 1出现错误的原因在与Unison默认是将文件Copy到/root/bin目录,但Linux默认是没有该目录的,因此我们需要将生成的可执行文件unison复制到系统的PATH目录。
[root@vm1 unison-2.40.63]# cp unison /usr/local/bin将可执行文件unison上传到远程主机192.168.11.12[root@vm1 unison-2.40.63]# scp unisonroot@192.168.11.12:/root/通过SSH登陆到远程主机,再将unison复制到vm2的PATH目录[root@vm2 ~]#cp unison /usr/local/bin3必须重命名主机vi /etc/sysconfig/networkHOSTNAME=localhost.localdomain #修改localhost.localdomain为orcl14配置ssh key信任4.1确认系统已经安装好OpenSSH的server 和client安装步骤这里不再讲述,不是本文的重点。
4.2确认本机sshd的配置文件(需要root权限)$ vi /etc/ssh/sshd_config找到以下内容,并去掉注释符”#“RSAAuthentication yesPubkeyAuthentication yesAuthorizedKeysFile .ssh/authorized_keys4.3如果修改了配置文件需要重启sshd服务 (需要root权限)$ /sbin/service sshd restart4.4ssh登陆系统后执行测试命令:$ ssh localhost回车会提示你输入密码,因为此时我们还没有生成证书4.5生成证书公私钥的步骤:$ cd /$ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys$chmod 600 ~/.ssh/authorized_keys4.6Ssh默认已经安装啦,需要保存密钥复制/root/.ssh/id_dsa.pub中的密钥到彼此的/root/.ssh/authorized_keys 4.7测试登陆ssh localhost:$ ssh localhost正常情况下会登陆成功,显示一些成功登陆信息用公钥登陆其他主机,需要将本地的id_dsa.pub 追加到目标机的authorized_keys,请自行配置。
ssh 192.168.111.134Exit 退出5生成unison目录和文件5.1在用户目录下使用unison指令[root@vm1 ~]# unison /data/corp/ ssh://root@192.168.11.12//data/corp/[root@vm2 ~]# unison /data/corp/ ssh://root@192.168.11.11//data/corp/说明:将本机的目录/data/corp和远端主机的/data/corp/进行同步。
一般的,需要两台机能ssh连接。
注意在主机和目录间又多加了一个"/"5.2修改unison配置文件[unison@vm1 ~]$ vim /root/.unison/default.prfroot = /data/corproot = ssh://root@192.168.11.12//data/corp/batch = trueowner = truegroup = trueperms = -1fastcheck = falsersync = falsesshargs = -Cxferbycopying = truelog = truelogfile = /root/.unison/unison.log[unison@vm2 ~]$ vim /root/.unison/default.prfroot = /data/corproot = ssh://root@192.168.11.11//data/corp/batch = trueowner = truegroup = trueperms = -1fastcheck = falsersync = falsesshargs = -Cxferbycopying = truelog = truelogfile = /root/.unison/unison.log相关注解如下:force表示会以本地所指定文件夹为标准,将该目录同步到远端。
这里需要注意,如果指定了force参数,那么Unison就变成了单项同步了,也就是说会以force指定的文件夹为准进行同步,类似与rsync。
Unison双向同步基本原理是:假如有A B两个文件夹,A文件夹把自己的改动同步到B,B 文件夹也把自己的改动同步到A,最后AB两文件夹的内容相同,是AB文件夹的合集。
Unison双向同步的一个缺点是,对于一个文件在两个同步文件夹中都被修改时,unison是不会去同步的,因为unison无法判断以那个为准。
ignore = Path表示忽略指定目录,即同步时不同步它。
batch = true,表示全自动模式,接受缺省动作,并执行。
-fastcheck true表示同步时仅通过文件的创建时间来比较,如果选项为false,Unison则将比较两地文件的内容。
log = true 表示在终端输出运行信息。
logfile 指定输出的log文件。
另外,Unison有很多参数,这里仅介绍常用的几个,详细的请参看Unison手册。
-auto //接受缺省的动作,然后等待用户确认是否执行。
-batch //batch mode, 全自动模式,接受缺省动作,并执行。
-ignore xxx //增加xxx 到忽略列表中-ignorecase [true|false|default] //是否忽略文件名大小写-follow xxx //是否支持对符号连接指向内容的同步owner = true //保持同步过来的文件属主group = true //保持同步过来的文件组信息perms = -1 //保持同步过来的文件读写权限repeat = 1 //间隔1秒后,开始新的一次同步检查retry = 3 //失败重试sshargs = -C //使用ssh的压缩传输方式xferbycopying = true"-immutable xxx //不变目录,扫描时可以忽略-silent //安静模式-times //同步修改时间-path xxx 参数//只同步-path 参数指定的子目录以及文件,而非整个目录,-path 可以多次出现。
需要注意的是如果要保持文件的源权限,需要使用chown可以修改的用户同步。
5.3测试是否工作正常[root@vm2 ~]# cd /data/corp;touch monkey.txt[root@vm1 ~]# cd /data/corp;unison ;cd /data/corp/;ls可能出现的问题是在unison同步的时候,如果提示输入密码,需要做信任关系,如果是权限不对,注意用户的权限,还有是lock文件可以删除.unison/ara1da075598bd182a68b3563be920002b类似文件,再重新执行unison6自动化整个过程当目录下有改变发生时自动执行unison同步,●通知配置文件的改变●跟踪某些关键的系统文件的变化●监控某个分区磁盘的整体使用情况●系统崩溃时进行自动清理●自动触发备份进程●向服务器上传文件结束时发出通知●以上为inotify截取。
6.1inotify工具安装:tar -zxvf inotify-tools-3.14.tar.gzcd inotify-tools-3.14./configuremake && make install安装完成执行下inotifywait提示No files specified to watch!就ok了6.2编写脚本#!/bin/bashssh root@192.168.11.12 'cd /root;unison'echo "`date `sync successful">>/root/script/ftp_static_sync.log/usr/local/bin/inotifywait -mrq -e create,delete,modify,move /data/corp/|while read linedossh root@192.168.11.12 'cd /root;unison'echo "`date `sync successful">>/root/script/ftp_static_sync.logdone当/data/corp目录下的文件发生create,delete,modify,move操作时会执行while内语句。