Skip to content

{ Monthly Archives } 四月 2009

Lucene 索引滚动流程设计

Lucene 索引滚动流程设计 TangFulin <tangfulin@gmail.com> 一. Index Writer: 1. 这里的 Writer 包括 Index Updater 和 Index Rebuilder ,但 Rebuilder 产生的索引文件不直接传送给 Searcher 使用, 而是覆盖 Updater 的索引,由 Updater 统一处理后续的流程 2. IndexUpdaterScheduler 每隔一段时间会设置 copy out timer 标识。 3. Updater 每次处理完一批 xml 文件后会查看 copy out timer 标识是否已经被设置, 如果是,则将当前的索引拷贝一份到 src-snap 目录下 yyyyMMddHHmm 格式的子目录中 4. Updater 为单线程,每次处理完一批 xml 后都会调用 optimizeAndCloseIdx ,所以可以保证 idx [...]

强大的bash

假设我们定义了一个变量为: file=/dir1/dir2/dir3/my.file.txt 我们可以用 ${ } 分别替换获得不同的值: ${file#*/}:拿掉第一条 / 及其左边的字串:dir1/dir2/dir3/my.file.txt ${file##*/}:拿掉最后一条 / 及其左边的字串:my.file.txt ${file#*.}:拿掉第一个 . 及其左边的字串:file.txt ${file##*.}:拿掉最后一个 . 及其左边的字串:txt ${file%/*}:拿掉最后一条 / 及其右边的字串:/dir1/dir2/dir3 ${file%/*}:拿掉第一条 / 及其右边的字串:(空值) ${file%.*}:拿掉最后一个 . 及其右边的字串:/dir1/dir2/dir3/my.file ${file%%.*}:拿掉第一个 . 及其右边的字串:/dir1/dir2/dir3/my 记忆的方法为: # 是去掉左边(在键盘上 # 在 $ 之左边) % 是去掉右边(在键盘上 % 在 $ 之右边) 单一符号是最小匹配;两个符号是最大匹配。 还可以按下标取指定长度的子串: ${file:0:5}:提取最左边的 5 个字?:/dir1 ${file:5:5}:提取第 5 个字右边的连续 5 个字:/dir2 我们也可以对变量值里的字串作替换: ${file/dir/path}:将第一个 [...]

Rsync 的算法

RSync 算法是澳大利亚人 Andrew Tridgell (samba的作者)发明的,按照 Andrew Tridgell 自己的话,这个算法只需要半个小时就能够理解,但是花费了他几年时间才研究出来。 Rsync 算法大概原理:(目标:把 HostA 上的FileNew 同步到 HostB 上 FileOld) 1) Host-B把File-Old划分成不重合的大小为K字节的若干块,不足K字节的结尾部分加上Padding,然后对每一块求弱Hash和强Hash。弱Hash就是说很有可能两个不同的块Hash值相同,但是计算起来快,而且这里要求这个弱Hash能够Rolling,也就是说已知字节1到字节K这个块的Hash值,能够很快的计算出字节2到字节K+1这个块的Hash值,往前Roll一个字节,计算很快;强Hash就是可以认为不同块肯定有不同 Hash值,Rsync用的是MD4。我们让WH表示弱Hash,SH表示强Hash。 2) Host-B把每个块的WH和SH值发送给Host-A。 3) 该Host-A上场了,他的运算量比较大。Host-A对File-New每一个长度为K的块(也就是以每个字节开头的长度为K的块)计算WH,计算出来之后和Host-B发送过来的WH匹配,如果发现有相同的,再计算这个块的SH进行匹配,如果还是相符,说明这个块在File-Old里面也存在。假如 File-New长度为N,那么Host-A要处理大约(N-K)个块,这里可见用两个Hash算法的作用,WH用来做初步比较,而且因为它可以 Rolling,所以能够很快筛选掉大多数不匹配,对于漏网之鱼,也躲不过SH的筛选。 4) 通过上面的计算,Host-A可知道,File-New中哪些块和File-Old中的块相同,这样自然也可以计算出哪些不同,Host-A把这些不同encode一下送给Host-B。 5) Host-B收到Host-A送来的数据,decode,就得到了File-New相对于File-Old的改变,于是获得了File-New。 整个过程只需要一个round-trip(一个来回的通信),而且可以精确的得到一个字节级别的差别,Host-A的运算量相对要大一些。 Rsync的实现已经是*inx上面的一个重要工具,所以,当Microsoft在Windows 2003 Server上推出DFSR(Distributed File System Replication)时,Open Source Community颇有嘘声。其实DFSR采用的是RDC(Remote Differential Compression)算法,和RSync相差很大,并没有抄袭RSync。 RSync有学院气息(这个算法本来就是Andrew Tridgell的博士论文),结果很完美,File-New和File-Old每一个字节的差别都计算出来了,但是Host-A和Host-B的计算量不对等,大部分的计算都集中在Host-A上。RDC和RSync相比方向上有点不同,RDC并不追求计算出字节级别的diff,而是用较少的运算求出数据块级别的 diff。 RDC算法要求Host-A和Host-B通过一致的规则对File-New和File-Old分别进行分块,然后对每个块计算 SH,Host-B把每个块的SH值发给Host-A,Host-A对两组SH进行diff,就可以知道有哪些块不同,哪些块被删掉了,哪些块被添加了。 RDC的关键在于分块规则,也使用WH,要让同一规则应用于File-Old和File-New的时候,分出来的块能够尽量体现出区别。 比如File-Old包含“I Love Playing Basketball”, File-New是“I Like Playing Football”。 如果是RSync算法,Host-A能够计算出准确的差别,“I [...]

