大厂都在用的MySQL主从复制、读写分离及高可用方案(上)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
日志服务 SLS,月写入数据量 50GB 1个月
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 大厂都在用的MySQL主从复制、读写分离及高可用方案(上)

1 单机 =》集群

根据云厂商Benchmark结果,4核8G机器运行 MySQL 5.7 时,可支撑TPS 500,QPS 10000。

但随着数据量的增大,读写并发的增加,系统可用性要求的提升,单机 MySQL 出现危机:

  • 容量问题,难以扩容,考虑数据库拆分、分库分表
  • 读写压力,QPS 过大,特别是分析类需求会影响到业务事务,考虑多机集群、主从复制
  • 高可用性不足,易宕机,考虑故障转移、MHA/MGR/Orchestrator
  • 高峰时数据库连接数经常超过上限
  • 一致性问题
    考虑分布式事务,X/A 柔性事务


读写分离的实现是基于主从复制架构:一主多从,只写主库,主库会自动将数据同步到从库。


主从复制的意义

高并发场景下MySQL的一种优化方案,依靠主从复制使得MySQL实现了数据复制为多份,增强了抵抗高并发读请求的能力,提升了MySQL查询性能同时,也提升了数据的安全性。当某一个MySQL节点,无论是主库还是从库故障时,还有其他的节点中存储着全量数据,保证数据不会丢失。


2 MySQL主从复制

2.1 发展史

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


2.2 核心

  • 主库写 binlog
  • 从库 relay log

主从复制的过程

image.png

  • 主库将变更写binlog日志,然后从库连接到主库后,从库有个I/O线程,将主库的binlog日志拷贝到本地,写入一个中继日志
  • 接着从库中有个SQL线程会从中继日志读取binlog,然后执行binlog日志中的内容。即在本地再次执行一遍SQL,确保跟主库数据相同


binlog格式

  • ROW
    记录详细,但日志量较大
  • Statement
    记录简单,只记录SQL,无查询语句
  • Mixed
# 查看binlog
mysqlbinlog -vv mysql-bin.000005

异步复制

异步复制:经典的主从复制,Primary-Secondary Replication,2000年MySQL 3.23.15版本引入 Replication。


传统的MySQL复制提供了一种简单的主从复制方案。有一个主(source)并且有一或多个从(replicas)。主数据库execute事务,将其commit,然后将它们异步发给从库,以re-executed(在基于语句的复制中)或apply(在基于行的复制中)。它是一个无共享系统,默认情况下所有服务器都具有数据的完整副本。


MySQL 异步复制

image.png

image.png

优点

简单

缺点

  • 网络或机器故障,会造成数据不一致


SQL的每个增删改的会改变数据的操作,除了会更新数据外,对这个增删改操作还会写入一个日志文件,记录这个操作的日志,即binlog。


MySQL 5.7新版本的并行复制,多个SQL线程,每个线程从relay日志里读一个库的日志,重放。


从库同步主库数据的过程是串行化的,即主库上并行的操作,在从库会串行执行。

由于【从库】从【主库】拷贝日志及串行执行SQL的特点,在高并发下就有延时,从库数据一定比主库慢。

所以经常出现,刚写入主库的数据读不到,要过几十甚至几百ms才能读到。

从库串行化过程:

  1. 读取binlog日志
  2. 写relay日志、应用日志变更到自己本地数据


从库的I/O线程,读取主库的binlog日志时,老版本是单线程,5.6.x之后的新版本改为多线程读取。

若主库宕机时,恰好数据还没同步到从库,则有些数据可能在从库上没有,可能就这么丢失了。

所以MySQL实际上在这有两个机制:


半同步复制

它向协议添加了一个同步步骤。这意味着主库在提交时,等待从库确认已接收到事务。只有这样,主库才会恢复提交操作。

2010 年引入Semisynchronous Replication,5.5 可用,解决主库数据丢失问题,保证主从的最终一致性。

需启用插件。

image.png

