官方文档
https://dev.mysql.com/doc/
如果英文不好的话,可以参考 searchdoc 翻译的中文版本
http://www.searchdoc.cn/rdbms/mysql/dev.mysql.com/doc/refman/5.7/en/index.com.coder114.cn.html
前置学习
要掌握高可用架构,必须先了解主从架构: MySQL-主从架构探索
什么是高可用( HA - High Availability )
通过尽量缩短因日常维护操作(计划内) 和 突发的系统崩溃 (非计划)所导致的停机时间,以提高系统的可用性,这就是高可用 。
举个例子: 主从同步延时太厉害、主从中断、锁表造成大量的阻塞 等等因素都造成了应用的不可用,这些都是影响高可用的因素
其实真正做到100%的可用还是比较困难的,我们经常说到的 5个9 (99.999%)的可用 是啥意思呢?
做到 5个9的可用性,那允许停服多长时间呢? 我们来算下
(365 * 24 * 60) * (1 - 0.99999) = 5.256 分钟, 一年停服时长小于5分钟。
4个9呢?
(365 * 24 * 60) * (1 - 0.9999) = 52. 56 分钟 (1个小时左右)
3个9呢?
(365 * 24 * 60) * (1 - 0.999) = 525.6 分钟 (9个小时左右)
可用性越高,实现的成本相对就高, 实际情况根据我们的业务和项目成本来考量。
实现高可用的几点原则
- 避免系统不可用的因素减少系统不可用的时间 比如服务器磁盘空间不足、表结构和索引没有优化、主从不一致、性能糟糕的SQL、人为操作失误等等 主要的措施: 建立完善的监控和告警系统 1)备份!!!并对备份数据定期进行恢复测试,以便备份数据在紧急情况恢复数据时可用 2)正确的配置数据库环境,特别是从库环境,read_only一定要开启。 3)对不需要的数据进行归档和清理
- 增加系统冗余,确保发生故障时可以尽快的切到另外的节点恢复 主要的措施有:
1. 避免存在单点故障
代码语言:txt复制2. 主从切换及故障转移
这里我们主要如何解决探讨MySQL的单点故障
避免MySQL单点故障的几种方案
使用SUN共享存储
共享存储 也有单点问题,而且共享存储的随机I/O不是很理想,虽然能实现,但不是一种好的解决MySQL单点故障的方案。
使用DRDB磁盘复制
提供远程镜像磁盘,数据是由冗余的,没有单点问题,但成本较高 。
使用用多写集群(PXC方案)
集群中的节点全部提交才提交。集群的性能取决于集群中机器配置最低的那台主机的性能。
写入性能比单节点的写入性能差, 而且 PXC仅支持Innodb储存引擎。
这个玩意很强大,需要深入学习,淘宝等很多大厂有基于这个的定制,很好用,但得学会 。
使用NDB集群
这玩意所有的数据存在内存中,如果内存不足,NDB集群的性能就会非常差。 很少在生产环境中使用。
使用MySQL的主从复制
说到使用MySQL主从复制来解决MySQL的单点问题,其核心在于如何解决主节点的单点问题。
要保证主节点高可用,有几点 需要解决
- 主服务器切换后,如何通知应用新的主服务器的IP地址
- 如何检查MySQL主服务器是否可用
- 如何处理从服务器和新主服务器之间的那种复制关系
通常都会使用第三方的复制管理组件 , 主流的MMM 和 MHA ,接下来我们就重点来看下这两种复制管理组件。
MMM (Multi-Master Replication Manager )
学习这个之前,需要知道,这个玩意很少有人用了,这个项目好多年都不维护了,了解即可。 有精力可以重点掌握MHA这种架构。
多主复制器, perl语言开发的
MMM的主要作用
监控和管理MySQL的主主复制拓扑,并在当前的主服务器失效的时候,进行主和主备服务器之间的主从切换和故障转移。
MMM提供的功能
主主复制 分为两种模式
- 主动-主动模式的主主复制 (两个主节点都对外提供读写服务)
- 主动-被动模式的主主复制(仅一个节点对外提供读写服务)
MMM是 主动-被动模式的主主复制的模式
- MMM监控MySQL主从复制的健康状况
- 在主库宕机时进行故障转移并自动配置其他从对新主的复制
这里的内容就比较多了: 比如如何找到从库对应的新主库日之巅的日志同步点, 如何存在多个从库出现数据不一致的情况如何处理 —> MMM采取的方案: 找到当前主库的同步点进行同步,所以有数据丢失的可能。
- 提供了主、写虚拟IO,在主从服务器出现问题的时候可以自动迁移虚拟IP
MMM架构图
因为同一时间点只能有一个主节点提供读写服务,所以第二个主节点画成了虚线。
MMM监控各个服务器的状态,需要在每台服务器上安装 监控服务器。
MMM部署需要的资源
MMM架构安装和部署
这一部分暂时留空,因为MMM架构使用较少,暂不整理。
MMM架构的优缺点
优点 :
- 开源,使用perl语言开发
- 提供了读写VIP(虚拟IP),使得服务器交涉的变更对前端应用透明。应用访问DB都是访问的虚拟IP,而非真实的物理IP。 在从服务器出现大量的主从延迟,主从链路中断时可以把这台从服务器上的读的虚拟IP,漂移到集群中其他正常的服务器上。
- MMM提供了从服务器的延迟监控。监控后,有故障可以自动漂移VIP
- MMM提供了主服务器故障转移后从服务器对新主的重新同步功能
- 很容易对发生故障的主数据库重新上线
- 监控服务器可以监控多个MMM集群
缺点 :
- 最新版本10年发布的,十年了。。。。有部分bug未修复
- 不支持MySQL5.6以后的提供的GTID同步方式,仅支持基于binlog的同步
- 不支持MySQL5.6以后的提供的多线程同步技术
- 没有读负载的功能
- 主从切换时,容易造成数据丢失
- MMM监控服务存在单点故障,避免的监控服务单点,需要自行实现。
MHA (Master High Availability)
同MMM一样, 也是perl语言开发
架构
当主节点发生故障时,会在从节点中选举出一个主节点,继续提供服务。 切高效的完成主从切换,尽最大可能保证数据一致。
MHA支持 基于GTID的复制 ,GTID复制更安全。
MMM不支持 基于GTID的复制
MHA提供的功能
- 监控主数据库服务器是否可用
- 当主DB不可用时,从多个从服务器中选举新的主数据库服务器
- 提供主从切换和故障转移功能 。
MHA可以和半同步结合起来使用。
MHA主从切换过程
- 尝试从出现故障的主数据库保存二进制日志到其他节点 (需要配置ssh免密)
- 从多个备选从服务器中选举出新的备选主服务器
- 在备选服务器和其他从服务器之间同步差异的二进制数据
- 应用从原主DB上保存的二进制日志
- 提升备选DB服务器为新的主服务器
- 迁移集群中的其他从DB作为新的DB的从服务器
MHA配置的步骤
- 配置集群内所有的主机的SSH免认证登录
- 安装MHA-node软件包(每个节点都要安装) 和MHA-manager 软件包
- 建立主从复制集群 (推荐使用基于GTID的复制)
- 配置MHA管理节点
- 使用masterha_check_ssh和 masterha_check_repl对配置进行校验
- 启用并测试MHA服务
MHA的安装和部署
基于以下架构来演示
篇幅太大,单独补充
MHA的优缺点
优点
- 开源 ,perl语言开发,提供了脚本接口
- 支持GTID的复制模式
- MHA故障转移中不容易丢失数据
- 同一个监控节点可以监控多个集群
缺点
- 需要编写脚本或者利用第三方工具来实现VIP的配置
- MHA启动后只监控主数据库
- 需要基于SSH免认证,存在一定的安全隐患
- 也没有同从服务器的读的负载功能