事故的主要原因可以归结为:
1. 数据库的Active角色在不应该发生failover切换时,进行了切换。 First, several failovers of the 'active' database role happened when they shouldn't have.
2. 数据库集群发生了脑裂,导致集群管理软件(Pacemaker+HeartBeat)做了错误的操作。Second, a cluster partition occurred that resulted in incorrect actions being performed by our cluster management software.
3. 前两点中提到的Failover切换,造成了比预计情况更恶劣的性能问题。Finally, the failovers triggered by these first two events impacted performance and availability more than they should have
问题一:现有的HA软件是否可靠,可信?是否在正确的时候做了正确的判断和操作?
GitHub团队认为:The automated failover of our main production database could be described as the root cause of both of these downtime events.
而对于这个问题,我的想法和 Xaprd的观点 一致:事故的关键在于现有的HA软件都没法照顾到所有可能发生的情况,以至于在某些情况下的行为是不可预测的,或者非我们所想的。
因此一味的将切换操作置成手工模式,虽然避免了风险,但显然没有很好的使用HA软件所提供的service。
个人想法是,对于一些原因明确且有明确cookbook的事故,可以让HA去完成failover。而对于那些需要人工介入分析故障原因的事故,做手工切换,如果github遇到的timeout等。
当然这个只是理想情况,目前真正能够通过配置case决策的HA软件还并不存在。
因此,保守原则还是一个比较推荐的办法,即:HA部署完成后先切入手工模式,前几次failover通过阅读报错日志后手工处理。在几次production实践之后再认为此HA架构是可信的,并切入自动模式。