稳定性相关的,要么不做,要么就要完善,要不然做了高可用,反而造成雪崩。高可用必备 fence,fence 就是 ipmi 强制关机,这是最稳妥的方式。
核心:高可用要么不做,要么做完善
稳定性相关的,要么不做,要么就要完善。
要不然做了高可用,反而造成雪崩。
比如一个 hyper 负载很高,本来可能 hyper 上个别业务有影响,结果触发灾难迁移,然后又迁移失败,反而导致多业务受影响,且恢复 2 天。哪个客户能接受!
比如我们的灾难,触发了,迁移到一半又发现空间不足,迁移失败。就是不完整嘛,能不能迁移,要提前规划好,不能迁移就不要动 hyper。告警通知给用户,用户自己处理。
半死不活的状态,客户更希望给他们通知,他们自己处理,而不是我们下线 hyper。
灾难当然复杂,尤其是半死不活的状态,就是薛定谔的猫,这种确实不好处理。
所以更需要多方参照开源系统的设计,看他们背后的考量和策略,结合我们自己的业务来系统性的设计,而不是打补丁式的缝缝补补。
比如增加超时时间,比如增加个 ping 检查,比如增加个本地自检。
高可用必备 fence
fence 就是 ipmi 强制关机,这就是最稳妥的方式。
其他方式都会有各种问题,且会带来其他复杂性。
比如自检,节点都有异常了,怎么保证自检能正常运行?
外部观察是通过网络观察的,所有网络如果有问题就会判断为有问题,这种情况自检是正常的,两者如何协作?
自检和外部检测是独立的,如果要协作就涉及到网络和协同,这两个本身就很复杂,再加上两个复杂的检测。
如果不协同,保持独立,那么两者的时间差会导致哪些状况?又是复杂场景。
如果采用集中式观察,采用 fence,这是业界主流的做法。
状态,状态,状态
这里面的要素是什么?
node 和资源,node 和资源的状态,非常非常重要。
要通过状态在分布式环境下协同控制。
状态,状态,状态。一定要围绕最终状态,一定要维护好最终状态,一定要确保最终状态的一致性、正确性。
然后其他机制都围绕最终状态设计。
这样通过最终状态,来解耦各种前因后果,解耦异常事件和恢复处理。
为什么这两个解耦非常重要?
因为异常事件千千万,不同的异常的恢复处理也不同,形成千丝万缕,一个网状复杂性。
但是通过状态来解耦后,各种异常回归到状态,状态再对应到恢复处理。这是一个港股,两头各种线,线性复杂性。
这其实又对应到 k8s 的声明式哲学。
在当前系统已有架构下,核心状态就是两个维度:
- node,状态:是否正常;
- vm,状态:属于哪个 node,是否应该运行。
node 可能无法期望,因为硬件可能客观因素故障。vm 是有期望状态的,比如期望是运行,实际是关机的。
小结
- 高可用要么不做,要么做完善,要不然做了高可用反而造成雪崩;
- 能不能迁移要提前规划好,不能迁移就不要动 hyper;
- 高可用必备 fence,fence 就是 ipmi 强制关机,这是最稳妥的方式;
- 状态,状态,状态,一定要围绕最终状态,维护好最终状态的一致性、正确性;
- 通过最终状态来解耦异常事件和恢复处理,把网状复杂性变成线性复杂性。