背景:我刚读完Apache Solr 4 Cookbook。在其中作者提到,设置分片需要明智地完成,而b / c新的分片无法添加到现有的群集中。但是,这是使用Solr 4.0编写的,目前我使用的是4.1。这仍然是这样吗?我希望我没有找到这个issue,我希望别人可以告诉我。
问题:我是否希望知道在SolrCloud群集中设置分片时我将来会存储多少数据? 我曾与Solandra一起玩过并在elastic search上阅读,但老实说,我是Solr的粉丝(以及它的大社区!)。我也喜欢Zookeeper。我现在卡住了还是有解决方法/补丁?
编辑 如果上面的问题是“否”,我是否可以使用一堆(可能是100个或更多)分片构建SolrCloud并让它们(内部)增长,而我增长我的数据开始逐个剥离它们并将它们放入更大,更快的服务器中并拥有更多资源?
答案 0 :(得分:6)
是的,当然可以。您必须设置指向同一zookeeper实例的新Solr服务器。在引导期间,服务器连接到zk ensemble并将其自身注册为集群成员。
注册过程完成后,服务器就可以创建新的核心了。您可以使用CoreAdmin创建现有分片的副本。您也可以创建新的分片,但由于Lucene索引格式(并非所有字段都存储),它们将无法平衡,因为它可能没有重新平衡群集的所有文档信息,因此只有新的索引/更新文档才能到达这个服务器(这样做是不可取的)。
当您设置SolrCloud时,您必须考虑到文档编号增长因子来创建群集,因此如果您最初有1M个文档并且它增长为10k docs / day,则设置具有5个分片的群集,因此在开始时您必须在两台计算机的初始设置中托管此分片,但在将来,根据需要,您可以向群集添加新服务器并move those shards to this new servers。小心不要过度增加群集,因为在Lucene中,在5个分片中分割的单个20Gb索引在每个分片中都不是4Gb索引。每个分片将占用大约(single_index_size / num_shards)* 1.1(由于字典压缩)。这可能会根据您的学期频率而改变。
您最后一次机会是将新服务器添加到群集中,而不是将新分片/副本添加到现有服务器,使用新分片设置新的不同集合,并与此新集合并行重新索引。然后,一旦您的reindex过程完成,交换此集合和旧集合。
答案 1 :(得分:3)
问题的一个解决方案是在创建集合时使用“隐式路由器”。
让我们说 - 您必须将应用程序的所有“审计跟踪”数据编入索尔。每天都会添加新数据。你可能最想在一年之前进行分片。
在初次设置收藏时,您可以执行以下操作:
admin/collections?
action=CREATE&
name=AuditTrailIndex&
router.name=implicit&
shards=2010,2011,2012,2013,2014&
router.field=year
以上命令: a)创建5个分片 - 当前和最后4年各一个2010,2011,2012,2013,2014 b)根据“年”字段的值(指定为router.field)将数据路由到正确的分片
2014年12月,您可以使用CREATESHARD API(Collections API的一部分)添加新的分片以准备2015年 - 执行以下操作:
/admin/collections?
action=CREATESHARD&
shard=2015&
collection=AuditTrailIndex
上面的命令在同一个集合上创建一个新的分片。
2015年时,假设您的数据在2015年正确填充“年”字段,所有数据将自动编入“2015”分片。
2015年,如果您认为自己不需要2010分片(基于数据保留要求) - 您可以随时使用DELETESHARD API:
/admin/collections?
action=DELETESHARD&
shard=2015&
collection=AuditTrailIndex
P.S。此解决方案仅在您创建集合时使用“隐式路由器”时才有效。使用默认的“compositeId路由器”时不起作用 - 即使用numshards参数创建的集合。
此功能真正改变了游戏规则 - 允许根据您业务不断增长的需求动态添加分片。