solrCloud搭建笔记

把搭建solrCloud的笔记写在这,方便我,也能方便你。

我是在windows上搭建的,但是zk是linux上。我一共使用了三个solrCloud的server,共两个shard,每个server都部署在一个单独的tomcat上。我本地的host是:172.16.140.55,我的linux的host是172.16.9.2。我的假设是已经会搭建单机的solr,所以关于搭建单机的solr的步骤我也不会重复。我使用的solr的版本是4.9.0,zk的版本是3.4.6.

1、先搭建zk,这里不再重复记录,不会的看看别人的博客,或者是官方文档。我搭建后的zk的集群只有一个节点,是个单机模式的,他的端口是52181,所以访问zk是 172.16.9.2:52181

2、配置windows的classpath,这个地方是供以后的使用zk客户端上传配置文件用的,在windows上如果不配置的话会报一个找不到ZkClient类的异常,找到之前在创建单机的solr的Tomcat/webapps/solr/WEB-INF/lib的目录,我这里是E:\tomcat7\webapps\solr4\WEB-INF\lib\,在这后面添加\*,也就是E:\tomcat7\webapps\solr4\WEB-INF\lib\*,然后将这个字符串放在CLASSPATH后面。

3、上传配置文件到zk 执行命令为: java org.apache.solr.cloud.ZkCLI -cmd upconfig -zkhost 172.16.9.2:52181 -confdir  E:/solrCloud/solrHome-2/collection1/conf -confname conf_prod 解释一下他的意思:java  java org.apache.solr.cloud.ZkCLI表示执行一个main方法,这个main方法在.ZkCLI类中(所以在第2步中配置classpath),-cmd upconfig表示要执行的操作是配置文件上传;-confdir  E:/solrCloud/solrHome-2/collection1/conf 表示要上传的配置文件的目录,他会将这个目录下面的所有的文件都上传到zk上,具体要看你的配置文件的位置,我这里只是一个距离(看完步骤三后再上传);-confname conf_prod 表示上传到zk之后所在的zk的节点的名字,可以随便起名。

这里需要注意的是并不是所有的配置文件都要上传的,即E:/solrCloud/solrHome-2/collection1/conf 的配置文件并不是全都需要被solrCloud使用的,我只保留了下面的文件(这个是我一个一个实验的,期初我只保留了solrconfig.xml和schema.xml但是在启动的时候不停地报错,直到我最终保留如下的文件才没有报错)

1、lang文件夹下面的所有的配置

2、currency.xml

3、elevate.xml

4、mapping-FoldToASCII.txt

5、mapping-ISOLatin1Accent.txt

6、protwords.txt

7、schema.xml

8、scripts.conf

9、solrconfig.xml

10、spelling.txt

11、stopwords.txt

12、synonyms.txt

这里的collection1是solr自带的,我还没有改动(后面我会改变collection的名字为prod),上传配置文件后,可以在zk客户端执行ls /configs,可以发现多了个node叫做conf_prod,它里面包含所有的配置文件。

4、关联要创建的集合和配置文件。这里假设我们要建立的索引是商品,用prod表示,那么我们创建的集合(collection)就是prod,(所以上面我才给配置文件起名字叫做conf_prod)。执行的命令是:  java org.apache.solr.cloud.ZkCLI -cmd linkconfig -collection prod -confname conf_prod -zkhost 172.16.9.2:52181。解释一下:java  org.apache.solr.cloud.ZkCLI还是执行一个main方法,-cmd linkconf表示执行的命令是关联配置文件,-collection prod表示要关联的集合是prod这个集合;-confname conf_prod表示要关联的配置文件是conf_prod -zkhost 172.16.9.2:52181表示zk的位置。这样这个命令执行之后就把prod这个集合和他的配置文件都关联了。当然我们现在还没有创建prod这个集合(collection)。

在执行完这个命令之后,可以到zk上发现又多了一个节点,叫做collections,它里面就有一个prod的节点,调用get /collections/prod后展示为:

get /collections/prod
{"configName":"conf_prod"}
cZxid = 0x5b9
ctime = Sun Dec 04 13:37:45 CST 2016
mZxid = 0x5b9
mtime = Sun Dec 04 13:37:45 CST 2016(后面还有,我们有全部复制)

可以发现配置文件为 “conf_prod”

5、修改solr.xml,这里有一个很重要的属性要修改,<int name="hostPort">${jetty.port:8081}</int>,将jetty.port后面的8983改为你实际的tomcat的端口号,如果不改不会报错,但是整个集群无法使用,除非你的tomcat就是运行在

8983端口上,也可以直接将${jetty.port:8983}替换为8081。

执行完这些最好启动单机版的solr试试,也就是启动tomcat,这样可以检查有没有其他的配置错误。如果没有报错,继续。

还要添加一个zk的配置<str name="zkHost">172.16.9.2:52181</str>,这样就不用在启动参数中添加了。最终我的solr.xml的配置为:

	<solr>
		<solrcloud>
			<str name="host">${host:}</str>
			<int name="hostPort">8081</int>
			<str name="hostContext">${hostContext:solr}</str>
			<int name="zkClientTimeout">${zkClientTimeout:30000}</int>
			<bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool>
			<str name="zkHost">172.16.9.2:52181</str>
	    </solrcloud>

		<shardHandlerFactory name="shardHandlerFactory"
			class="HttpShardHandlerFactory">
			<int name="socketTimeout">${socketTimeout:0}</int>
			<int name="connTimeout">${connTimeout:0}</int>
		</shardHandlerFactory>
	 </solr>

6、将solr自带的集合collection1改名为prod,将其配置文件conf下的所有东西都删了(戴着也可以,反正用的配置文件是zk上的)。修改tomcat的catalina.bat,在setlocal的下一行添加  set JAVA_OPTS=-server -Xmx256m -Xms256m  -DnumShards=2 (记住等号后面没有双引号,我开始不停的失败,后来把双引号去了就好了,使用的堆的大小随便你定,最后的参数表示分片的个数,随便定)  他表示我要创建的collection的分片有2个,然后启动startup.bat,在启动后的日志里就会有当前的节点的状态,最重要的有:

1、base_url,即当前节点的访问url路径 

2、collection 及当前的节点所属的collection  

3、shard:当前节点所属于的分片。

4、numShard:分片的个数

在启动第一个tomcat之后,可以到zk中查看多了一个节点,叫做clusterstate.json,表示集群的状态,在配置两个分片的情况下,调用 get /clusterstate.json 他是这样显示的:

{"prod":{
	"shards":{
	  "shard1":{
		"range":"80000000-ffffffff",
		"state":"active",
		"replicas":{"core_node1":{
			"state":"active",
			"base_url":"http://172.16.140.55:8081/solr",
			"core":"prod",
			"node_name":"172.16.140.55:8081_solr",
			"leader":"true"}}},
	  "shard2":{
		"range":"0-7fffffff",
		"state":"active",
		"replicas":{}}
	},
	"maxShardsPerNode":"1",
	"router":{"name":"compositeId"},
	"replicationFactor":"1",
	"autoCreated":"true"}
}

  可以发现如果指定了分区的个数,就会生成指定个数的shard,因为已经启动了一个tomcat,所以第一个shard是有值的,而第二个shard是没有值的。

7、启动第二个tomcat,(在启动之前先修改端口,将shutdown的端口、http、ajp的的端口都改了,不然启动报错,还有别忘了改你的solr的web.xml中的solrHome,还有别忘了改你的collection1的名字,改为prod,再就是catalina.xml中的-DnumShard要删了,因为在zk中已经有这个分片的值了,还有比忘了修改solr.xml中的host和zk的配置,上面已经说了),然后启动第二个tomcat。启动之后的clusterstate.json为:

{"prod":
	{"shards":
		{"shard1":{
			"range":"80000000-ffffffff",
			"state":"active",
			"replicas":{"core_node1":{
				"state":"active",
				"base_url":"http://172.16.140.55:8081/solr",
				"core":"prod",
				"node_name":"172.16.140.55:8081_solr",
				"leader":"true"}}},
		  "shard2":{
			"range":"0-7fffffff",
			"state":"active",
			"replicas":{"core_node2":{
				"state":"active",
				"base_url":"http://172.16.140.55:8082/solr",
				"core":"prod",
				"node_name":"172.16.140.55:8082_solr",
				"leader":"true"}}}
		},
		"maxShardsPerNode":"1",
		"router":{"name":"compositeId"},
		"replicationFactor":"1",
		"autoCreated":"true"
	}
}

 可以发现shard2已经有值了,因为我们启动了第二个server。这个时候可以去solr的管理页面的cloud去看看,已经有两个shard两个server,并且都是leader。

7、启动第三个tomcat,需要注意的问题和6中的一致。启动之后查看zk中的clusterstate.json的显示为

	{"prod":{
    "shards":{
      "shard1":{
        "range":"80000000-ffffffff",
        "state":"active",
        "replicas":{
          "core_node1":{
            "state":"active",
            "base_url":"http://172.16.140.55:8081/solr",
            "core":"prod",
            "node_name":"172.16.140.55:8081_solr",
            "leader":"true"},
          "core_node3":{
            "state":"active",
            "base_url":"http://172.16.140.55:8083/solr",
            "core":"prod",
            "node_name":"172.16.140.55:8083_solr"}}},
      "shard2":{
        "range":"0-7fffffff",
        "state":"active",
        "replicas":{"core_node2":{
            "state":"active",
            "base_url":"http://172.16.140.55:8082/solr",
            "core":"prod",
            "node_name":"172.16.140.55:8082_solr",
            "leader":"true"}}}},
    "maxShardsPerNode":"1",
    "router":{"name":"compositeId"},
    "replicationFactor":"1",
    "autoCreated":"true"}}

 在shard1的replicas中多了一个node,也就是刚才启动的server3.这个时候再次看一下solr的cloud的界面,就会有三个server,其中两主一从,他的从的排序也是按照先给第一个shard,然后再给第二个shard,也就是按照轮训的原则来的。solrCloud这样就算搭建完了,我们搭建了一个名字叫做prod的集群,有两个分区。

猜你喜欢

转载自suichangkele.iteye.com/blog/2342738