上期文章介绍了 InstanceSet,同时也介绍了 InstanceSet 针对数据库高可用等需求衍生出的一系列特性。本期我们将介绍 指定实例下线 这一特性,一起来了解这一特性诞生的背景和使用方式吧~
指定实例下线解决了什么问题?
早期版本中,KubeBlocks 最终生成的 Workload 是 StatefulSet,这是一把双刃剑。一方面,KubeBlocks 可以借助 StatefulSet 实现对数据库等有状态应用的管理,另一方面,这也导致 KubeBlocks 继承了 StatefulSet 的局限性。
其中的局限性之一是,在水平缩容场景下,StatefulSet 会按照 Ordinal 顺序从大到小依次下线 Pod。当 StatefulSet 中运行的是数据库时,这个局限性会使得数据库的可用性降低。
我们来分析这样一个场景:比如我们用 StatefulSet 管理了一个一主两从这样的三副本 PostgreSQL 数据库,这个 StatefulSet 的名字叫 foo-bar
,运行一段时间后,名字为 foo-bar-2
的 Pod 成了主节点。
某一天,通过分析我们发现这个数据库的读负载并不是很高,为了节省资源,我们计划对这个数据库进行缩容,下线一个从节点。此时问题来了,按照 StatefulSet 的规则,我们只能下线 foo-bar-2
这个 Pod,但不幸的是它当前是主节点。此时我们有两个选择:要么直接下线 foo-bar-2
,通过 failover 机制,在 foo-bar-0