上一篇《数据库扩展性架构实践》聊的是数据库架构设计中的scalability实践,并没有解决availability与consistency的问题。
数据库架构设计的过程中,如何折衷高可用与一致性的问题呢?
前面的文章聊过,高可用的核心方法论是:冗余(replication) + 故障自动转移(fail-over)。
最容易想到的,是数据库主从集群,每份数据都进行复制,每个实例都独享 DISK/MEM/CPU 资源,避免实例之间的资源竞争。
(1)把整体数据存储分复制了N份,每份之间数据都一样;(2)每份数据的 DISK/MEM/CPU 都在一个DBMS进程内,部署在一台服务器上;理想很丰满,现实很骨感,思路没问题,但实际执行“复制”的过程中,会碰到一些问题。第一种,异步复制(Asynchronous Replication)又叫主从复制(Primary-Secondary Replication),是互联网公司用的最多的数据复制与数据库集群化方法,它的思路是,从库执行串行化后的主库事务。是并行执行的,主库并不能保证从库的事务一定执行成功,甚至不能保证从库一定收到相关的请求,这也是其称作“异步复制”的原因。第二种,半同步复制(Semi-synchronous Replication)为了解决异步复制中“不能保证从库一定收到请求”等问题,对异步复制做了升级。(2)从库收到请求后,事务提交前,会给主库一个ACK;(1)主库的性能,会受到较大的影响,事务提交之前,中间至少要等待2个主从之间的网络TTL;大数据量,高并发量的互联网业务,一般不使用“半同步复制”,更多的公司仍然使用“异步复制”的模式。最后是MySQL5.7里,新提出的MySQL组复制。第三种,组复制(MySQL Group Replication,MGR)(1)解决了单点写入的问题,一个分组内的所有节点都能够写入;(2)最终一致性,缓解了一致性问题,可以认为大部分实例的数据都是最新的;(3)高可用,系统故障时(即使是脑裂),系统依然可用;(1)首先,分组内的MySQL实例不再是“主从”关系,而是对等的“成员”关系,故每个节点都可以写入;(2)其次,增加了一个协商共识的认证(certify)环节,多数节点达成一致的事务才能提交;结尾稍作总结,为了折衷数据库高可用,一致性,性能等架构设计要素,一般有三类常见复制方式:(3)组复制,MySQL 5.7的新功能,核心在于分布式共识算法;https://cs.fyi/guide/consistency-patterns-week-strong-eventual
23年1月一篇关于一致性架构模式的短文,10分钟读完。我将以短视频+图文+直播+星球社群的形式,系统性的分享架构设计中的100个相关知识点,欢迎感兴趣的童鞋关注。平台对专业内容不推流,大家多帮忙标星,以及点赞,转发,在看三连。感谢!