0

0

后端分布式系列:分布式存储-MySQL 数据库事务与复制_MySQL

php中文网

php中文网

发布时间:2016-05-30 17:10:00

|

1068人浏览过

|

来源于php中文网

原创

后端分布式系列:分布式存储-MySQL 数据库事务与复制_MySQL好久没有写技术文章了,因为一直在思考 「后端分布式」这个系列到底怎么写才合适。

 

最近基本想清楚了,「后端分布式」包括「分布式存储」和 「分布式计算」两大类。

 

结合实际工作中碰到的问题,以寻找答案的方式来剖解技术,很多时候我们都不是在创造新技术,而是在应用技术。

 

为了更有效率与效果的用好技术,我们需要了解一些技术的原理与工作方式。

 

带着问题从使用者的角度去剖析技术原理,并将开源技术产品和框架作为一类技术的参考实现来讲解。

 

以讲清原理为主要目的,对于具体实现的技术细节若无特别之处则尽可能点到即止。

 

事务与复制

 

近期参与了一个数据分布化相关的项目,涉及到数据库 MySQL 的数据分布化。

 

简单来说就是需要在异地数据中心实现多点可写并保证分布后的数据能达成最终一致性。

 

以前对 MySQL 作数据分布仅仅是读写分离,通过数据库自身的主从复制即可实现写主库、读从库。

 

现在则需要双写主库并在经历一个短暂的延时后达成最终一致性,这个问题乍一想比较复杂,但归根结底还是数据最终一致性的问题。

 

先回到最简单的情况,只有一个 MySQL 数据库时,数据一致性是怎么保证的?

 

了解数据库的都知道,这是通过数据库的事务特性来保证的,事务包括四大特性:

 

Atomicity 原子性

 

Consistency 一致性

 

Isolation 隔离性

 

Durability 持久性

 

事务的 ACID 四大特性不是本文重点,就不展开做学术性解说了,不了解的可以在后面参考文献里去看相关文章。

 

这里只想提一个问题,单一数据库事务能保证数据的一致性,那么 MySQL 在部署成主从架构时,如何保证主从之间数据的一致性的?

 

MySQL 为了提供主从复制功能引入了一个新的日志文件叫 binlog,它包含了引发数据变更的事件日志集合。

 

从库请求主库发送 binlog 并通过日志事件还原数据写入从库,所以从库的数据来源为 binlog。

 

这样 MySQL 主库只需做到 binlog 与本地数据一致就可以保证主从库数据一致(暂且忽略网络传输引发的主从不一致)。

 

我们知道保证本地数据一致性是靠数据库事务特性来达成的,而数据库事务是如何实现的呢?先看下面这张图:

后端分布式系列:分布式存储-MySQL 数据库事务与复制_MySQL

MySQL 本身不提供事务支持,而是开放了存储引擎接口,由具体的存储引擎来实现,具体来说支持 MySQL 事务的存储引擎就是 InnoDB。

AlibabaWOOD
AlibabaWOOD

阿里巴巴打造的多元电商视频智能创作平台

下载

 

存储引擎实现事务的通用方式是基于 redo log 和 undo log。

 

简单来说,redo log 记录事务修改后的数据, undo log 记录事务前的原始数据。

所以当一个事务执行时实际发生过程简化描述如下:

 

先记录 undo/redo log,确保日志刷到磁盘上持久存储。

 

更新数据记录,缓存操作并异步刷盘。

 

提交事务,在 redo log 中写入 commit 记录。

 

在 MySQL 执行事务过程中如果因故障中断,可以通过 redo log 来重做事务或通过 undo log 来回滚,确保了数据的一致性。

 

这些都是由事务性存储引擎来完成的,但 binlog 不在事务存储引擎范围内,而是由 MySQL Server 来记录的。

 

那么就必须保证 binlog 数据和 redo log 之间的一致性,所以开启了 binlog 后实际的事务执行就多了一步,如下:

 

先记录 undo/redo log,确保日志刷到磁盘上持久存储。

 

更新数据记录,缓存操作并异步刷盘。

 

将事务日志持久化到 binlog。

 

提交事务,在 redo log 中写入提交记录。

 

这样的话,只要 binlog 没写成功,整个事务是需要回滚的,而 binlog 写成功后即使 MySQL Crash 了都可以恢复事务并完成提交。

 

