我们操作一个弹性搜索堆栈,该堆栈使用3个节点来存储日志数据。我们目前的配置是有3个主索引和1个副本索引。(我们刚刚关注了这个配置,对它的性能很满意,所以我们决定(还(不花时间进行优化(
在节点中断后(假设磁盘已满(,我观察到elasticsearch会自动将其碎片重新分配给剩余的实例——正如广告中所说的那样。
然而,这增加了剩余两个实例的磁盘使用量,使其成为级联故障的候选者。
日志数据的持久性并不重要。因此,我正在考虑重新配置弹性搜索,以便在节点中断后不创建新的副本。相反,它只能在初选中运行。这意味着在单节点中断后,我们将在没有冗余的情况下运行。但这似乎比一连串的失败要好。(这是一次性成本(
另一种选择是增加磁盘大小。(这是一项持续成本(
我的问题
(如何(在第一个节点出现故障后,我可以将弹性搜索配置为不创建新的副本?或者这被认为是一个坏主意,而规范的方法只是增加磁盘容量?
重新平衡成本高昂
当一个节点离开集群时,在剩下的节点上会产生一些额外的负载:
- 将副本碎片升级为主碎片,以替换节点上的任何主碎片
- 分配副本碎片以替换丢失的副本(假设有足够的节点(
- 在剩余节点上均匀地重新平衡碎片
这可能会导致相当多的数据四处移动。
有时,节点只会在短时间内丢失。在这种情况下,完全重新平衡是不合理的。考虑到这一点,当一个节点宕机时,elasticsearch会立即将丢失节点上的每个主节点的副本碎片提升为主节点,,但它会等待一分钟,然后再创建新的副本,以避免不必要的复制。
仅在需要时重新平衡
这种延迟的持续时间是一种折衷,因此可以进行配置。等待时间越长意味着无用复制的机会越少,但由于冗余减少,停机的机会也越大。
将延迟时间增加到几个小时就得到了我想要的结果。这给了我们的工程师一些时间做出反应,在额外的再平衡负载产生级联故障之前。
我从官方的弹性搜索文档中了解到了这一点。