业务提了一个需求:我们系统很重要,服务不能中断。
我们现在的系统,是两套应用程序连接一套主从数据库,蓝绿环境部署步骤为:
1. 新版本代码部署到绿环境;
2. 绿环境连接从库;
3. 从库和主库脱离主从关系;
4. 生产流量指向绿环境;
5. 当天绿环境单节点运行,凌晨完成主从数据同步,再次建立主从关系;(此时原从库成为现主库);
业务说,不行,你晚上主从数据同步要停机,不能满足我服务不中断的需求。
但这很难满足。无论生产流量指向蓝环境还是绿环境,两个环境必然存在数据差异,想要抹平这个差异,只能保证一致性或可用性:
- 保证一致性,是指当次数据操作马上同步到两个环境,涉及数据通信存在的时间差,则整体响应性能下降,亦即保证不了可用性;
- 保证可用性,是指当次数据操作马上响应,那也只是存到了单节点,其他节点数据和这个节点数据不一样,亦即保证不了一致性;
我们要A还是要C?Web业务系统面向用户,用户可等不了平台慢吞吞响应,我们可以优先保障可用性,也会引发一些问题:
1. 数据不一致引起的问题。蓝绿环境数据差异,极端情况存在用户数据不一致、订单数据不一致等情况,这种情况的解决办法包括:
- 可以联合业务优化业务流程;
- 也可以谈一些可接受的数据丢弃;
- 异常情况作日志保存,后续异步重试;
- 确实搞不了的重要业务数据,那就要舍弃可用性保障一致性了,也就是保存慢一点;
2. 为保障一致性引起的临时停机。绿环境在流量切换当晚会和蓝环境数据库作数据同步,重新建立主从关系,这个过程需要停机,也是某程度上的为保证一致性牺牲可用性。
但最重要的是什么?是研发和业务的沟通。一来要阐述需求无法直接满足的原因,二来要联合业务改业务流程,做部分流程的重新设计。这些过程都极容易消磨业务人员的耐心,反之,开发团队了解这个原则却和可能不容易和业务人员说通,也在消磨开发团队的耐心。