好记性,不如烂博客!

Memcached Consistent Hashing 介绍

发表于:2009年11月19日 | 分类:算法 | 标签: , | 评论:(0)

转载:memcached全面剖析–4. memcached的分布式算法 部分

介绍高效率地分散数据的Consistent Hashing算法。

Consistent Hashing 的简单说明,

如下所示:首先求出memcached服务器(节点)的哈希值, 并将其配置到0~232的圆(continuum)上。

然后用同样的方法求出存储数据的键的哈希值,并映射到圆上。

然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上。

如果超过232仍然找不到服务器,就会保存到第一台memcached服务器上。

Consistent Hashing 基本原理

Consistent Hashing 基本原理

从上图的状态中添加一台memcached服务器。余数分布式算法由于保存键的服务器会发生巨大变化 而影响缓存的命中率,但Consistent Hashing中,

只有在continuum上增加服务器的地点逆时针方向的 第一台服务器上的键会受到影响。

Consistent Hashing 添加服务器

Consistent Hashing 添加服务器

因此,Consistent Hashing最大限度地抑制了键的重新分布。 而且,有的Consistent Hashing的实现方法还采用了虚拟节点的思想。

使用一般的hash函数的话,服务器的映射地点的分布非常不均匀。 因此,使用虚拟节点的思想,为每个物理节点(服务器) 在continuum上分配100~200个点。这样就能抑制分布不均匀, 最大限度地减小服务器增减时的缓存重新分布。

通过下文中介绍的使用Consistent Hashing算法的memcached客户端函数库进行测试的结果是, 由服务器台数(n)和增加的服务器台数(m)计算增加服务器后的命中率计算公式如下:

(1 - n/(n+m)) * 100

Solr 1.4 发布了

发表于:2009年11月12日 | 分类:Search | 标签: , | 评论:(3)

Lucene 2.9 发布了一些日子了,solr 1.4 也应该紧跟其后,但 lucene 2.9.0 有个重大 bug,详情:http://blog.fulin.org/2009/10/acme_of_music_search.html 文中的 LUCENE-1974 。solr 1.4 推迟到 lucene 2.9.1 发布后才发布。

今天一大早发现官方已经 released,其实前几天已经在各镜像可以下载了。

Solr 1.4 的主要特性包括:

  • 索引、搜索、层面搜索(分组统计,faceting),主要功能性能提升。
  • 全新的纯 java 索引复制机制,配置简单。同时可以复制配置文件。可以参考:SolrReplication 试用
  • DataImportHandler 大大改善数据库的集成。
  • 使用 Apache Tika 可以处理富文件(Word, PDF, HTML)
  • 使用 Carrot2 动态聚类搜索结果
  • 多选的分组统计(在单个分类的多个项可以被选择)
  • 许多强大的查询功能增强, including ranges over arbitrary functions,不同语法的嵌套查询
  • 其它插件:Terms for auto-suggest, Statistics, TermVectors, Deduplication

官方原文:

  • Major performance enhancements in indexing, searching, and faceting
  • Revamped all-Java index replication that's simple to configure and can replicate config files
  • Greatly improved database integration via the DataImportHandler
  • Rich document processing (Word, PDF, HTML) via Apache Tika
  • Dynamic search results clustering via Carrot2
  • Multi-select faceting (support for multiple items in a single category to be selected)
  • Many powerful query enhancements, including ranges over arbitrary functions, nested queries of different syntaxes
  • Many other plugins including Terms for auto-suggest, Statistics, TermVectors, Deduplication

CHANGES.txt

solr 1.4 发布之前,已经有本 solr 1.4 的书籍:Solr 1.4 Enterprise Search Server

Solr 1.4 Enterprise Search Server

Solr 1.4 Enterprise Search Server

Lucene 2.9 NumericRangeQuery 性能提升大

发表于:2009年11月5日 | 分类:Search | 标签: , | 评论:(0)

Lucene 2.9 对数值类的字段,用 NumericRangeQuery 查询,性能好。它不是把数字简单地用 toString() 做索引的,而是对数值进行 byte 转换,以至可以快速地比较,同时因为字节一样,也方便 Range 查询。

现来测试下,比普通 RangeQuery 查询的性能。分别生成 500W 的数值和字符字段索引(就用 1 - 500W 的数字)。

然后再 400W 到 500W 中(是6位数),按 range 范围 200 查找。

#400W - 500W localhost env
numeric range total = 74781ms, avg = 1495.62ms
range total = 721878ms, avg = 14437.56ms

性能有相差 10 倍左右。

然后再 40W 到 50W 中(是5位数),按 range 范围 200 查找

#40 - 50W localhost env
numeric range total = 8657ms, avg = 173.14ms
range total = 47455ms, avg = 949.1ms

相差也大。

数字的位数越少,相差可能越小。

注意:要使用 NumericRangeQuery ,索引字段必须是 NumbericField。索引代码如:

for(int i=1; i<5000000; i++) {
	Document doc = new Document();

	doc.add(new NumericField("num", Field.Store.YES, true).setIntValue(i));
	doc.add(new Field("id", ""+i, Field.Store.YES, Field.Index.ANALYZED));
	writer.addDocument(doc);
}

搜索代码:

Query q = NumericRangeQuery.newIntRange("num", j, j+200, true, false);
long s = System.currentTimeMillis();
searcher.search(q, 200);
long e = System.currentTimeMillis();

值得一用。

金士顿 Kingston 16G 假冒 U盘

发表于:2009年10月29日 | 分类:八卦 | 标签: | 评论:(0)

国庆回来后,买了个 16G 的 kingston 的U盘。今使用时,发现电脑发送文件夹到 u 盘,然后打开文件夹,里面是空的。怎么回事?明明是复制过去了,但没有内容。郁闷。

网上找了下, u 盘丢数据。才知是被骗了。买的是水货。135 RMB 买个教训。

当时在大平洋电脑城门口旁摆了一个位,卖 iphone 和 u 盘,正好去买 u 盘。不想上去,就在楼下买了个,当时他们试过(仅仅是复制文件,而且小于 100M)。回来写很多文件,发现好多文件会无缘无故没了。

有个 MyDiskTest 工具可以测试是否为扩容的 u 盘。

my-disk-test

my-disk-test

ext-capacity

u 盘身上写着 DT1/16G。假货,唉……

MMSeg4j-1.8 Lucene highlight 抛出 InvalidTokenOffsetsException

发表于:2009年10月21日 | 分类:mmseg4j | 标签: , | 评论:(11)

感谢 yongboy 反馈 mmseg4j-1.8 的一个BUG:使用 Lucene highlight 抛出 InvalidTokenOffsetsException 或 StringIndexOutOfBoundsException。

