什么是高可用
高可用指的是通过尽量缩短因日常维护操作和突发的系统崩溃所导致的停机时间,以提高系统和应用的可用性
导致不可用的可能因素
- 服务器磁盘空间耗尽
- 性能糟糕的SQL
- 表结构和索引没有优化
- 主从数据不一致
- 人为的操作失误
- ……….
如何实现高可用
- 建立完善的监控和报警系统
- 对备份数据进行恢复测试
- 正确配置数据库环境(从服务器建议只读)
- 对不需要数据进行归档和清理
- 增加系统的冗余,保证系统发生不可用时尽快的恢复
- 避免存在单点故障
- 主从切换和故障转移
如何避免单点故障
- 利用SUN共享存储或DRDB磁盘复制解决mysql单点故障
利用多写集群或NDB集群来解决mysql单点故障
- NDB很少使用在生成环境中
- 如果内存不足,NDB集群的性能就会非常差
利用mysql主从复制来解决单点故障
- 主服务器切换后,如何通知应用新的主服务器的IP地址
- 如何检查MYSQL主服务器是否可用
- 如何处理从服务器和新主服务器的复制关系
MMM架构介绍
MMM的主要作用
监控和管理mysql的主主复制拓扑,并在当前的主服务器失效时,进行主和主备服务器之间的主从切换和故障转移等工作
MMM的提供了什么功能
- MMM监控主从复制健康情况
- 在主库出现宕机时进行故障转移并自动配置其他从服务器对新主服务器的复制
- 如何找到从库对应的新的主库日志中的同步点
- 如果存在多个从库出现数据不一致的情况,如何处理
- 提供了主,写 虚拟IP,在主从服务器 出现问题时,可以自动迁移虚拟IP
MMM部署所需资源
MMM部署步骤
- 配置主主复制 和主从同步集群
- 安装主从节点所需要的支持包
- 安装和配置MMM工具包
MMM工具的优点
- 使用Perl语言开发并完全开源
- 提供了读写虚拟IP,使服务器角色的变更对前端应用透明
- 在从服务器出现大量主从延迟,主从链路中断时,可以把这台服务器上的读的虚拟IP,漂移到集群中其他正常的服务器上
- MMM提供了从服务器的延迟监控
- MMM提供了主数据库故障转移后,从服务器对新主服务器的重新同步功能
- 很容易对发生故障的主数据库重新上线
MMM工具的缺点
- 发布时间比较早,不支持MYSQL新的复制功能(只支持是基于日志点的复制)
- 注:基于gtid的复制可以保证日志不会重复在slave服务器上被执行
- 对于mysql5.6后所提供的多线程复制技术也不支持
- 没有读负载均衡的功能
- 在进行主从切换时,容易造成数据丢失
- MMM监控服务存在单点故障
MHA架构介绍
MHA的提供了什么功能
- 监控主数据库服务器是否可用
- 当主DB不可用时,从多个从服务器中选举出新的主数据库服务器
- 提供了主从切换和故障转移功能
MHA的主从切换过程
- 尝试从出现故障的主数据库保存二进制日志
- 从多个备选从服务器中选举出新的备选主服务器
- 在备选主服务器和其他从服务器之间同步差异二进制数据
- 应用从原主DB服务器上保存的二进制日志
- 提升备选主DB服务器为新的主DB服务器
MHA配置步骤
- 配置集群内所有主机的SSH免认证登录
- 安装MHA-node软件包和 MHA-manager软件包
- 建立主从复制集群
- 建立MHA管理节点
- 使用
masterha_check_ssh
和masterha_check_repl
对配置进行检验
MHA工具的优缺点
- 同样是由Perl语言开发的开源工具
- 可以支持GTID的复制模式
- MHA在进行故障转移时,更不容易产生数据丢失
- 同一个监控节点可以监控多个集群
- 需要编写脚本或借助第三方工具来实现虚拟IP的配置
- MHA启动后只会对主数据库进行监控
- 需要基于SSH免认证配置,存在一定安全隐患
- 没有提供从服务器的负载均衡功能
读写分离和负载均衡介绍
进行mysql主从复制配置的一个主要目的,是为了分担主库的读负载
为什么要读写分离呢?写负载是不能分担的,只能在主库操作,而读操作既可以在主库也可以在从库。
读写分离的方式
程序实现读写分离
- 优点: 由开发人员决定什么样的查询在从库执行,因此比较灵活
- 优点:由程序直接连接数据库,性能损耗比较少
- 缺点:增加了开发的工作量,是程序逻辑更加复杂
- 缺点:人为控制,容易程序错误
通过数据库中间件实现
- mysql-proxy(一直没有稳定版本)
- MaxScale (比较好)
由中间件实现读写分离的优缺点
- 由中间件根据查询语法分析,自动完成读写分离
- 对于程序透明,对于已有程序不用做任何调整
- 由于增加了中间层,所以对查询效率有损耗(有的达到50%)
- 对于(延迟)敏感业务无法自动在主库执行
如何实现负载均衡
- LVS
- Haproxy
- MaxScale
- F5(硬件)