image.png

  1. 主库写入binlog日志后,会强制立即将数据同步到从库
  2. 从库将日志写入自己的relay log后,会返回ack给主库
  3. 主库接收到至少一个从库的ack后,才认为写操作完成


上面的图片可看到经典的异步MySQL复制协议(及其半同步变量)的示意图。不同实例之间的箭头表示服务器之间交换的消息或服务器与客户端应用程序之间交换的消息。


组复制

2016年引入,5.7 开始,启用插件。

image.png

基于 Paxos 协议实现的组复制,保证数据一致性。


组复制是一种可用于实施容错系统的技术。复制组是一组服务器,每个服务器都有自己的完整数据副本(无共享复制方案),并通过消息传递相互交互。通信层提供了一组保证,例如原子消息和总订单消息传递。这些功能非常强大,可以转化为非常有用的抽象,可以用来构建更高级的数据库复制解决方案。


MySQL组复制建立在这些属性和抽象之上,并在所有复制协议中实现多源更新。一个复制组由多个服务器组成,该组中的每个服务器可以随时独立执行事务。但是,所有读写事务只有在组批准后才提交。换句话说,对于任何读写事务,组都需要决定是否提交,因此提交操作不是来自原始服务器的单方面决定。只读事务无需组内的任何协调即可立即提交。


当读写事务准备好在原始服务器上提交时,服务器自动广播写值(已更改的行)和相应的写集(已更新的行的唯一标识符)。由于事务是通过原子广播发送的,因此该组中的所有服务器都将接收该事务,否则将不会。如果他们收到了,那么相对于之前发送的其他事务,他们都将以相同的顺序收到它。因此,所有服务器都以相同的顺序接收相同的交易集,并且为交易建立了全局总订单。


但是,在不同服务器上同时执行的事务之间可能存在冲突。通过在称为认证的过程中检查并比较两个不同并发事务的写集,可以检测到此类冲突。在认证过程中,冲突检测是在行级别执行的:如果在不同服务器上执行的两个并发事务更新同一行,则存在冲突。冲突解决过程指出,已首先订购的事务在所有服务器上提交,而已订购第二的事务中止,因此在原始服务器上回滚并由组中的其他服务器丢弃。例如,如果t1和t2在不同的站点上同时执行,都更改了同一行,并且t2在t1之前排序,则t2赢得了冲突,并且t1被回滚。这实际上是一个分布式的首次提交胜出规则。请注意,如果两个事务之间的冲突经常发生,那么在同一个服务器上启动它们是一个好习惯,在那里,它们有机会在本地锁管理器上进行同步,而不必由于认证而回滚。


对于应用和外部化已认证的交易,如果不破坏一致性和有效性,组复制允许服务器偏离交易的约定顺序。组复制是最终的一致性系统,这意味着一旦传入流量减慢或停止,所有组成员将具有相同的数据内容。当流量在流动时,可以按略有不同的顺序对事务进行外部化,或者对某些成员先进行外部化。例如,在多主要模式下,尽管尚未应用全局顺序中较早的远程事务,但是本地事务可能会在认证后立即被外部化。当证明过程确定交易之间没有冲突时,这是允许的。在单主模式下,在主服务器上,并发,无冲突的本地事务以与组复制所同意的全局顺序不同的顺序进行提交和外部化的可能性很小。在不接受来自客户端的写操作的辅助服务器上,事务始终按照约定的顺序进行提交和外部化。


下图描述了MySQL组复制协议,通过将其与MySQL复制(甚至MySQL半同步复制)进行比较,您可以看到一些区别。请注意,为清楚起见,此图中缺少一些基本的共识和Paxos相关的消息。


image.png

image.png