lucene 2.4.1 重建索引测试

机器配置: uname -a : Linux eshequn-SV06-A11 2.6.21.5-smp #1 SMP Sun Jan 27 23:51:02 CST 2008 i686 Intel(R) Xeon(TM) CPU 3.06GHz GenuineIntel GNU/Linux cpuinfo: processor        : 2 model name    : Intel(R) Xeon(TM) CPU 3.06GHz meminfo: MemTotal:      6234308 kB disk info: /dev/sda1 on / type reiserfs (rw,noatime) lucene 配置 writer = new IndexWriter(indexDir, paodingAnalyzer, true, IndexWriter.MaxFieldLength.UNLIMITED); [...]

新的域名,新的开始(fullin.org)

fulin.org 域名遭恶意抢注,愤怒却又无可奈何。重新注册了 fullin.org ,中间多了一个 L 。 其实我从年后就开始折腾域名的事情了。域名是在新网注册的,而当初注册 birdring.org 的时候,在万网里留了320块钱。于是就想把域名转到万网,用余下的钱来续费。可是找了半天,还是没有找到如何转域名,甚至用记忆中的用户名和密码都无法登录新网了。打新网的客服电话也没有用,一大断的语音提示,平白浪费电话费罢了。 稍微一犹豫,域名进入了赎回期。这个时候在 whois 记录上看到有 update 操作,难道是新网或者代理商自己续费了?我很愤怒的在新网所谓的“在线客服”系统上留了言。没有想到,第二天还真有回音了: >我有一个域名是在新网注册的, >本来应该在09年1月份到期,我没有续费, > 但不知道为什么忽然 whois 信息被改了,过期日期变成了2010年1月,这是为什 > 么呢?现在该域名处于 On-hold (generic) 状态,按理说这个状态应该维持 30 > 天,可 30 天过去了,昨天居然又被 update 了,难道新网要让这个域名一直处 > 于这个状态吗?我现在想拿回这个域名,而且希望转出新网。请问需要走哪些手 > 续?整个新网的网站上居然都找不到一点关于转出域名的说明??? <请提供您的域名。我给您查看一下,域名的情况。 <客户服务 ** >我的域名是 www.fulin.org <您的域名现在已经进入偿还期了,org的域名有30天的续费期和30天的赎回期 <然后有5天的删除期。 <如果您想转出新网,请先将域名赎回,然后在域名状态正常的情况下才可以办理, <将域名赎回请您直接联系:郑州分公司 同事,缴纳罚金。 >最近的两次更新(1月25号,2月25号)是谁更新的? >为什么域名所有者没有做任何操作,而域名的过期时间从 2009年1月26号 变成了 2010年1月26号了? >我想确认的是,30天的续费期加30天的赎回期之后,域名真得会进入删除期吗?不会被某个内部人员抢注? (这个时候,我已经开始在想要不等删除后再注册回来?) <是的,30天的续费期加30天的赎回期之后,域名会进入删除期。在5天的删除期内,系统是不定时的删除,如果被人抢注了,我们也没有办法。请您在进入删除期内,关注该域名。 <注册日期 [...]

Lucene 重建索引流程设计(草稿)

一. php client 端: 1. update 与 rebuild 分开 2. update 准实时:insert,update,delete 实时调用更新索引接口(带 primery key 的update 和 delete) 3. rebuild 使用命令行或者 cron 运行,不能使用 web 页面(有运行时间限制),但可以在后台管理系统中作触发(如何防止重复触发?) 二. Java IndexServer:(接受 client 发过来的数据,输出为临时 xml 文件) 1. 日常 update 的 xml 临时文件可以考虑保存在内存文件系统中(保留最近n天的文件debug使用) 2. 更多的处理过程 log (debug 使用,日常监控使用) 3. rebuild 的 xml 临时文件一定要保存在内存文件系统中 4. xml 文件按年或月分目录 5. rebuild 的过程中,update 数据需要为新索引保留一份,等 [...]