2023-12-19 11:19:49 42阅读
高可用系统的建设,不是单纯的技术设计考究,而是所有团队的工程化配合:除了考虑产品的SLA诉求,还需要考虑研发的迭代效率、运维的操作能力和整体的成本预算。
可以确定的是,SLA等级、成本花费和技术复杂度是成正比的,不是所有的业务都需要“5个9”的可用性,所以我们会对业务进行分层,在各方面取舍,最终形成某些解决范式。MySQL也是如此,针对不同的SLA要求,官方提供了不同的解决方案:
[图片来源:MySQL High Availability Solutions]
撇开不能横向扩展(Scale-out)的方式,MySQL高可用的基本方法有复制(MySQL Replication)和集群(MySQL Cluster)两种类型,细分下来有:
Replication是MySQL官方提供的主从同步实现,基于异步复制的主备集群是应用最广的MySQL高可用容灾方案,它有以下优点:
Replication的基本原理是基于变更日志(Binary log)的事件(Replicating event)重放,有如下线程模型和行为:
除此之外,在MySQL 5.6.5版本增加了一种基于全局事务标识(GTID,Global transaction identifier)的复制方式,基本结构与事件重放一样,日志组成和处理有所不同,相比之下有以下优点:
在同步模式上,根据主库等待从库执行的情况,可以分为三类:
半同步复制虽然确保事务要至少传播给一个从节点,但在故障转移时维持数据一致性还是很困难:
其实也很容易理解,毕竟“如果光靠复制有用的话,那还要一致性算法干嘛”,前面提到的各种复制过程,只是尽可能在保障性能的情况下,数据能有最新冗余,至于如何故障切换、如何处理网络分裂这些是没过多考虑的。MySQL官方在2016年12月发布了组复制(MGR,MySQL Group Replication)方案,基于分布式Paxos协议,内置故障检测和自动选主功能,在集群大多数节点存活的情况下能持续工作,并保证数据一致性。
组复制并没有脱离MySQL数据复制的框架,通过插件的方式,在同步过程增加基于分布式一致性算法的认证(Certify)阶段。在这种模式下,集群是可以支持多点写入的,通过行级别的检测处理事务冲突,被集群拒绝的事务由发起者本地回滚。
从业务的视角来看,MGR解决的是MySQL服务的高可用问题,并不能说数据库启用了MGR,业务就拥有了一个对节点故障无感知的数据库集群。例如,集群中的某个节点挂了,之前连接到这个节点的客户端请求需要能重定向或故障转移,这些功能需要额外的中间件(如Connector、Load Balancer、Router等),仅MGR方案本身是没有提供的,MySQL的集群(Cluster)方案通过集成路由组件(MySQL Router)提供了支持。
MySQL InnoDB Cluster提供了一个完整的MySQL高可用解决方案,从结构上看,它由一个高可用集群和上层路由组件构成。
可以将MySQL Router看作MySQL Cluster的透明反向代理,一般将MySQL Router部署到应用相同主机上,一方面可以依靠系统支持的本地Socket减少多一个节点的网络开销,另一方面不需要处理Router高可用的套娃问题。
MySQL在2020年还提供了一种叫MySQL InnoDB ReplicaSet的解决方案,与MySQL InnoDB Cluster对比,主要的区别是数据节点不是MGR集群而是一主多从的集群,前面提到的Replication的毛病基本都有,好处就是集成了MySQL Router方便配置和故障切换。从能力上讲Cluster方案是更好的,但如果需要更高的写性能,或网络状况比较糟糕,那ReplicaSet可以弥补集群模式的一些缺陷。
分布式一致性算法的共识过程受网络影响很大,网络稳定性和节点数量会增加阻塞和回退概率,从而影响集群的写入性能。MySQL InnoDB ClusterSet提供了一种解决方案,能够支持本地集群高可用和跨数据中心的容灾。
MySQL InnoDB ClusterSet和MySQL ReplicaSet在架构上是雷同的,只不过节点对象从单实例变成InnoDB Cluster集群,集群间数据同步在集群的主节点中进行。这样揭开面纱后,与ReplicaSet一样,ClusterSet的优缺点就呼之欲出了:
2023-12-19 11:19:49 42阅读
高可用系统的建设,不是单纯的技术设计考究,而是所有团队的工程化配合:除了考虑产品的SLA诉求,还需要考虑研发的迭代效率、运维的操作能力和整体的成本预算。
可以确定的是,SLA等级、成本花费和技术复杂度是成正比的,不是所有的业务都需要“5个9”的可用性,所以我们会对业务进行分层,在各方面取舍,最终形成某些解决范式。MySQL也是如此,针对不同的SLA要求,官方提供了不同的解决方案:
[图片来源:MySQL High Availability Solutions]
撇开不能横向扩展(Scale-out)的方式,MySQL高可用的基本方法有复制(MySQL Replication)和集群(MySQL Cluster)两种类型,细分下来有:
Replication是MySQL官方提供的主从同步实现,基于异步复制的主备集群是应用最广的MySQL高可用容灾方案,它有以下优点:
Replication的基本原理是基于变更日志(Binary log)的事件(Replicating event)重放,有如下线程模型和行为:
除此之外,在MySQL 5.6.5版本增加了一种基于全局事务标识(GTID,Global transaction identifier)的复制方式,基本结构与事件重放一样,日志组成和处理有所不同,相比之下有以下优点:
在同步模式上,根据主库等待从库执行的情况,可以分为三类:
半同步复制虽然确保事务要至少传播给一个从节点,但在故障转移时维持数据一致性还是很困难:
其实也很容易理解,毕竟“如果光靠复制有用的话,那还要一致性算法干嘛”,前面提到的各种复制过程,只是尽可能在保障性能的情况下,数据能有最新冗余,至于如何故障切换、如何处理网络分裂这些是没过多考虑的。MySQL官方在2016年12月发布了组复制(MGR,MySQL Group Replication)方案,基于分布式Paxos协议,内置故障检测和自动选主功能,在集群大多数节点存活的情况下能持续工作,并保证数据一致性。
组复制并没有脱离MySQL数据复制的框架,通过插件的方式,在同步过程增加基于分布式一致性算法的认证(Certify)阶段。在这种模式下,集群是可以支持多点写入的,通过行级别的检测处理事务冲突,被集群拒绝的事务由发起者本地回滚。
从业务的视角来看,MGR解决的是MySQL服务的高可用问题,并不能说数据库启用了MGR,业务就拥有了一个对节点故障无感知的数据库集群。例如,集群中的某个节点挂了,之前连接到这个节点的客户端请求需要能重定向或故障转移,这些功能需要额外的中间件(如Connector、Load Balancer、Router等),仅MGR方案本身是没有提供的,MySQL的集群(Cluster)方案通过集成路由组件(MySQL Router)提供了支持。
MySQL InnoDB Cluster提供了一个完整的MySQL高可用解决方案,从结构上看,它由一个高可用集群和上层路由组件构成。
可以将MySQL Router看作MySQL Cluster的透明反向代理,一般将MySQL Router部署到应用相同主机上,一方面可以依靠系统支持的本地Socket减少多一个节点的网络开销,另一方面不需要处理Router高可用的套娃问题。
MySQL在2020年还提供了一种叫MySQL InnoDB ReplicaSet的解决方案,与MySQL InnoDB Cluster对比,主要的区别是数据节点不是MGR集群而是一主多从的集群,前面提到的Replication的毛病基本都有,好处就是集成了MySQL Router方便配置和故障切换。从能力上讲Cluster方案是更好的,但如果需要更高的写性能,或网络状况比较糟糕,那ReplicaSet可以弥补集群模式的一些缺陷。
分布式一致性算法的共识过程受网络影响很大,网络稳定性和节点数量会增加阻塞和回退概率,从而影响集群的写入性能。MySQL InnoDB ClusterSet提供了一种解决方案,能够支持本地集群高可用和跨数据中心的容灾。
MySQL InnoDB ClusterSet和MySQL ReplicaSet在架构上是雷同的,只不过节点对象从单实例变成InnoDB Cluster集群,集群间数据同步在集群的主节点中进行。这样揭开面纱后,与ReplicaSet一样,ClusterSet的优缺点就呼之欲出了: