“Solr4.0升级参考”的版本间的差异
Dennis zhuang(讨论 | 贡献) (→Why) |
Dennis zhuang(讨论 | 贡献) |
||
(未显示1个用户的7个中间版本) | |||
第1行: | 第1行: | ||
+ | 本文永久链接 http://fnil.me/aaaabe | ||
+ | |||
+ | {{版权声明}} | ||
== 介绍 == | == 介绍 == | ||
第84行: | 第87行: | ||
<solr sharedLib="lib" persistent="true"> | <solr sharedLib="lib" persistent="true"> | ||
<cores adminPath="/admin/cores" defaultCoreName="test1" host="${host:}" hostPort="${jetty.port:}" > | <cores adminPath="/admin/cores" defaultCoreName="test1" host="${host:}" hostPort="${jetty.port:}" > | ||
− | + | <core default="true" instanceDir="test1" name="test1"></core> | |
− | + | <core default="false" instanceDir="test2" name="test2"></core> | |
</cores> | </cores> | ||
</solr> | </solr> | ||
第100行: | 第103行: | ||
4. 更健壮的启动脚本应该将solr作为daemon service开机启动。 | 4. 更健壮的启动脚本应该将solr作为daemon service开机启动。 | ||
+ | |||
+ | == 中文分词 == | ||
+ | |||
+ | 我用的是[https://code.google.com/p/ik-analyzer/ IKAnalyzer]这个分词组件,可以参考[http://demi-panda.com/2010/11/25/solr-ikanalyzer/ 这篇文档]。 | ||
+ | |||
+ | == 注意事项 == | ||
+ | |||
+ | * 在启动前最好设置集群内所有机器的hostname,并且可根据hostname相互访问,solr cloud会存储所有的集群内的机器hostname到zookeeper。如果hostname变更,该台机器将无法加入集群。 | ||
+ | * 监控,如果你使用nagios,可以尝试我的这个插件脚本: https://gist.github.com/4705395 它会做两个事情:查看活跃节点数目是否是你指定的数目,并且尝试查询该节点,是否返回结果不为空。 |
2013年2月4日 (一) 07:24的最后版本
本文永久链接 http://fnil.me/aaaabe
目录 |
[编辑] 声明
- 本Wiki上的任何文字信息均在GNU自由文档许可证1.3或更高版本下发布,如果用于任何商业用途都需经本人同意。任何转载都请注明出处。
- 本Wiki上的内容来自本人的学习笔记,来源可能包括原创、书籍、网页、链接等,如果侵犯了您的知识产权,请与本人联系,我将及时删除。
- 我的联系方式 killme2008@gmail.com
[编辑] 介绍
最近负责solr集群的升级,从solr 3.x的一个shard集群升级到solr 4.0的cloud集群。
[编辑] Why
Solr 4.0引入了SolrCloud功能,利用zookeeper做到全自动的分区、负载均衡,无需再人工做痛苦的shard切分,也不需要利用Haproxy或者Nginx做前端的负载均衡。索引添加和更新,会自动路由到正确的shard master做更新,并分布式同步到shard slave。查询会自动地从各个shard(shard内的master/slave也会做负载均衡)做查询并汇集结果。这是我们升级的主要动力。Solr 4.0还有一个NRT,近实时搜索的特性也是我们比较关注的。
整个升级主要参考SolrCloud这篇文档。
[编辑] 配置变更
[编辑] schema.xml
schema.xml 必须加入_version_字段:
<field name="_version_" type="long" indexed="true" stored="true" multiValued="false"/>
[编辑] solrconfig.xml
- indexDefaults和mainIndex合并成indexConfig
- 加入
<luceneMatchVersion>LUCENE_CURRENT</luceneMatchVersion>
选择你使用的lucene版本号。
- 找到updateHandler,并加入updateLog,用于生成事务日志
<updateLog> <str name="dir">${solr.data.dir:}</str> </updateLog>
- 原来用于复制的replicationHandler可以简化成:
<requestHandler name="/replication" class="solr.ReplicationHandler" startup="lazy" />
- 添加/get handler:
<requestHandler name="/get" class="solr.RealTimeGetHandler"> <lst name="defaults"> <str name="omitHeader">true</str> </lst> </requestHandler>
- 如果没有添加admin handler,必须添加:
<requestHandler name="/admin/" class="solr.admin.AdminHandlers" />
solr.xml保持默认:
<cores adminPath="/admin/cores"
- DistributedUpdateProcessor会自动添加到update链里,但是你也可以手动添加:
<updateRequestProcessorChain name="sample"> <processor class="solr.LogUpdateProcessorFactory" /> <processor class="solr.DistributedUpdateProcessorFactory"/> <processor class="my.package.UpdateFactory"/> <processor class="solr.RunUpdateProcessorFactory" /> </updateRequestProcessorChain>
- solr.DisMaxRequestHandler相关handler需要删除。
- solr.AnalysisRequestHandler相关handler需要删除。
[编辑] 启动
1. 在第一次创建cloud集群的时候,第一个节点的启动必须特殊处理,启动参数类似(以多个core为例):
#Startup the first node. export BASE_DIR=. export JVM_ARGS="-Xmx16G -Xms16G" export ZK_SERVERS="localhost:2181" export ZK_TIMEOUT=20000 export SHARDS=2 java $JVM_ARGS -Dbootstrap_conf=true -DzkHost=$ZK_SERVERS -DzkClientTimeout=$ZK_TIMEOUT -DnumShards=$SHARDS -Dsolr.solr.home=$BASE_DIR -jar $BASE_DIR/start.jar 2>&1 >> $BASE_DIR/logs/solr.log &
重要参数说明如下:
- bootstrap_conf If you pass -Dbootstrap_conf=true on startup, each SolrCore you have configured will have it's configuration files automatically uploaded and linked to the collection that SolrCore is part of
- zkHost 用到zookeeper集群服务器列表,逗号隔开
- zkClientTimeout zookeeper client timeout
- numShards 多少个分片,例如上面设置为两个分片
- solr.solr.home solr目录,该目录下需有solr.xml,设定core(现在称为collection)列表,例如:
<solr sharedLib="lib" persistent="true"> <cores adminPath="/admin/cores" defaultCoreName="test1" host="${host:}" hostPort="${jetty.port:}" > <core default="true" instanceDir="test1" name="test1"></core> <core default="false" instanceDir="test2" name="test2"></core> </cores> </solr>
设定了两个collection: test1和test2,他们的配置分别在$solr.solr.home/test1和$solr.solr.home/test2目录下。
2. 当第一次创建集群的时候,第一个节点启动后会等待其他节点启动,因为要组成一个shard集群,必须至少有numShards个节点启动。
3. 其他节点启动无需传入-Dbootstrap_conf=true和-DnumShards:
java $JVM_ARGS -DzkHost=$ZK_SERVERS -DzkClientTimeout=$ZK_TIMEOUT -Dsolr.solr.home=$BASE_DIR -jar $BASE_DIR/start.jar 2>&1 >>$BASE_DIR/logs/solr.log &
只需zookeeper相关参数就够了。
4. 更健壮的启动脚本应该将solr作为daemon service开机启动。
[编辑] 中文分词
我用的是IKAnalyzer这个分词组件,可以参考这篇文档。
[编辑] 注意事项
- 在启动前最好设置集群内所有机器的hostname,并且可根据hostname相互访问,solr cloud会存储所有的集群内的机器hostname到zookeeper。如果hostname变更,该台机器将无法加入集群。
- 监控,如果你使用nagios,可以尝试我的这个插件脚本: https://gist.github.com/4705395 它会做两个事情:查看活跃节点数目是否是你指定的数目,并且尝试查询该节点,是否返回结果不为空。