要做到这点,就需要把 binlog 和事务关联起来,而只有保证了 binlog 和事务数据的一致性,才能保证主从数据的一致性。

 

所以 binlog 的写入过程不得不嵌入到纯粹的事务存储引擎执行过程中,并以内部分布式事务(xa 事务)的方式完成两阶段提交。

 

进一步的细节就不展开了,可以参看后面参考文献。

 

总结

 

我们前面先提出了一个问题,然后从数据一致性的角度去思考,参考了 MySQL 的实现方式。

 

理清并分析了 MySQL 单机环境是如何保证复制机制的数据一致性,也就是 binlog 和事务数据的一致。

 

后面我们才能基于 binlog 这个机制去实现复制并保证主从复制的一致性。

 

主从复制又引入了网络因素,进一步增加了保证主从数据一致性的复杂度,后面还会撰文进一步分析这个问题。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
全国统一发票查询平台入口合集
全国统一发票查询平台入口合集

本专题整合了全国统一发票查询入口地址合集,阅读专题下面的文章了解更多详细入口。

19

2026.02.03

短剧入口地址汇总
短剧入口地址汇总

本专题整合了短剧app推荐平台,阅读专题下面的文章了解更多详细入口。

27

2026.02.03

植物大战僵尸版本入口地址汇总
植物大战僵尸版本入口地址汇总

本专题整合了植物大战僵尸版本入口地址汇总,前往文章中寻找想要的答案。

15

2026.02.03

c语言中/相关合集
c语言中/相关合集

本专题整合了c语言中/的用法、含义解释。阅读专题下面的文章了解更多详细内容。

3

2026.02.03

漫蛙漫画网页版入口与正版在线阅读 漫蛙MANWA官网访问专题
漫蛙漫画网页版入口与正版在线阅读 漫蛙MANWA官网访问专题

本专题围绕漫蛙漫画(Manwa / Manwa2)官网网页版入口进行整理,涵盖漫蛙漫画官方主页访问方式、网页版在线阅读入口、台版正版漫画浏览说明及基础使用指引,帮助用户快速进入漫蛙漫画官网,稳定在线阅读正版漫画内容,避免误入非官方页面。

13

2026.02.03

Yandex官网入口与俄罗斯搜索引擎访问指南 Yandex中文登录与网页版入口
Yandex官网入口与俄罗斯搜索引擎访问指南 Yandex中文登录与网页版入口

本专题汇总了俄罗斯知名搜索引擎 Yandex 的官网入口、免登录访问地址、中文登录方法与网页版使用指南,帮助用户稳定访问 Yandex 官网,并提供一站式入口汇总。无论是登录入口还是在线搜索,用户都能快速获取最新稳定的访问链接与使用指南。

114

2026.02.03

Java 设计模式与重构实践
Java 设计模式与重构实践

本专题专注讲解 Java 中常用的设计模式,包括单例模式、工厂模式、观察者模式、策略模式等,并结合代码重构实践,帮助学习者掌握 如何运用设计模式优化代码结构,提高代码的可读性、可维护性和扩展性。通过具体示例,展示设计模式如何解决实际开发中的复杂问题。

3

2026.02.03

C# 并发与异步编程
C# 并发与异步编程

本专题系统讲解 C# 异步编程与并发控制,重点介绍 async 和 await 关键字、Task 类、线程池管理、并发数据结构、死锁与线程安全问题。通过多个实战项目,帮助学习者掌握 如何在 C# 中编写高效的异步代码,提升应用的并发性能与响应速度。

2

2026.02.03

Python 强化学习与深度Q网络(DQN)
Python 强化学习与深度Q网络(DQN)

本专题深入讲解 Python 在强化学习(Reinforcement Learning)中的应用,重点介绍 深度Q网络(DQN) 及其实现方法,涵盖 Q-learning 算法、深度学习与神经网络的结合、环境模拟与奖励机制设计、探索与利用的平衡等。通过构建一个简单的游戏AI,帮助学习者掌握 如何使用 Python 训练智能体在动态环境中作出决策。

3

2026.02.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
CSS3 教程
CSS3 教程

共18课时 | 5.1万人学习

Git 教程
Git 教程

共21课时 | 3.3万人学习

Excel 教程
Excel 教程

共162课时 | 15.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号