使用 solrcloud 中的副本从单个分片丢失中恢复

Recoverying from single shard loss with replica in solrcloud

我有一个 solrcloud 集群,它在 6 个节点上有一个 RF=2 和 NumShards=3 的集合。我们想测试如何从分片丢失等意外情况中恢复。所以我们可能会在副本或主服务器之一的 solr 数据目录上执行 rm -rf。 现在的问题是,这个被切分的节点将如何从分片丢失中恢复过来?是否需要手动步骤(如果是,那么需要做什么),还是会自动从副本中恢复?

您尚未指定 solr 版本,但这里是一些概念的概要:

  1. SolrCloud 在两个地方记录集群状态。节点的本地磁盘,在 ZooKeeper 中。当 Solr 在节点上启动时,它会扫描其本地磁盘以查找 solr "Cores"(副本,在这种情况下),如果找到任何副本,它会在 ZK 中注册自己作为该副本的服务。如果根据 ZK,它不是该副本的分片领导者,它将在开始服务流量之前从领导者同步自身。

  2. Leader(我在这里避免使用 Master/Slave 术语,因为它通常用于非 solrcloud 设置)对于分片来说是一个短暂的角色。如果领导者下台,非领导者将被选为新的领导者,生活继续。如果以前的 Leader 回来了,那么它现在就不是 Leader 了。通常你不需要关心哪个副本是领导者。

  3. SolrCloud 通常不会自动分配副本。你明确地告诉它你想要的东西在哪里。

鉴于这些,您的意图 "failure mode" 有点有趣。从 运行 JVM 中删除文件可能不会有太大作用。 JVM 对所有索引文件都有一个打开的文件句柄,因此即使您删除了引用,OS 也无法清除它们。事情可能会继续正常进行,直到下一次 Solr 需要将一个新的段文件写入一个不再存在的目录时,这时事情就会爆炸。我不知道具体是什么。

如果您停止 Solr,删除目录,然后重新启动 Solr - 您已经删除了该 Solr 节点参与任何索引的信息。 Solr 将出现并加入集群,并且不托管任何分片的任何副本。您可能需要 ADDREPLICA 才能将其放回去。