2

背景:我刚读完Apache Solr 4 Cookbook。作者在其中提到需要明智地设置分片,因为不能将新的分片添加到现有集群中。但是,这是使用 Solr 4.0 编写的,目前我使用的是 4.1。现在还是这样吗?我希望我没有发现这个问题,我希望有人可以告诉我。

问题:在 SolrCloud 集群中设置分片时,我是否应该知道将来要存储多少数据?我玩过Solandra并阅读过弹性搜索,但老实说,我是 Solr 的粉丝(以及它的大型社区!)。我也喜欢动物园管理员。我现在卡住了还是有解决方法/补丁?

编辑:如果上面的问题是否定的,我可以用一堆(可能是 100 个或更多)分片构建一个 SolrCloud 并让它们(内部)增长,而当我增长我的数据时,我开始将它们一个一个剥离并放入更大、更快拥有更多资源的服务器?

4

2 回答 2

6

是的,当然可以。您必须设置一个指向同一个 zookeeper 实例的新 Solr 服务器。在引导期间,服务器连接到 zk ensemble 并将自己注册为集群成员。

注册过程完成后,服务器就可以创建新内核了。您可以使用CoreAdmin创建现有分片的副本。您也可以创建新的分片,但由于 Lucene 索引格式(并非所有字段都存储),它们不会被平衡,因为它可能没有所有文档信息来重新平衡集群,所以只有新的索引/更新的文档才能到达此服务器(不推荐这样做)。

当您设置 SolrCloud 时,您必须在考虑文档数量增长因素的情况下创建集群,因此如果您一开始有 1M 文档并且它以 10k 文档/天的速度增长,请使用 5 个分片设置集群,所以在开始时您必须在您的两台机器初始设置中托管此分片,但将来,您可以根据需要将新服务器添加到集群并将这些分片移动到此新服务器。注意不要让集群过度增长,因为在 Lucene 中,跨 5 个分片拆分的单个 20Gb 索引不会是每个分片中的 4Gb 索引。每个分片大约需要 (single_index_size/num_shards)*1.1(由于字典压缩)。这可能会根据您的术语频率而改变。

您最后的机会是将新服务器添加到集群中,而不是向现有服务器添加新的分片/副本,而是使用您的新分片设置一个新的不同集合,并与这个新集合并行重新索引。然后,一旦你的重新索引过程完成,交换这个集合和旧的集合。

于 2013-02-09T08:33:48.607 回答
3

该问题的一种解决方案是在创建集合时使用“隐式路由器”。

可以说 - 您必须将应用程序的所有“审计跟踪”数据索引到 Solr。每天都会添加新数据。您很可能希望按年分片。

您可以在集合的初始设置期间执行以下操作:

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) 根据“年份”字段的值将数据路由到正确的分片(指定为路由器.字段)

在 2014 年 12 月,您可能会使用 CREATESHARD API(集合 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

PS 此解决方案仅在您在创建收藏时使用“隐式路由器”时才有效。当您使用默认的“compositeId 路由器”时不起作用 - 即使用 numshards 参数创建的集合。

此功能真正改变了游戏规则 - 允许根据您业务不断增长的需求动态添加分片。

于 2014-02-22T14:02:01.990 回答