yongboy 反馈的内容(Issue: http://code.google.com/p/mmseg4j/issues/detail?id=8):

原先项目中使用MMSEG4J 1.73版本,对应lucene版本:
lucene: 2.9,高亮组件:lucene-highlighter-2.9.0.jar

mmseg4j : mmseg4j-all-1.7.3.jar

在使用lucene搜索时,很正常;
切换到 mmseg4j 1.80 后,在搜索时出现异常:
......
org.apache.lucene.search.highlight.InvalidTokenOffsetsException: Token 未知 exceeds length of provided text sized 2
    at org.apache.lucene.search.highlight.Highlighter.getBestTextFragments(Highlighter.java:254)
    at org.apache.lucene.search.highlight.Highlighter.getBestFragments(Highlighter.java:184)
    at org.apache.lucene.search.highlight.Highlighter.getBestFragment(Highlighter.java:107)
    at org.apache.lucene.search.highlight.Highlighter.getBestFragment(Highlighter.java:85)

而把高亮组件切换成 lucene-highlighter-2.2.0.jar时(lucent 还是2.9,mmseg 为1.80),报一下异常:
java.lang.StringIndexOutOfBoundsException: String index out of range: 3
    at java.lang.String.substring(String.java:1934)
    at org.apache.lucene.search.highlight.Highlighter.getBestTextFragments(Highlighter.java:271)
    at org.apache.lucene.search.highlight.Highlighter.getBestFragments(Highlighter.java:175)
    at org.apache.lucene.search.highlight.Highlighter.getBestFragment(Highlighter.java:101)
    at org.apache.lucene.search.highlight.Highlighter.getBestFragment(Highlighter.java:80)

两种情况下把只要把mmseg1.8 切换成 1.7.3 都可以运行正常。

暂时忙碌,无暇修改源代码。只是简单把问题反馈,因仓促原因,不知道是否已经说清楚。

希望修改之。

据调试与跟踪,发现分词到文本最后没有处理好,到 EOF 时,token 的offset索引错误。补丁下载:mmseg4j-8.patch

这个 bug 主要是因为 1.8 中修改了 mmseg.next() 的流程(改为更清楚、易懂、方便的),没有处理好读到最后时记录的字符位置 readIdx。补丁内容:

Index: src/com/chenlb/mmseg4j/MMSeg.java
===================================================================
--- src/com/chenlb/mmseg4j/MMSeg.java	(revision 68)
+++ src/com/chenlb/mmseg4j/MMSeg.java	(working copy)
@@ -39,8 +39,12 @@
 	}

 	private int readNext() throws IOException {
-		readedIdx++;
-		return Character.toLowerCase(reader.read());
+		int d = reader.read();
+		if(d > -1) {
+			readedIdx++;
+			d = Character.toLowerCase(d);
+		}
+		return d;
 	}

 	private void pushBack(int data) throws IOException {

代码已经提交到 SVN:r69

mmseg4j 1.8.1 修复了此 bug,1.8.2 修复了 max-word 依然抛出异常。还有错误回复我。

mmseg4j-1.8 中的 MMSeg4jHandler

发表于:2009年10月18日 | 分类:mmseg4j | 标签: , , | 评论:(0)

mmseg4j 1.8 中有词库变化检测功能,新加载词库后,很有可能此时的分词(搜索时)与索引不对应了。所以要有个机制让重新做索引。

这里使用最简单的方式,就是被动式的加载词库。由外围的程序去决定什么时候更新词库,然后也由外围的程序决定重做索引与否。比如可以写个 shell 脚本放到 crontab 里。

按 solr 的理念——用 url 方式去通知 mmseg4j 加载词库。这个任务交出 MMseg4jHandler 去做。

参数:

  • dicPath 是指定词库的目录,特性与MMSegTokenizerFactory中的dicPath一样(相对目录是,是相对 solr.home)。
  • check 是指是否检测词库,其值是true 或 on。
  • reload 是否尝试加载词库,其值是 true 或 on。此值为 true,会忽视 check 参数。

solrconfig.xml:

	<requestHandler name="/mmseg4j" class="com.chenlb.mmseg4j.solr.MMseg4jHandler" >
		<lst name="defaults">
			<str name="dicPath">dic</str>
		</lst>
	</requestHandler>

然后可以用 http://localhost:8080/solr-1.4/mmseg4j/?reload=true 去尝试加载(注意:内存空间要有2倍词库大小的可能空间。一个词库可可能 50M)。

返回结果如下:

<?xml version="1.0" encoding="UTF-8" ?>
<response> 

<lst name="responseHeader">
 <int name="status">0</int>
 <int name="QTime">0</int>
</lst>
<lst name="result">
 <str name="dicPath">java.net.URI:file:/E:/workspace/solr/example/solr-mmseg4j/dic/</str>
 <bool name="changed">true</bool>
 <bool name="reloaded">true</bool>
</lst>
</response> 

只要检测 /response/lst[@name='result']/bool[@name='reloaded'] 的值就可以决定是否要重做索引了。

注意:dicPath 参数是 MMSegTokenizerFactory 里指定的 dicPath 才有意义。

中文分词 mmseg4j-1.8 版发布

发表于: | 分类:mmseg4j | 标签: , , | 评论:(12)

想发布新版的 mmseg4j 到现在已经有二个多月了。主要是因为这段时间忙其它事情了。现 Lucene 2.9 发布了,solr 1.4 也应该会比较快就要发布了。对 mmseg4j 兼容新版的 lucene/solr 也是个任务。

现 mmseg4j 发布新版 1.8,可以下载:mmseg4j-1.8.zip 包括了源码与词库,还有创建文件。下面说下此版的主要变更:

new:

1、有检测词典变更的接口,外部程序可以使用 wordsFileIsChange() 和 reload() 来完成检测与加载的工作. (内部不实现自动检测与加载,留给外部程序去做。)

2、添加 MMseg4jHandler 类,可以在solr中用url的方式来控制加载检测词库。

3、增加 CutLetterDigitFilter过虑器,切分“字母和数”混在一起的过虑器。比如:mb991ch 切为 "mb 991 ch"。

changes:

1、默认在 classpath 中加载 data 目录(词库目录),找不到再找 user.dir/data 目录。但是优先 mmseg.dic.path 系统属性指定的。

2、新词库,去除 sogou 高频无词性的词,合并 rmmseg 提供的词(是 mmseg4j 1.0 使用的词库),共计(14W 多词)。

3、数字或英文开头的数字或英文不独立分出。如 MB991CH/A 分为 mb991ch a,cq40-519tx 分为 CQ40 519TX

4、内置支持小写,不需要 LowerCaseFilter 了。MMSegAnalyzer 去除了小写过虑。

5、支持 solr 1.3/1.4、lucene 2.3/2.4/2.9

6、尝试加载 jar 里的 words.dic,并构建含有 words.dic 的 jar(mmseg4j-*-with-dic.jar)。

bugs:

1、Dictionary 添加 finalize 方法。修正 tomcat reload 时 OOM 的 bug: http://code.google.com/p/mmseg4j/issues/detail?id=4

2、MMSegTokenizer 在 lucene 2.4 编译的 在 lucene 2.9 中会报 java.lang.NoSuchFieldError: input。bug: http://code.google.com/p/mmseg4j/issues/detail?id=5

此发布版的 *.jar 是在 solr-1.3,lucene-2.4 下编译,可以支持 solr-1.4-dev,lucene-2.3/2.9。如果你心理上觉得在 solr-1.4/lucene-2.9 下运行不爽。可以把下载来的 mmseg4j-1.8.zip 里的 lib/*.jar 换成 solr1.4/lucene2.9的jar(apache-solr-core-1.4-dev.jar,apache-solr-solrj-1.4-dev.jar,lucene-core-2.9.jar),然后用 ant 重新编译打包。方式是:

ant build

为不需要自定义词库的网友可以使用 mmseg4j-*-with-dic.jar 的包,它们包括了 *.dic 文件。当然此情况下还是可以使用扩展自己的词库,把自己的词库放到指定的目录就行(原来指定词库的方式,加上默认的 classpath/data)。事实上只是在自定义的词库目录加载之前尝试加载 jar 里的 words.dic文件。solr 用户还是推荐用原来的方式。

欢迎大家使用,或报告 bug。

1.8.2 fixed bug:
使用highlight 抛出异常
max-word 方式,highlight 有问题。

惠普HP 4411s VH426PA 装 xp 与 sata 驱动。

发表于:2009年10月11日 | 分类:Windows | 标签: , , | 评论:(0)

网上说HP的笔记本装XP比较麻烦,自从安装宏基的XP/SATA后,就知道了流程,在HP上安装XP也不容易多了。现记录下,方便他人。

HP ProBook 4411s VH426PA 到货后,安装着的是 windows vista。现改为 xp3。

1、开机,按 Esc,然后按 F10 进入 BIOS 设置,把 SATA 模式改为 IDE。如:

hp 4411s bois

hp 4411s bios

2、按以前的任何方式安装 XP,我这里安装的是原版 XP3。也可以是其它 GHOST 版。

3、安装好后,到官方下载 windows xp 驱动。http://h50176.www5.hp.com/support/VA045PA/drivers/os_1093.html,可以先把其它驱动都装好,最后来安装 Intel Matrix Storage Manager

4、直接双击 Intel Matrix Storage Manager 的 setup.exe 是不能安装的。

找开设备管理器,IDE ATA/ATAPI 控制器,Intel XXX Serial ATA Storage Contraller --> 右击“更新驱动程序软件”,选择“不要搜索,我要自己选择要安装的驱动程序”--> 点击“从磁盘安装”--> 选择 D:\swsetup\SP44064\Winall\Driver\iaAHCI.inf。确定后,有个驱动列表。我这里是 “ICH9M-E/M SATA AHCI Controller”。确定。

第二个 Intel XXX Serial ATA Storage Contraller 也用同样的方法,只不过是选择 D:\swsetup\SP44064\Winall\Driver\iaStor.inf (我由于没注意两都选择了 iaAHCI.inf 导致 BIOS 不管是 IDE 还是 ACHI 都启动不了,无奈又安装一次 xp)。这个安装后会蓝屏。

5、蓝屏后重启机器,然后在 BIOS 中把 SATA 模式改为 ACHI 启动就可以了。启动后,还会提示发现新硬件,提示加入 iaStor.sys 文件就行。最后再安装一下Intel Matrix Storage Manager驱动(双击D:\swsetup\SP44064\Setup.exe)。

安装好 XP/SATA 后,又没有声音,郁闷。后来找到这个帖子:惠普4411\4311S改XP系统!解决重启,解决无声!。说到要用 SoundMAX 的选项,非 ATI HD Audio。在 控制面板 -> 声音与音频设备 -> 音量 -> 设置音量 -> 高级 -> 选项 -> 属性 -> 混音器 中选择 SoundMAX HD Audio,最好把所有“声音与音频设备”中的都设为 SoundMax。如图:

sound-max-hd-audio

sound max hd audio

恩,终于有声了,但设置管理器中,还可以看到一个未知设备。上面的引贴也说了这个问题,是没有安装 "HP 3D DriveGuard 驱动",可以在上面的驱动下载列表中找到。

宏基 acer 4732z xp安装SATA/AHCI驱动

发表于:2009年9月18日 | 分类:Windows | 标签: , , , | 评论:(1)

今天帮朋友买了部 acer 4732z 本本。这本本自带的系统是 Linux。当然不要了,改安装 xp。

xp 安装盘是公司运维同事借的深度 xp3 ghost 版。当然最好是原版的,人家改装过的 xp 不太放心用,也因为自己手里没有原版,只好凑合。

首先在 BIOS 中把 SATA 模式改为 IDE。然后安装 xp。

安装好后,用自带的驱动盘安装一系列驱动。但安装 AHCI 驱动(就是 sata)时报错,大概是:你的硬件没有达到最底要求,不能安装退出。然后重启并改为 AHCI 模式,出现蓝屏,说明SATA驱动没有安装到。

查看目录又有 G:\XP\X86\Driver\AHCI\F6 Floppy Utility 目录(光盘),这就是在安装时用 F6 软盘安装时需要的文件。早就不能用这种安装方式了。有这个文件说明安装 SATA 成功的机会大。

然后努力找文章,有的说可以用安装 AHCI 报错的时候把 windows/temp/IIF2 复制下来,再安装什么 ich9m-e 驱动。请看原文:【安装AHCI驱动】Acer Aspire 4930G(864G25Mi) 请好像觉得找 ich9m-e 驱动麻烦也没说明具体怎么样。

然后继续找文章,不知什么时候找到了:sata硬盘时AHCI驱动的安装方法。多谢这文章。

我的大概过程:

1、把 G:\XP\X86\Driver\AHCI\F6 Floppy Utility\f6flpy32.zip 解压到E:\F6 Floppy Utility\f6flpy32。

2、找开设备管理器,IDE ATA/ATAPI 控制器,Intel XXX Serial ATA Storage Contraller --> 右击“更新驱动程序软件”,选择“不要搜索,我要自己选择要安装的驱动程序”--> 点击“从磁盘安装”--> 选择 E:\F6 Floppy Utility\f6flpy32\iaAHCI.inf。确定后,有个驱动列表。我这里是 “ICH9M-E/M SATA AHCI Controller”。确定。

3、我这环境有两个 Intel XXX Serial ATA Storage Contraller ,所以对另一个再按照第 2 步做一次(这次应该选择 iaStor.inf 文件)。安装完后,几秒后出现蓝屏。恩,说明有反应,不要急。

4、重启并在BIOS里把 SATA 改回 AHCI 模式。成功启动, :v:    启动后,它又自已识别了一些东西(提示说发现新硬件什么的),然后现在设备里看,已经是正常的一个 “Intel(R) ICH9M-E/M SATA AHCI Controller”了。

完了后,有个 Intel(R) Matrix Storage Console 的软件在开始/程序里。

LucidGaze for Solr 搜索监测工具

发表于:2009年9月17日 | 分类:Search | 标签: , , | 评论:(0)

LucidGaze for Solr 是由 Lucid 开发的开源 solr 监测工具,提供快照、存储、交互视图、比较各种 solr 性能指标。 包括:

  • Record and graph metrics
  • 捕获多种 handler 的每秒请求数(Capture requests-per-second),如:StandardRequestHandler
  • 捕获每个请求的处理时间(Capture processing time per request)。
  • ……

现来试用下

1、下载 LucidGaze for Solr 1.0 http://www.lucidimagination.com/Downloads/LucidGaze-for-Solrhttp://www.lucidimagination.com/user_download/certified/lucidgaze-1.0.tgz

2、解压到某个位置,如:f:/lucidgaze。把 gaze-plugin-1.0.jar 复制到 solr.home/lib,在 solr.home/conf/solrconfig.xml 添加以下内容

<requestHandler name="/gaze" class="com.lucidimagination.gaze.plugin.StatMonitor" />

3、把  rrd4j-2.06.jar 和 gaze-shared-1.0.jar 放到 tomcat-6/lib 下。启动 tomcat(安装有 solr 的 tomcat),再把 gaze.war 放到 tomcat-6/webapps 下。

4、然后打开 http://localhost:8080/gaze,提交 http://localhost:8080/solr 为 solr 的根 url。最后选择要监测的 handler,如:standard、/update。

效果如图:

lucidgaze for solr

lucidgaze for solr

官方的截图

LucidGaze for solr

LucidGaze for solr,点击放大


http://localhost:8080/solr/admin/stats.jsp 也有这些数据。上面的数据是会被 gaze 保存下来,又图形显示友好些。

官方地址:http://www.lucidimagination.com/Downloads/LucidWorks-for-Solr

Infoq:Lucid Imagination发布了Apache Lucene性能监测工具

返回顶部