集群模式
Mysql数据库的集群方案通常包括主从复制、主主复制以及分片集群模式。
主从复制或者主主复制都是借助于Mysql的binlog同步实现数据在主从、主主不同节点之间的同步的。binlog中记录了mysql数据库执行的所有修改语句,比如insert ... update ... delete ... 等。通过同步主节点binlog到本节点relay log再进行sql语句的重放执行从而达到数据跟主节点的同步。
主从模式
主从复制模式下,通常主服务器承载写请求而从服务器承载读请求。可以视负载情况选择一主一从或者一主多从方式进行部署。binlog的同步方式如下图所示:
主从复制模式下,从节点会监听主节点binlog的变化,同步binglog到relay log中, 由同步线程重放执行relay log。 这样可以做到从节点数据跟主节点保持一致。但主从模式下存在主节点宕机后无法继续提供sql写服务,无法保持系统高可用。
主主模式
为了进一步提升系统的高可用,可以采用主主复制模式。采用双主模式避免某个节点(主节点)宕机导致写服务不可用。主主复制的模式如下图:
主主模式因为在数据同步中存在一致性问题。比如对同一条记录的并发更改发生在两个主节点中,先后顺序在binlog同步时可能存在先后顺序的问题导致数的最后状态不一致。所以,通常情况下主主模式也只有一个主提供写服务,而另一个主实质上是做热备。
分布式数据库
无论是主从模式还是主主模式都无法提高数据的存储(在一台数据库服务器上进行全量数据的存储)和写并发能力(一台主数据库承担应用的所有数据写请求)。 那如何提高数据存储能力和写请求处理能力呢? 通常会采用分片数据库集群的方式。通过对数据进行切分分别存储到不同的数据库服务器上。这样可以借助不同的数据库服务器组成分库集群为应用提供统一的数据库存储能力。这就是分布式数据库核心解决的问题。 当前主流的方式是client和server proxy方式实现数据库的分库分表。具有代表性的产品分别有sharding-jdbc和mycat,也都在业界得到了广泛的使用。具体sharding和mycat的能力在后续分享中进行单独的整理。