MySQL高可用架构通过是通过异步复制,半同步复制、组复制来实现。
早期MySQL未提供高可用自动故障切换工具,主要是第三方工具如:MHA,orchestrator
V5.7开始MySQL Group Replication 开始GA,可以选择MGR+ProxySQL
V8.0开始MySQL提供Innodb Cluster,Innodb ReplicaSet,Innodb ClusterSet 等方案
MYSQL复制
异步复制Asynchronous Replication
异步复制:write binlog后 dump thread读取event异步发送slave ,无需确认
半同步复制Semisynchronous Replication
半同步复制:semi-sync replication主库需等待至少一个从库ack确认才返回client事务提交。
实现方式按innodb commit 不同时间点(rpl_semi_sync_master_wait_point)又分为2种
V5.6 半同步 after_commit
innodb prepare ->binlog write->send binlog to slave-> binlog sync -> innodb redo commit -> wait ACK ->client receive OK
注:master没等从库ack确认就在innodb commit,其他session可读到提交数据,一旦切换且从库未接收数据,即对于其他session产生幻读丢数据,无法保障主从一致性; wait ack after innodb commit
V5.7增强半同步 after_sync
innodb prepare ->binlog write->send binlog to slave-> binlog sync ->wait ACK ->innodb redo commit ->client receive OK
注:master等从库ack确认再innodb commit,保障主从一致性; wait ack after send binlog to slave;存在存储引擎层面多了数据的可能:master在等ack确认前crash,binlog已经同步到slave,在client层看slave相对于master多了记录,但master crash recovery也是基于binlog 完整性来提交,这点是对client不友好
群组复制Group Replication
shared-nothing replication scheme:无共享复制方案是一组服务器每个都有完整的副本,组复制是靠消息广播、多数节点验证(基于write set无冲突提交,或冲突本地回滚,其他节点抛弃消息,不同节点并发提交的行冲突事务基于global order先提交先成功)、生成binlog/relay,非本地节点 apply event
binlog_transaction_dependency_tracking
COMMIT_ORDER 基于master 并发提交(同时进入flush,sync区间),在slave并发apply
WRITESET 更新行唯一标识hash value,在slave检查是否写冲突无冲突则并发apply
WRITESET_SESSION 不允许来自同一会话的事务并行执行
高可用架构
常用的MYSQL高可用架构
MHA
Orchestrator
MGR 5.7
InnoDB Cluster
InnoDB ReplicaSet
InnoDB ClusterSet
Mysql高可用组件
1.MySQL Router 透明客户端连接路由、负责故障转移、负载均衡等,常用于Cluster、ReplicaSet、ClusterSet等高可用解决方案
2.MySQL Shell 数据库管理接口
3.MySQL Server
MHA
注:自动故障切换,manager可以管理多套集群(100+),尽量保持不丢数据(依赖半同步,binlog补偿)
缺点:ssh互信存安全隐患,最后更新时间2018 年
Orchestrator
注:自动故障切换,manager可以管理多套集群,尽量保持不丢数据(依赖半同步,binlog补偿),工具本身高可用,web界面,提供了GUI,CLI,API等接口来检查复制拓扑
缺点:ssh互信存安全隐患,最后更新时间2021年
InnoDB Cluster
注:基于MySQL Group Replication,支持故障自动切换,支持单主/多主模式
简单说就是集成了mysql shell+mysql router+mysql server的组复制解决方案
InnoDB ReplicaSet
注:基于MySQL Replication,不支持故障自动切换,不支持多主模式,只支持基于行复制RBR,只支持GTID,只能是 mysql shell管理;mysql shell8.0.28之后版本创建ReplicaSet。
简单说就是集成了mysql shell+mysql router+mysql server的异步复制解决方案,多用于灾备环境
InnoDB ClusterSet
注:基于MySQL Replication,不支持故障自动切换,不支持多主模式,只支持基于行复制RBR,只支持GTID,只能是 mysql shell管理;mysql shell8.0.28之后版本创建ReplicaSet。
MySQL InnoDB ClusterSet provides disaster tolerance for InnoDB Cluster deployments by linking a primary InnoDB Cluster with one or more replicas of itself in different datacenters
简单说就是集成了InnoDB Cluster+InnoDB ReplicaSet的多数据中心灾备解决方案
参考:
Chapter 17 Group Replication
MySQL :: Improving the Parallel Applier with Writeset-based Dependency Tracking