目录java
简介... 2apache
配置单机版Solr服务器... 2tomcat
1:下载Solr 2服务器
3:将下载的Solr解压,并复制其中example\webapps\solr.war包到指定位置... 2app
4:复制example\solr中的solr.xml和zoo.cfg到一个新建文件夹(solrhome)中。... 2负载均衡
5:在tomcat的conf文件夹下新建Catalina\localhost文件夹,并在其中新建solr.xml,内容以下:... 2webapp
7:在单机版Solr服务器中添加connection,... 2
1: 参照Solr单机版的配置,配置多台Solr服务器... 2
3:在Zookeeper 中上传Solr的connection配置文件... 6
Solr它是一种开放源码的、基于 Lucene Java 的搜索服务器,易于加入到 Web 应用程序中。Solr 提供了层面搜索(就是统计)、命中醒目显示而且支持多种输出格式(包括XML/XSLT 和JSON等格式)。它易于安装和配置,并且附带了一个基于HTTP 的管理界面。可使用 Solr 的表现优异的基本搜索功能,也能够对它进行扩展从而知足企业的须要。Solr的特性包括:
高级的全文搜索功能 专为高通量的网络流量进行的优化 基于开放接口(XML和HTTP)的标准 综合的HTML管理界面 可伸缩性-可以有效地复制到另一个Solr搜索服务器 使用XML配置达到灵活性和适配性 可扩展的插件体系
http://www.apache.org/dyn/closer.cgi/lucene/solr/
<?xml version="1.0" encoding="UTF-8"?>
<Context docBase="D:\\development\\SolrCloud\\data\\solr\\war\\solr.war" debug="0" crossContext="true">
<Environment name="solr/home" type="java.lang.String" value="D:\\development\\SolrCloud\\data\\solr\\solrhome" override="false"/>
</Context>
其中docBase指向solr.war文件,Environment/value 配置为solrhome的路径。
假设目前存在多台已经配置好的Solr服务器分别为
http://127.0.0.1:8080/solr/connection1
http://127.0.0.1:8081/solr/connection1
http://127.0.0.1:8082/solr/connection1
目前须要设置8080为主机,8081,8082为从机
<requestHandler name="/replication" class="solr.ReplicationHandler" >
<lst name="master">
<str name="replicateAfter">startup</str>
<str name="replicateAfter">commit</str>
<str name="replicateAfter">optimize</str>
<str name="confFiles">schema.xml</str>
</lst>
</requestHandler>
<updateHandler class="solr.DirectUpdateHandler2">
<autoCommit>
<maxDocs>1</maxDocs>
<maxTime>1000</maxTime>
<openSearcher>false</openSearcher>
</autoCommit>
</updateHandler>
<requestHandler name="/replication" class="solr.ReplicationHandler" >
<lst name="slave">
<str name="masterUrl">http://10.28.175.246:8080/solr/waiter</str>
<str name="pollInterval">00:00:20</str>
</lst>
</requestHandler>
上述操做完成后,一个Solr分布式就完成了,主库主要负责接收插入的数据,从库主要负责查询数据。
从库会在按期(pollInterval配置)到主库进行数据查询,若主库数据有修改,从库会自动进行差别同步。
<bean id="concurrentUpdateSolrServer" class="org.apache.solr.client.solrj.impl.ConcurrentUpdateSolrServer">
<constructor-arg value=" http://127.0.0.1:8080/solr/connection1" />
<constructor-arg value="8" />
<constructor-arg value="8" />
</bean>
<bean id="lbHttpSolrServer" class="org.apache.solr.client.solrj.impl.LBHttpSolrServer" >
<constructor-arg>
<array value-type="java.lang.String">
<value>http://127.0.0.1:8081/solr/connection1</value>
<value>http://127.0.0.1:8082/solr/connection1</value>
</array>
</constructor-arg>
</bean>
本文所讲的Solr集群服务器是基于 Tomcat7 + Zookeeper3.4.6 + Solr4.6
下载地址为 http://www.apache.org/dyn/closer.cgi/zookeeper/
tickTime=2000
initLimit=10
syncLimit=5
dataDir=D:\\tmp\\zookeeper\\server1\\data
clientPort=2181
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890
在此示例文件中,咱们部署了三分Zookeeper服务器,数据文件分别定位到
D:\\tmp\\zookeeper\\server1
D:\\tmp\\zookeeper\\server2
D:\\tmp\\zookeeper\\server3
其中的server.x中的x为服务器myid(myid随后说在哪里定义),后面的127.0.0.1:2888:3888分别对应与2181
例如,服务器A的clientPort为2181,则对应的地址为127.0.0.1:2888:3888
服务器B的clientPort为2182,则对应的地址应该为127.0.0.1:2889:3889
服务器配置文件 dataDir clientPort
server_1/conf/zoo.cfg D:\\tmp\\zookeeper\\server1 2181
server_2/conf/zoo.cfg D:\\tmp\\zookeeper\\server2 2182
server_3/conf/zoo.cfg D:\\tmp\\zookeeper\\server3 2183
上述文件中咱们定义了一个 dataDir 地址,此地址是程序存放数据用的地址,在此地址中,咱们定义一个myid文件,用记事本打开,写入1,则此项目的Myid为1
分别将三个服务器按照123进行排列写入myid文件
(链接第一台时有异常信息,不用管,等都链接起来就没有异常了)
按照Solr单机版的部署方式,部署三台Solr单机版服务器,并去掉其中的全部connection
假设以前部署好的Zookeeper地址为:
127.0.0.1:2181
127.0.0.1:2182
127.0.0.1:2183
solr服务器 tomcat端口 solrhome
solr1 8081 SolrCloud\data\solrhome1
solr2 8082 SolrCloud\data\solrhome2
solr3 8083 SolrCloud\data\solrhome3
<?xml version="1.0" encoding="UTF-8" ?>
<solr>
<solrcloud>
<str name="host">${host:}</str>
<int name="hostPort">8080</int>
<str name="hostContext">${hostContext:solr}</str>
<int name="zkClientTimeout">${zkClientTimeout:15000}</int>
<bool name="genericCoreNodeNames">
${genericCoreNodeNames:true}
</bool>
<str name="zkHost">
127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183
</str>
</solrcloud>
<shardHandlerFactory name="shardHandlerFactory"
class="HttpShardHandlerFactory">
<int name="socketTimeout">${socketTimeout:0}</int>
<int name="connTimeout">${connTimeout:0}</int>
</shardHandlerFactory>
</solr>
其中hostPort为该服务器的tomcat端口
zkHost为Zookeeper的三个服务器地址用逗号链接起来。
依次启动三个solr服务器,并访问任意一个solr,出现下图页面,即说明配置集群服务成功。
java -classpath D:\\uploadCloud\\ClientLib\\* org.apache.solr.cloud.ZkCLI -cmd
upconfig -zkhost 127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183 -confdir
D:\\uploadCloud\\conf -confname myconf
该命令是使用了以前复制的jar包中的ZkCLI程序进行一个指定文件夹的 upconfig 工做
4:执行命令
java -classpath D:\\uploadCloud\\ClientLib\\* org.apache.solr.cloud.ZkCLI -cmd
linkconfig -collection collection -confname myconf -zkhost 127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183
该命令是将刚刚上传的配置文件命名为一个collection对象
访问刚刚配置的solr服务器
http://127.0.0.1:8081/solr/admin/collections?action=CREATE&name=collection1&numShards=3&replicationFactor=3&maxShardsPerNode=3
name:collection的名称
numShards:指定分片数量(slices)
replicationFactor:副本数量
maxShardsPerNode:默认值为1,注意三个数值:numShards、replicationFactor、liveSolrNode,一个正常的solrCloud集群不允许同一个liveSolrNode上部署同一个shard的多个replic,所以当maxShardsPerNode=1时,numShards*replicationFactor>liveSolrNode时,报错。所以正确时因知足如下条件: numShards*replicationFactor<liveSolrNode*maxShardsPerNode
createNodeSet:
collection.configName:指定该collection使用那份config,这份config必须存在于zk中。
集中式的配置信息使用ZK进行集中配置
启动时能够指定把Solr的相关配置文件上传Zookeeper,多机器共用。这些ZK中的配置不会再拿到本地缓存,Solr直接读取ZK中的配置信息。配置文件的变更,全部机器均可以感知到。另外,Solr的一些任务也是经过ZK做为媒介发布的。目的是为了容错。接收到任务,但在执行任务时崩溃的机器,在重启后,或者集群选出候选者时,能够再次执行这个未完成的任务。
自动容错SolrCloud对索引分片,并对每一个分片建立多个Replication
每一个Replication均可以对外提供服务
一个Replication挂掉不会影响索引服务。更强大的是,它还能自动的在其它机器上帮你把失败机器上的索引Replication重建并投入使用。
近实时搜索
当即推送式的replication(也支持慢推送)。能够在秒内检索到新加入索引。
均衡查询压力 查询时自动负载均衡SolrCloud索引的多个Replication能够分布在多台机器上 若是查询压力大,能够经过扩展机器,增长Replication来减缓。
自动分发的索引和索引分片发送文档到任何节点,它都会转发到正确节点。
事务日志事务日志确保更新无丢失,即便文档没有索引到磁盘。
索引存储在HDFS上索引的大小一般在G和几十G,上百G的不多,这样的功能或许很难实用。 可是,若是你有上亿数据来建索引的话,也是能够考虑一下的。 我以为这个功能最大的好处或许就是和下面这个“经过MR批量建立索引”联合实用。
经过MR批量建立索引 有了这个功能,你还担忧建立索引慢吗?
强大的RESTful API一般你能想到的管理功能,均可以经过此API方式调用。这样写一些维护和管理脚本就方便多了。
优秀的管理界面主要信息一目了然;能够清晰的以图形化方式看到SolrCloud的部署分布;固然还有不可或缺的Debug功能。