【目录】 1.从单机到集群 2.MySQL 主从复制* 3.MySQL 读写分离* 4.MySQL 高可用* 5.总结回顾与作业实践一 单机到集群 单机问题
随着数据量的增大,读写并发的增加,系统可用性要求的提升,单机 MySQL 面临:
1、容量有限,难以扩容
2、读写压力,QPS 过大,特别是分析类需求会影响到业务事务
3、可用性不足,宕机问题
2000年,MySQL 3.23.15版本引入了复制
2002年,MySQL 4.0.2版本分离 IO 和 SQL 线程,引入了 relay log
2010年,MySQL 5.5版本引入半同步复制
2016年,MySQL 在5.7.17中引入 InnoDB Group Replication
- ROW
- Statement
- Mixed
异步复制:传统主从复制–2000年,MySQL 3.23.15版本引入了 Replication
至少能够保证有一个从库同步成功
(待补充)
主从复制的缺点- 主从延迟问题
- 应用侧需要配合读写分离框架
- 不解决高可用问题
借助主从复制的实现,我们可以有多个MySQL服务器实例,可以借助这个新的集群,改进业务系统数据处理能力,即配置多个数据源,实现读写分离;
读写分离-动态切换数据源版本1.01、基于 Spring/Spring Boot,配置多个数据源(例如2个,master 和 slave)
2、根据具体的 Service 方法是否会操作数据,注入不同的数据源,1.0版本
3、改进一下1.1:基于操作 AbstractRoutingDataSource 和自定义注解 readonly 之类的,简化自动切换数据源
4、改进二下1.2:支持配置多个从库;
5、改进三下1.3:支持多个从库的负载均衡
- 分析前一版本“动态切换数据源”有什么问题?
1.1 侵入性还是较强
1.2 降低侵入性会导致”写完读”不一致问题 - 改进方式,ShardingSphere-jdbc 的 Master-Slave 功能
2.1 SQL 解析和事务管理,自动实现读写分离
2.2 解决”写完读”不一致的问题
- 分析前一版本“框架版本”有什么问题?
1.1 对业务系统还是有侵入
1.2 对已存在的旧系统改造不友好 - 改进方式,MyCat/ShardingSphere-Proxy 的 Master-Slave 功能
2.1 需要部署一个中间件,规则配置在中间件
2.2 模拟一个 MySQL 服务器,对业务系统无侵入
高可用意味着,更少的不可服务时间。一般用SLA/SLO衡量。
1年 = 365天 = 8760小时
99 = 8760 * 1% = 8760 * 0.01 = 87.6小时
99.9 = 8760 * 0.1% = 8760 * 0.001 = 8.76小时
99.99 = 8760 * 0.0001 = 0.876小时 = 0.876 * 60 = 52.6分钟
99.999 = 8760 * 0.00001 = 0.0876小时 = 0.0876 * 60 = 5.26分钟
1、读写分离,提升读的处理能力
2、故障转移,提供 failover 能力
加上业务侧连接池的心跳重试,实现断线重连,业务不间断,降低 RTO 和 RPO;
3.高可用方式 3.1 主从手动切换什么是 failover,故障转移,灾难恢复?
容灾:热备与冷备
对于主从来说,简单讲就是主挂了,某一个从,变成主,
整个集群来看,正常对外提供服务
常见的一些策略:
1、多个实例不在一个主机/机架上
2、跨机房和可用区部署
3、两地三中心容灾高可用方案
如果主节点挂掉,将某个从改成主;重新配置其他从节点。修改应用数据源配置。
缺点:可能数据不一致;需要人工干预;代码和配置的侵入性;
3.2 主从手动切换用 LVS+Keepalived 实现多个节点的探活+请求路由。
配置 VIP 或 DNS 实现配置不变更
缺点:1.手动处理主从切换;2.大量的配置和脚本定义
3.3 MHAMHA(Master High Availability)目前在 MySQL 高可用方面是一个相对成熟的解决方案,它由日本 DeNA 公司的 youshimaton(现就职于 Facebook 公司)开发,是一套优秀的作为 MySQL 高可用性环境下故障切换和主从提升的高可用软件。
基于 Perl 语言开发,一般能在30s内实现主从切换。切换时,直接通过 SSH 复制主节点的日志
缺点:1.需要配置SSH信息;2.至少3台服务器
如果主节点挂掉,将自动选择某个从改成主;无需人工干预,基于组复制,保证数据一致性
缺点:1. 外部获得状态变更需要读取数据库;2. 外部需要使用 LVS/VIP 配置;
特点:
适用场景1:适用于动态添加数据库节点的场景
适用场景2:高可分片
如果主节点挂掉,将某个从改成主;
基于go语言开发,实现了中间件本身的高可用;
五 总结- 单机数据库技术演进
- MySQL主从复制
- MySQL读写分离
- MySQL高可用



