当前位置: 首页 > 科技观察

MySQL高可用方案选择参考

时间:2023-03-12 07:56:17 科技观察

可选的MySQL高可用方案  MySQL的各种高可用方案大多基于以下部署:  基于主从复制;  基于加莱拉协议;  基于NDB引擎;?是基于中间件/代理;  是基于共享存储;  是基于主机高可用;复制的方案,后面是基于Galera的方案,我们将重点关注这两个方案。其他方案在生产中用的不多,简单说一下。  基于主从复制的高可用解决方案  双节点主从+keepalived/heartbeat  一般来说,中小规模采用这种架构是最省事的。  两个节点可以采用简单的单主从模式,或者双主模式,置于同一个VLAN中。主节点故障后,利用keepalived/heartbeat高可用机制快速切换到从节点。  在这个方案中,有几点需要注意:  在使用keepalived作为高可用方案时,两个节点***都设置为BACKUP模式,避免相互抢占导致写入冲突相同的数据到两个节点;  将两个节点的auto_increment_increment(自增初始值)和auto_increment_offset(自增步长)设置为不同的值。其目的是为了避免当master节点意外宕机时,部分binlog可能没有及时复制到slave上应用,导致slave写入的新数据的自增值与原来的master发生冲突.它是交错的;当然,如果有合适的容错机制,可以解决主从自增ID冲突,也可以不做;  slave节点服务器配置不要太差,否则更容易造成复制延迟。作为双机热备节点的从服务器,硬件配置不能低于主节点;  如果对延迟问题比较敏感,可以考虑使用MariaDB分支版本,或者直接上线MySQL5.7***版本,使用多线程复制可以大大降低复制延迟;  另一种对复制延迟特别敏感的方案是使用semisyncreplication(所谓的半同步复制)或者后文提到的PXC方案,基本上没有延迟,但是事务的并发性能会损失到一个一定程度,需要综合评估再做决定;  keepalived的检测机制需要适当完善。它不能只检查mysqld进程是否存活或MySQL服务端口是否可用。进一步检测数据写入或计算,判断响应时间。如果超过设定的阈值,则可以启动切换机制;当  keepalived最终决定切换时,还需要判断slave的延时。需要提前设定规则,决定直接切换哪种策略,或者延迟等待。直接切换可能会导致一些由于复制延迟而无法查询的数据重复写入;  keepalived和heartbeat本身都不能解决脑裂问题,所以在判断服务异常时,可以调整判断脚本,通过补充第三方节点检测来决定是否切换,可以降低脑裂风险大脑问题。?双节点主从+keepalived/心跳方案架构示意图如下所示:    图:MySQL双节点(单向/双向主从复制),使用keepalived实现高可用建筑学。  多节点主从+MHA/MMM  多节点主从,一主多从,或者双主多从都可以。  在这种模式下,可以使用MHA或者MMM来管理整个集群。目前MHA用的最多,首先推荐MHA。最新的MHA也支持了MySQL5.6的GTID模式,这是个好消息。  MHA优势明显:?开源,使用Perl开发,代码结构清晰,二次开发容易;  是一个成熟的方案,MHA在failover时会做更严格的判断,尽量减少数据丢失,保证数据的一致性;  提供了一个通用的框架,可以根据自己的情况进行自定义开发,尤其是判断和切换操作步骤;  支持binlogserver,可以提高binlog传输效率,进一步降低数据丢失的风险。?但是MHA也有一些局限性:?需要在各个节点之间建立ssh信任,这对一些公司的安全系统来说是一个挑战,因为如果一个节点被黑了,其他节点也会受到影响;  提供的脚本有待进一步补充完善。当然,对于一般用途来说已经足够了。  多节点master-slave+etcd/zookeeper  在大规模节点环境下,使用keepalived或者MHA作为MySQL的高可用管理还是有些复杂或者麻烦。  首先,如果那么多节点不被配置服务管理的话,会杂乱无章,切换上线的时候很容易误操作。  在大规模环境下,推荐使用etcd/zookeeper来管理集群,可以实现快速的检测切换和方便的节点管理。  基于Galera协议的高可用解决方案  Galera是Codership提供的多主数据同步复制机制,可以实现多个节点之间的数据同步复制和读写,可以保证数据库服务的高可用和数据一致性性。  基于Galera的高可用解决方案主要包括MariaDBGaleraCluster和PerconaXtraDBCluster(简称PXC)。目前PXC用的比较多。?PXC的架构图如下:    (图片来自网络),示意图:底层使用wsrep接口实现多节点间数据的同步复制。    (图片来自网络),示意图:PXC中,节点间的一个数据写入校验/回滚过程。?PXC优势?高服务可用性;  数据同步复制(并发复制),几乎没有延迟;  多个读写节点同时进行,可以实现写扩展,但是提前***分库分表,让每个节点写不同的表或者库,避免galera解决数据冲突;  新节点自动部署,部署操作简单;  数据严格一致,特别适合电商应用;?完全兼容MySQL;?有这么多好处,但也有一些局限性:?只支持InnoDB引擎;  所有的表都必须有一个主键;  锁冲突和死锁问题相对较多;  不支持XA;  集群吞吐量/性能取决于短板;?新节点使用SST成本高;  存在写扩容问题;?如果并发交易量大,建议使用InfiniBand网络,减少网络延迟;?其实使用PXC的主要目的是为了解决数据一致性的问题,而高可用是附带实现的。因为PXC有写扩容和短板效应,并发效率会大大损失,类似于半同步复制机制。  其他高可用解决方案?都是基于NDBCluster的。由于NDB的诸多缺陷和局限性,不建议在生产环境中使用;  是基于共享存储的。此外,共享存储也可能成为新的单点,除非采用基于高速网络的分布式存储,类似RDS的应用场景,架构方案会更复杂,成本可能更高;  基于中间件(Proxy),现在靠谱的代理选择不多,也没有通用的代理,都是有针对性的,比如有的专注于解决读写分离,有的专注于分库分表等,真正好用Proxy一般需要自己开发;  是基于主机高可用,指的是类似RHCS一样,搭建高可用集群后部署MySQL应用的解决方案。老实说,我从来没有真正使用过它,但是从侧面了解到这个方案在生产中使用的并不多,可能是因为一些限制;  以DBA们的聪明才智,肯定还有其他方案知道的也欢迎各位同仁交流。