目前我有一个zookeeper实例控制3台服务器上的复制.它是solr集成的动物园管理员.它在我的基于Web的应用程序中运行良好.
我有一个新的要求,需要在云中进行分片,我不知道如何实现它.基本上我想分离只能由我更新的数据,分片1,用户可以更新的数据,分片2.我会不时地完全替换分片1中的数据目录 – 但我不是想要打扰碎片2中用户创建的数据.
Shard 1不需要复制,因为当我选择更新它时,我可以将新数据复制到每个服务器,但是shard 2确实需要复制.
目前我在运行zookeeper的服务器上运行以下命令 –
java -Dbootstrap_confdir=solr/myApp/conf -Dcollection.configName=myConfig -DzkRun -DnumShards=1 -jar start.jar
以及其他2个非zookeeper服务器上的以下命令
java -Djetty-port=8983 -DzkHost=129.**.30.11:9983 -jar start.jar&
这将创建一个分片solr实例* 3
我想我只需要在这个配置中添加1个静态分片,但是我不确定完成它的命令序列.
非常感谢
最佳答案 首先,您使用zookeeper来维护您的分片和领导者/复制品.因此,如果您希望一个分片有两个实例而另一个分片只有一个分支,那么您将必须修改您的命令:
1)提供-DnumShards = 2,以便zookeeper知道你需要两个分片
2)也为第一个solr实例指定-DzkHost参数.
java -Dbootstrap_confdir=solr/myApp/conf -Dcollection.configName=myConfig -DzkRun -DnumShards=2 -DzkHost=** -jar start.jar
执行此操作时,您将在控制台上看到一些错误,因为尚未创建shard2.
现在启动另外两台服务器,您应该看到一个带有两个服务器(leader和replica)的shard1,而shard2只有一个实例,即leader
如果要分离索引并控制这些索引.您必须创建两个集合而不是两个分片.
Explanation
你有3台服务器!所以当你使用zookeeper启动solrCloud时.以下事情将发生在:
1)启动第一个solr服务器和zookeeper,你将获得1个shard作为shard1的shard
2)启动第二个solr服务器并指向zookeeper …因为你声明了DnumShards = 2,Zookeeper将检查它是否需要再创建一个碎片,所以它会为你的集合创建shard2.到现在为止,您将能够看到您的管理控制台有2个分片,可用于1个集合.
3)现在启动你的第3台服务器并将其指向zookeeper,现在zookeeper看到2个分片在那里,所以现在它将为shard1而不是新的分片创建一个副本.
所以它会像
收集—> shard1 —> server1的,服务器3
--->shard2--->server2