相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
1月前
|
运维 监控 关系型数据库
MySQL高可用方案:MHA与Galera Cluster对比
本文深入对比了MySQL高可用方案MHA与Galera Cluster的架构原理及适用场景。MHA适用于读写分离、集中写入的场景,具备高效写性能与简单运维优势;而Galera Cluster提供强一致性与多主写入能力,适合对数据一致性要求严格的业务。通过架构对比、性能分析及运维复杂度评估,帮助读者根据自身业务需求选择最合适的高可用方案。
|
1月前
|
SQL 监控 关系型数据库
MySQL主从复制:构建高可用架构
本文深入解析MySQL主从复制原理与实战配置,涵盖复制架构、监控管理、高可用设计及性能优化,助你构建企业级数据库高可用方案。
|
2月前
|
存储 关系型数据库 MySQL
修复.net Framework4.x连接MYSQL时遇到utf8mb3字符集不支持错误方案。
通过上述步骤大多数情况下能够解决由于UTF-encoding相关错误所带来影响,在实施过程当中要注意备份重要信息以防止意外发生造成无法挽回损失,并且逐一排查确认具体原因以采取针对性措施解除障碍。
179 12
|
3月前
|
SQL 关系型数据库 MySQL
解决MySQL "ONLY_FULL_GROUP_BY" 错误的方案
在实际操作中,应优先考虑修正查询,使之符合 `ONLY_FULL_GROUP_BY`模式的要求,从而既保持了查询的准确性,也避免了潜在的不一致和难以预测的结果。只有在完全理解查询的业务逻辑及其后果,并且需要临时解决问题的情况下,才选择修改SQL模式或使用 `ANY_VALUE()`等方法作为短期解决方案。
523 8
|
2月前
|
监控 NoSQL 关系型数据库
保障Redis与MySQL数据一致性的强化方案
在设计时,需要充分考虑到业务场景和系统复杂度,避免为了追求一致性而过度牺牲系统性能。保持简洁但有效的策略往往比采取过于复杂的方案更加实际。同时,各种方案都需要在实际业务场景中经过慎重评估和充分测试才可以投入生产环境。
151 0
|
3月前
|
关系型数据库 MySQL Java
MySQL 分库分表 + 平滑扩容方案 (秒懂+史上最全)
MySQL 分库分表 + 平滑扩容方案 (秒懂+史上最全)
|
8月前
|
SQL 关系型数据库 MySQL
如何实现 MySQL 的读写分离?
本文介绍了 MySQL 读写分离的实现方式及其主从复制原理,解释了如何通过主从架构提升读并发能力。重点分析了主从同步延时问题及解决方案,如半同步复制、并行复制等技术手段,并结合实际案例探讨了高并发场景下的优化策略。文章还提醒开发者在编写代码时需谨慎处理插入后立即查询的情况,避免因主从延时导致的数据不一致问题。
1023 44
如何实现 MySQL 的读写分离?
|
8月前
|
SQL 网络协议 关系型数据库
MySQL 主从复制
主从复制是 MySQL 实现数据冗余和高可用性的关键技术。主库通过 binlog 记录操作,从库异步获取并回放这些日志,确保数据一致性。搭建主从复制需满足:多个数据库实例、主库开启 binlog、不同 server_id、创建复制用户、从库恢复主库数据、配置复制信息并开启复制线程。通过 `change master to` 和 `start slave` 命令启动复制,使用 `show slave status` 检查同步状态。常见问题包括 IO 和 SQL 线程故障,可通过重置和重新配置解决。延时原因涉及主库写入延迟、DUMP 线程性能及从库 SQL 线程串行执行等,需优化配置或启用并行处理
216 40
|
8月前
|
关系型数据库 MySQL 数据库
RDS用多了,你还知道MySQL主从复制底层原理和实现方案吗?
随着数据量增长和业务扩展,单个数据库难以满足需求,需调整为集群模式以实现负载均衡和读写分离。MySQL主从复制是常见的高可用架构,通过binlog日志同步数据,确保主从数据一致性。本文详细介绍MySQL主从复制原理及配置步骤,包括一主二从集群的搭建过程,帮助读者实现稳定可靠的数据库高可用架构。
449 9
RDS用多了,你还知道MySQL主从复制底层原理和实现方案吗?
|
7月前
|
消息中间件 缓存 NoSQL
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)

推荐镜像

更多