数据生态:MySQL复制技术与生产实践pdf下载pdf下载

数据生态:MySQL复制技术与生产实践百度网盘pdf下载

作者:
简介:本篇主要提供数据生态:MySQL复制技术与生产实践pdf下载
出版社:电子工业出版社
出版时间:2020-11
pdf下载价格:0.00¥

免费下载


书籍下载


内容介绍

产品特色

编辑推荐

适读人群 :初、中、高级MySQL DBA、数据库架构师及其相关开发人员

本书侧重介绍主从复制的原理和复制技术的演进、主从复制技术在生产环境中的应用方案,以及主从复制中常见对象复制的安全性等。适用MySQL DBA、数据库架构师及相关开发人员阅读。

内容简介

《数据生态:MySQL复制技术与生产实践》共分为3篇:基础篇、方案篇和参考篇。按照“基本原理”→“生产实践”→“更多参考”的逻辑顺序讲述,书中配了大量的原理与方案示意图,力求用通俗易懂的语言、直观明了的示意图、完整的知识涵盖面将MySQL复制技术讲透。

其中,基础篇侧重介绍主从复制的原理和复制技术的演进,方案篇侧重介绍主从复制技术在生产环境中的应用方案,参考篇侧重介绍二进制日志的基本组成及主从复制中常见对象复制的安全性等。

本书适用初、中、高级MySQL DBA、数据库架构师及相关开发人员阅读。


作者简介

罗小波

《千金良方:MySQL性能优化金字塔法则》作者之一。熟悉MySQL体系结构,擅长数据库的整体调优,热衷于开源技术的研究与分享,曾在线上和线下多次公开分享过数据库专题知识,发表近100篇数据库相关的研究文章,现任ScaleFlux资深应用工程师(Staff Application Engineer)。


沈 刚

熟悉MySQL数据库运行机制,在数据库及复制架构故障的诊断、数据库性能调优、数据库备份恢复和迁移等方面有丰富的经验,为银行、证券公司及互联网用户提供数据库的架构设计、故障诊断、性能调优等服务,现任PingCAP TiDB 技术支持工程师。


精彩书评

数据复制技术是实现数据库水平扩展、高可用性和高可靠架构的基础。本书中的案例都是从生产实践中提炼和总结的,体现了两位作者丰富的MySQL运维和咨询经验。

林晓斌(丁奇) “MySQL实战45讲”专栏作者

MySQL主从复制技术一直都是一个热门的话题,这当然是有道理的,可以说主从复制技术是各种MySQL高可用架构的基石。除了理论,本书还包含大量实践内容,相信仔细阅读定会收获颇丰。

高鹏(八怪) “深入理解主从原理32讲”专栏作者

继《千金良方:MySQL性能优化金字塔法则》后,罗老师再出新作,有幸拜读。本书基于MySQL新版本,结合作者多年的实战经验,全面介绍了主从复制技术,并配有大量的部署和实践案例,是学习MySQL主从复制技术的重要资料,相信定能对你有所帮助。

温正湖 网易杭州研究院OLTP&OLAP内核团队开发负责人

和小波相识于网络,从其MySQL技术文章和对各种疑难故障问题的分析中可知,小波及其沃趣的同事技术功底十分深厚扎实,总能从原理层面将核心问题讲述得非常透彻。本书涵盖MySQL复制技术原理、架构设计、案例分析等方面的内容。对于DBA来说,细细品读,必将收益良多。

杨奇龙 杭州有赞科技 DBA、微信公众号“yangyidba”内容作者

我们习惯称呼小波为波多老师,除了因为显而易见的谐音,也因为我们由衷地被他乐于分享的精神所打动。写书既要毅力又费体力,没有眼睛向下的兴趣和决心实在难以完成。希望这本书不仅能带给你知识,也能引发你的思考。

熊中哲 ScaleFlux工程师

本书尝试带领读者一起领略MySQL复制技术的风景,如果你愿意跟随作者的脚步来一场思想之旅,相信MySQL的相关知识能帮助你在技术专家的道路上更进一步。

李春 沃趣科技首席架构师

目录

基 础 篇

第1章 复制的概述 2

1.1 适用场景 2

1.2 数据同步方法 3

1.3 数据同步类型 4

1.4 复制格式 4

第2章 复制的基本原理 6

2.1 概述 6

2.2 细节 7

第3章 复制格式详解 10

3.1 复制格式概述 10

3.2 复制格式明细 11

3.2.1 基于statement和基于row的复制的优缺点 11

3.2.2 使用row格式的二进制日志进行复制 14

3.3 如何确定与记录复制中的安全和不安全语句 15

第4章 传统复制与GTID复制 18

4.1 传统复制 18

4.2 GTID复制 19

4.2.1 GTID的格式和存储 19

4.2.2 GTID的生命周期 23

4.2.3 GTID 自动定位 26

4.2.4 GTID复制模式的限制 27

第5章 半同步复制 29

5.1 半同步复制的原理 29

5.2 半同步复制的管理接口 33

5.3 半同步复制的监控 33

5.4 半同步复制的注意要点 34

第6章 多线程复制 36

6.1 单线程复制原理 36

6.2 DATABASE多线程复制 38

6.2.1 原理 38

6.2.2 系统变量的配置 40

6.3 LOGICAL_CLOCK多线程复制 40

6.3.1 原理 40

6.3.2 系统变量的配置 42

6.4 WRITESET多线程复制 42

6.4.1 原理 42

6.4.2 系统变量的配置 50

第7章 多源复制 51

7.1 复制通道 51

7.2 单通道操作命令 52

7.3 复制语句的向前兼容性 53

7.4 启动选项和复制通道选项 53

7.5 复制通道的命名约定 55

第8章 从库中继日志和状态日志 56

8.1 中继日志和状态日志概述 56

8.2 从库中继日志 57

8.3 从库状态日志 58

第9章 通过PERFORMANCE_SCHEMA库检查复制信息 66

9.1 PERFORMANCE_SCHEMA库中的复制信息记录表概述 66

9.2 PERFORMANCE_SCHEMA库中的复制信息记录表详解 70

9.2.1 replication_applier_configuration表 70

9.2.2 replication_applier_status表 71

9.2.3 replication_applier_status_by_coordinator表 72

9.2.4 replication_applier_status_by_worker表 74

9.2.5 replication_connection_configuration表 76

9.2.6 replication_connection_status表 78

9.2.7 replication_group_member_stats表 80

9.2.8 replication_group_members表 81

第10章 通过其他方式检查复制信息 83

10.1 复制状态变量 83

10.2 复制心跳信息 83

10.3 SHOW SLAVE STATUS语句输出信息详解 85

10.4 通过SHOW PROCESSLIST语句查看复制线程状态 92

10.5 SHOW MASTER STATUS语句输出详解 93

10.6 SHOW SLAVE HOSTS语句 93

第11章 MySQL复制延迟Seconds_Behind_Master究竟是如何计算的 96

11.1 “口口相传”的计算方法 96

11.2 探寻“正确”的计算方法 97

11.3 验证 100

11.3.1 我们想确认什么 100

11.3.2 提前确认一些信息 100

11.3.3 执行验证 102

11.4 小结 103

第12章 如何保证从库在意外中止后安全恢复 104

12.1 从库的崩溃与恢复概述 104

12.2 从库的崩溃与恢复详解 104

12.2.1 单线程复制的安全恢复 104

12.2.2 多线程复制的安全恢复 105

第13章 MySQL Server复制过滤 108

13.1 MySQL Server复制过滤规则概述 108

13.2 库级别复制过滤选项的评估 109

13.3 表级别复制过滤选项的评估 113

13.4 复制过滤规则的应用 115

方 案 篇

第14章 搭建异步复制 120

14.1 操作环境信息 120

14.2 全新初始化场景 121

14.2.1 传统复制 121

14.2.2 GTID复制 124

14.3 已有数据场景 126

14.3.1 传统复制 127

14.3.2 GTID复制 134

14.4 变量模板 140

14.4.1 传统复制模式的变量模板 140

14.4.2 GTID复制模式的变量模板 144

第15章 搭建半同步复制 146

15.1 半同步复制插件的安装和配置环境要求 146

15.2 半同步复制插件的安装和配置 147

15.2.1 关键步骤 147

15.2.2 详细过程 148

15.3 半同步复制工作状态的验证 152

第16章 通过扩展从库以提高复制性能 155

16.1 操作环境 155

16.2 横向扩展 156

16.2.1 扩展从库的简要步骤 157

16.2.2 扩展从库的详细过程 158

16.2.3 配置从库的读负载均衡 164

16.3 提高复制性能 165

第17章 复制模式的切换 167

17.1 操作环境信息 167

17.2 复制模式的相关概念 167

17.3 传统复制在线变更为GTID复制 173

17.3.1 简要步骤 173

17.3.2 详细过程 173

17.4 GTID复制在线变更为传统复制 179

17.4.1 简要步骤 179

17.4.2 详细过程 180

17.5 GTID复制离线变更为传统复制 186

17.5.1 简要步骤 186

17.5.2 详细过程 187

17.6 传统复制离线变更为GTID复制 191

17.6.1 简要步骤 191

17.6.2 详细过程 191

第18章 复制拓扑的在线调整 196

18.1 操作环境信息 196

18.2 传统复制模式下的复制拓扑在线调整 197

18.2.1 并行复制变更为串行复制 198

18.2.2 串行复制变更为并行复制 206

18.3 GTID复制模式下的复制拓扑在线调整 211

18.3.1 并行复制变更为串行复制 212

18.3.2 串行复制变更为并行复制 214

第19章 主从实例的例行切换 218

19.1 操作环境信息 218

19.2 在线切换 219

19.2.1 基于账号删除的在线切换 220

19.2.2 基于修改连接数的在线切换 232

第20章 数据库故障转移 239

20.1 操作环境信息 240

20.2 主库故障转移的关键步骤 241

20.3 主库故障转移的详细过程 243

20.3.1 环境的准备 243

20.3.2 执行步骤 245

第21章 搭建多源复制 255

21.1 操作环境信息 255

21.2 基于传统复制的多源复制 256

21.2.1 传统复制模式下的单线程多源复制 256

21.2.2 传统复制模式下的多线程多源复制 261

21.3 基于GTID复制的多源复制 263

21.3.1 GTID复制模式下的单线程多源复制 264

21.3.2 GTID复制模式下的多线程多源复制 267

21.4 多源复制拓扑中复制相关的操作语句变化 268

第22章 MySQL版本升级 273

22.1 MySQL版本之间的复制兼容性 273

22.2 升级复制的设置 274

第23章 将不同数据库的数据复制到不同实例 276

23.1 操作环境信息 276

23.2 通过设置复制过滤规则将不同数据库的数据复制到不同实例 277

23.2.1 通过只读选项配置复制过滤规则 278

23.2.2 通过动态语句配置复制过滤规则 286

第24章 发生数据误操作之后的处理方案 293

24.1 操作环境信息 294

24.2 主库发生误操作后的数据恢复 295

24.2.1 通过延迟复制恢复数据 296

24.2.2 通过闪回工具恢复数据 302

24.3 从库发生误操作后的数据恢复 309

24.3.1 通过修改系统变量slave_exec_mode恢复数据 309

24.3.2 通过GTID特性注入空事务恢复数据 316

第25章 常用复制故障排除方案 323

25.1 确认故障现象 323

25.2 信息收集与故障排查 323

25.3 复制故障的修复 325

25.4 无法解决的问题 326

参 考 篇

第26章 二进制日志文件的基本组成 328

26.1 什么是二进制日志 328

26.2 二进制日志的组成 328

26.3 二进制日志内容解析 329

26.3.1 基于row的复制的二进制日志内容解析 330

26.3.2 基于statement的复制的二进制日志内容解析 344

26.4 小结 351

第27章 常规DDL操作解析 352

27.1 操作环境信息 352

27.2 常规DDL操作示例 353

27.3 二进制日志内容解析 356

27.4 小结 359

第28章 为何二进制日志中同一个事务的事件时间点会乱序 360

28.1 操作环境信息 360

28.2 验证前的准备 360

28.3 验证过程 361

第29章 复制AUTO_INCREMENT字段 367

29.1 操作环境信息 367

29.2 复制AUTO_INCREMENT字段的操作示例 367

29.3 对二进制日志的解析及解释 368

29.3.1 基于row的复制中AUTO_INCREMENT字段的复制 368

29.3.2 基于statement的复制中AUTO_INCREMENT字段的复制 369

29.3.3 混合复制中AUTO_INCREMENT字段的复制 371

29.4 使用AUTO_INCREMENT字段时的注意事项 371

29.5 小结 372

第30章 复制CREATE ... IF NOT EXISTS语句 373

30.1 操作环境信息 373

30.2 复制CREATE ... IF NOT EXISTS语句的操作演示 374

30.3 二进制日志解析结果的解释 375

30.4 小结 376

第31章 复制CREATE TABLE ... SELECT语句 377

31.1 操作环境信息 377

31.2 复制CREATE TABLE ... SELECT语句的操作示例 377

31.3 二进制日志的解析及解释 380

31.3.1 statement格式二进制日志的解析及解释 380

31.3.2 row格式和mixed格式二进制日志的解析及解释 381

31.4 使用CREATE TABLE ... SELECT语句时的注意事项 384

31.5 小结 384

第32章 在主从复制中使用不同的表定义 385

32.1 操作环境信息 385

32.2 主从库的表字段数不同时如何复制 386

32.2.1 源表字段数多于目标表字段数 386

32.2.2 目标表字段数多于源表字段数 388

32.3 不同类型字段的复制 389

32.3.1 属性提升 390

32.3.2 有损转换与无损转换 390

32.4 小结 391

第33章 复制中的调用功能 392

33.1 操作环境信息 392

33.2 复制中的调用功能操作示例 392

33.2.1 在READ-COMMITTED隔离级别、基于row的复制场景下数据库的

操作记录 393

33.2.2 在READ-COMMITTED隔离级别、基于statement的复制场景下

数据库的操作记录 396

33.3 二进制日志的解析及解释 396

33.3.1 row和mixed格式二进制日志的解析及解释 396

33.3.2 statement格式二进制日志的解析及解释 402

33.4 小结 407

第34章 复制LIMIT子句 408

34.1 操作环境信息 408

34.2 复制LIMIT子句的操作示例 408

34.3 二进制日志的解析及解释 409

34.3.1 statement格式二进制日志的解析及解释 410

34.3.2 row格式和mixed格式二进制日志的解析及解释 411

34.4 小结 414

第35章 复制LOAD DATA语句 415

35.1 操作环境信息 415

35.2 复制LOAD DATA语句的操作示例 416

35.2.1 准备演示数据 416

35.2.2 LOAD DATA语句的操作 417

35.3 二进制日志的解析及解释 417

35.3.1 statement格式二进制日志的解析及解释 417

35.3.2 row格式和mixed格式二进制日志的解析及解释 419

35.4 小结 420

第36章 系统变量max_allowed_packet对复制的影响 421

36.1 系统变量简介 421

36.2 操作环境信息 422

36.3 max_allowed_packet对复制的影响操作示例 423

36.3.1 max_allowed_packet对主库的影响 423

36.3.2 max_allowed_packet对从库的影响 424

36.4 小结 427

第37章 复制临时表 429

37.1 操作环境信息 429

37.2 复制临时表的操作示例 429

37.2.1 基于statement的复制且隔离级别为REPEATABLE-READ 430

37.2.2 基于row的复制且隔离级别为REPEATABLE-READ 432

37.2.3 混合复制且隔离级别为REPEATABLE-READ 433

37.2.4 使用临时表时如何安全关闭从库 433

37.3 与临时表相关的其他注意事项 435

37.4 小结 435

第38章 复制中的事务不一致问题 436

38.1 事务不一致的场景类型 436

38.2 事务不一致的原因 437

38.3 事务不一致的后果 437

38.4 小结 438


精彩书摘

第1章 复制的概述

简单来说,“复制”就是将来自一个MySQL Server(这里指master角色,即主库)的数据变更,通过其逻辑的二进制日志(binlog)传输到其他的一个或多个MySQL Server(这里指slave角色,即从库)中,其他MySQL Server通过应用(回放)这些逻辑的二进制日志来完成数据的同步。这些MySQL Server之间的逻辑关系,我们称为“复制拓扑”(也可以称为“复制架构”)。

默认情况下,复制是异步的,即主库将二进制日志传输到从库之后,并不关心从库是否成功收到。从库是否收到这些二进制日志,不影响主库的任何读/写访问;而从库的复制线程也可以随意暂停或停止,并不影响主库的读/写访问。通常,异步模式能够发挥数据库的最高性能,但数据安全性却得不到很好的保证,如果对数据安全性的要求较高,可以考虑使用半同步复制。

另外,默认情况下,复制的数据是针对整个实例的(排除部分系统表),你可以根据自身需求选择是否需要复制整个实例的数据,是只复制某些库,还是只复制某些表的数据等。接下来将简要介绍MySQL中复制拓扑的一些适用场景,以及与复制相关的概念。

1.1 适用场景

MySQL主从复制拓扑可用于如下场景:

1. 横向扩展(Scale-Out)

横向扩展是指在多个从库之间进行读负载均衡,以提高读性能。在此扩展方案中,所有数据变更在主库上执行,读负载可以分摊到一个或者多个从库上。可以把之前在主库上的读负载剥离出来,以承载更多的写请求,另外,如果读负载越来越大,可以通过扩展从库来提高读性能。

2. 数据安全性(Data Security)

数据安全性在很大程度上需要靠数据副本来保证。在这里,副本可以理解为我们通常所说的备份。在MySQL中,为了保证二进制日志的位置和数据的一致性,通常在执行备份时需要阻塞写操作,防止因数据变更而造成备份过程中所获取的二进制日志位置与数据不一致。

大多数时候,我们使用的MySQL主从复制拓扑是这样的:一主N从、两主N从(N大于或等于1)。其中,主库提供读与写或者只写服务,从库提供只读服务(多个从库通常会提供读负载均衡以分摊单个从库的读压力)。而主库通常只有一个(在有两个主库的复制拓扑中,另一个主库通常用于提供快速的高可用切换),提供只读服务的从库通常有多个。因此,虽然在主库上执行备份能够尽可能保证备份数据的实时性(即拥有最新的数据),但是由于在备份过程中需要通过阻塞写操作来保证数据的一致性,因此会严重影响应用的写可用性。对于主库来说,从库有多个,所以如果在从库上执行备份,对只读应用的可用性影响就要小很多(从库的复制机制本身也支持断点续传)。也就是说,在执行备份操作时,选择使用从库而不使用主库是一个更好的替代方案,这样可以尽量减少对主库性能以及数据安全性的影响。

3. 分析(Analytics)

在主库上运行OLTP(联机事务处理)应用,而OLAP(联机分析处理)应用可以在从库上运行,避免在主库上运行OLAP 应用对主库性能造成影响。

4. 远程数据分发(Long-Distance Data Distribution)

可以使用复制特性为远程站点(例如分公司或者分地域的应用中心)创建数据的本地副本,那些对数据实时性没有要求的应用可以访问本地副本,剩下的一小部分对实时性有要求的应用访问主库。远程站点既可以作为灾备中心,也可以用于实现跨地域访问以分摊负载,以及实现就近访问,加快访问速度。

5. 在线滚动升级(Online Rolling Upgrade)

先升级从库,然后执行主从切换,再升级主库,从而实现数据库应用不停机的在线升级(这里说的“不停机”并不是指应用完全无感知,在执行主从切换时,应用需要重新连接数据库)。

6. 高可用切换(Failover)

当主库发生故障时,可以把从库提升为主库,从而快速恢复服务。

1.2 数据同步方法

MySQL 5.7支持以下两种数据同步方法(也可以称为复制模式或复制方法):

l 传统复制:也可以称为基于二进制日志文件和位置的复制,在从库中配置复制时,要求指定从主库中获取的二进制日志文件(binlog file)和位置(binlog position),以便从库中的复制线程启动时,能够以指定的二进制日志文件和位置为起点,持续读取主库中的二进制日志,并在从库中应用,从而达到数据同步的目的。

l 基于GTID的复制(本书中为了表述上的方便,简称为GTID复制):GTID(全局事务标识符)是新的事务性复制方法,利用GTID可以自动在主库中寻找需要复制的二进制日志记录,因此不需要关心日志文件或位置,极大地简化了许多常见的复制任务。使用GTID复制可确保主库和从库之间的一致性。有关GTID的更多细节,详见4.2节“GTID复制”。

1.3 数据同步类型

MySQL支持如下4种不同类型的数据同步:

l 异步复制:是最早出现的复制技术,MySQL内置支持,不需要额外安装插件。其中,一个实例充当主库,一个或多个其他实例充当从库,与同步复制形成对比。

l 半同步复制:MySQL 5.7(从MySQL 5.5开始支持半同步复制)除内置了异步复制之外,还支持半同步复制。使用半同步复制时,主库的会话在提交事务之前,会等待至少一个从库返回收到二进制日志的ACK消息(确认接收,并将事务的事件记录到从库的中继日志中)。

l 延迟复制:MySQL 5.7还支持延迟复制(从MySQL 5.6开始支持),使得从库可以故意滞后于主库至少一段指定的时间,以便在出现误操作时,有时间对误操作的数据进行补救。

l 同步复制:指的是需要保证写操作完全同步到其他数据节点,而不仅仅是二进制日志被其他节点接收。例如NDB Cluster,它是一种集群架构,所有节点都可以进行读/写,而且每个节点上发生的写操作都会实时同步到其他节点。对于需要同步复制的场景,可以使用NDB Cluster,或者其他类似的开源解决方案(虚拟同步,非完全同步),例如Percona XtraDB Cluster(PXC)、MariaDB Galera Cluster(MGC)、MySQL Group Replication(MGR)。

1.4 复制格式

MySQL支持两种二进制日志格式(二进制日志记录的是数据变更的逻辑):一种是记录语句原始文本(即statement格式,语句文本按原样记录到二进制日志),另一种是记录数据的逐行变更(即row格式,将一个语句记录到二进制日志中,可能产生多行数据变更记录)。就具体的复制格式而言,可以分为三种,由系统变量binlog_format进行设置,有效值为:statement(对应下文中的SBR)、row(对应下文中的RBR)、mixed(mixed格式,混合使用statement和row格式,对应下文中的MBR)。这三种格式的详情如下:

l 基于statement的复制(Statement Based Replication,SBR):当系统变量binlog_format设置为statement时表示使用SBR。SBR复制的是整个SQL语句的原始文本,日志量较小,但容易出现主从库数据不一致。对于SBR,当执行的某个语句被判定为不安全时,是否允许其执行还取决于事务的隔离级别。

l 基于row的复制(Row Based Replication,RBR):当系统变量binlog_format设置为row时表示使用RBR。RBR复制的是发生更改的数据行的实际记录(原始语句会被转换为发生变更的行数据记录),日志量较大,但可以保证主从库数据的一致性。

l 混合复制(Mixed Based Replication,MBR):系统变量binlog_format设置为mixed时表示使用MBR。MBR实际上是由MySQL自行判断的,即在不影响数据一致性的情况下,使用SBR;如果可能影响数据一致性,则自动转换为RBR。

提示:本章中复制相关的概念较多,容易混淆,这里做一个总结。MySQL中的复制,按照数据同步方法划分,可分为传统复制和GTID复制;按照数据同步类型划分,可分为异步复制、半同步复制、延迟复制和同步复制;按照复制格式划分,可分为基于statement的复制(SBR)、基于row的复制(RBR)和混合复制(MBR)。

有关复制的格式的更多信息,详见第3章“复制格式详解”。


前言/序言

推荐序一




MySQL在其3.23版本时就颇具前瞻性地推出主从复制(replication)特性,距今约有20年了。正是这一举措,使得MySQL赶上了互联网1.0时代的发展大势。利用复制特性可以很方便地实现数据库架构的扩展及读写分离功能,以提升架构承载的容量。

我想,从这个角度来说,复制是MySQL最主要的特性一点都不为过。

本书专注于MySQL复制特性,从基本概念和原理着手,再到实践操作、复制架构的方案、常见故障案例等方面,也涵盖了传统复制架构下最新的半同步复制、多源复制、多线程复制等内容,可谓MySQL复制特性的全面指南。

相信我,本书对MySQL复制特性的阐述既有广度也不失深度,无论是对于在校生还是技术专家,本书都值得细读。


叶金荣

Oracle ACE Director(MySQL)

推荐序二




在开源国产数据库崛起的今天,罗小波和沈刚所著的这本佳作《数据生态:MySQL复制技术与生产实践》,无疑将为MySQL在各行业的推广和使用做出贡献,这也是像我这样的从商业数据库转到开源数据库的从业者的福音。

MySQL能够成为“最流行的开源数据库”,其复制技术起了巨大的作用。Sharing Nothing架构、横向扩展、高可用、容灾、数据集成与聚合,这一系列名词所代表的架构和应用场景都与复制技术有关。多应用场景意味着与复制相关的技术灵活而复杂:异步复制、增强半同步复制、语句级复制、行级复制、按位点复制、GTID复制、多源复制、级联复制、多线程复制、双主架构、一主多从架构、延迟复制、读写分离等。不同的业务场景,使用不同的复制架构,该如何正确地构建MySQL复制拓扑、如何有效地监控和正确地维护,这些都是架构师和DBA要解决的问题。

小波他们这本书系统讲解了MySQL复制技术的知识点,涵盖上面所提到的各种场景和架构相关的问题。我特别佩服小波,佩服他在技术研究和写作上的系统性,在书中对高层架构和实践细节的知识讲述得细致而全面。毫无疑问,这些知识将有助于DBA构建企业级MySQL运行环境,在数据库可扩展性和高可用性等方面,做到正确地实施和监控,以及管理和维护。

本书以专题的形式切入,力求将MySQL主从复制的原理和实践讲透。掌握MySQL复制技术后,再了解和掌握生态圈中的第三方产品,包括MHA、Orchestrator、Replication Manager、Otter、Canal、ProxySQL等,来补充MySQL架构,就不再是难事。

由于篇幅原因,这本书没有涉及MySQL Group Replication(简称MGR,即组复制),所以很期待小波的下一本书能够对MySQL复制技术的另一个分支“组复制”进行全面、细致、深入的讲解。

再次感谢小波给社区和行业带来的佳作。


熊军

云和恩墨产品研发副总裁

推荐序三




很高兴能够为大家推荐罗小波老师与他同事沈刚的新作《数据生态:MySQL复制技术与生产实践》。这本书汇集了罗老师他们近年来的学习成果和工作经验,是关于MySQL生态的又一力作。

与概要性地介绍MySQL的图书不同,这本书详细介绍了MySQL复制技术及其在生产实践中的具体应用和操作,是一本专题类的图书。

熟悉MySQL的人都知道,MySQL的复制技术是其核心技术之一,是灵活运用MySQL的基础。从3.23版本开始,MySQL推出了异步复制功能,之后不断进化,推出半同步复制、无损半同步复制,以及目前最新的组复制功能。其基本原理几乎是一致的——利用二进制日志文件在数据库服务器之间的传播和数据回放,实现多台数据库服务器之间的数据同步。一个合格的MySQL从业人员,必须掌握复制技术的基础知识,熟悉复制技术的各种解决方案,并灵活利用它们去满足生产系统中的各种需求。

这本书的“基础篇”介绍了复制技术的原理,对相关概念进行了详尽的解读;“方案篇”则介绍了不同方案的应用与实际操作;最后的“参考篇”对二进制日志等内容进行了详细的说明。这本书详尽阐述了MySQL复制技术。

随着国家加强对数据库技术安全可控的要求,使用开源的MySQL数据库已经成为一种趋势,开源代表着代码安全、数据库可控。各行各业不断地推进MySQL的部署,MySQL从业人员也由互联网行业扩散到传统行业。利用复制技术可以实现MySQL的高可用性及高扩展性,是保障MySQL数据安全和进行数据库扩展的必要技术。安全可控对于传统行业至关重要,因此极力推荐MySQL从业者,特别是传统行业的DBA阅读此书。

徐轶韬

Oracle公司MySQL全球事业部亚太区解决方案高级工程师

微信公众号“MySQL解决方案工程师”运营者和内容作者

前 言




写书的出发点

2019年11月,我们撰写了《千金良方:MySQL性能优化金字塔法则》一书。从那以后,身边不断有人问我一个问题:“写技术类的书不怎么赚钱,为什么还要写?”刚开始,我还认真回答,但提问者听到回答之后大多仍然表示不解,后来问的人多了,我索性回答:“为了赚名气!”这个答案简单、粗暴、有效!的确,通过《千金良方:MySQL性能优化金字塔法则》一书,我们小“赚”了些名气,不过对于为什么写书这个问题,这不是我的全部答案。现在,借本书的前言,我将自己全部的想法写出来,希望能完整、全面地回答这个问题。

? 督促自己有计划地学习

2018年12月,我们有幸参加了电子工业出版社在北京举办的作译者聚会。聚会上有两位嘉宾的话令我印象深刻。一位来自阿里巴巴的安全专家说他已经撰写十余本书了,另一位来自美团的某团队负责人说他规划要写十余本书。“听君一席话,胜读十年书”,他们完全颠覆了我之前对于写书这件事的看法。在此之前,我一直以为,技术图书是写作者不断沉淀工作中所学的知识,由量变到质变的产物。能写一本书,说明某个方面知识的积累已经达到一定厚度,非常不易。在那一刻,我才知道,原来写书这件事,还可以刻意规划,也难怪大拿们能够做到连续数十载一年写一本书!于是,从那时开始,我们也开始尝试有计划地学习、有计划地写书。

? 化解繁重的工作和技能精进之间的矛盾

在2018年12月的作译者聚会之后不久,我们再次受邀参加电子工业出版社在杭州举办的作译者聚会。这次聚会上,一位嘉宾的话又让我获益匪浅,他说“视野的高度决定了做事的高度”。在他的影响下,我阅读了吴军博士的《见识》一书,其中“西瓜与芝麻”和“不做伪工作者”的故事令人印象深刻。这让我联想到,自己及身边的同事、朋友们,也未尝不是经常做着捡芝麻的事情,沉迷于低效率的勤奋而不自知,由于工作时长问题,相当多的人也缺少精进的时间和精力。

不少朋友曾经问我如何从零开始学习MySQL,这些人中有刚走出校园的实习生、程序员,也有想从其他数据库开发转向MySQL开发的开发者。对于这一问题,我一时间不知如何作答,但问的人多了,一来我不好意思总说自己也不知道如何学习MySQL,二来突然发觉这或许是一个需要有人站出来解决的问题。于是我开始思考,想象作为一个MySQL“小白”应该如何入门。

经过不断的思考,我慢慢有了一些答案。例如,可以尝试系统地研究某个知识点,将其研究透彻,然后分享出来供大家一起学习,以便帮助那些没有足够精力和时间精进的朋友们快速进步,让那些可能走弯路的朋友们少走弯路。或许这就像吴军博士在《文明之光》中所描述的那样,当农耕文明发展到一定阶段,赖以生存的食物不再短缺的时候,就能够腾出一部分人力不再从事农耕劳作,转而专门从事满足新需求的工作,如此这般,人类文明便可以不断向前进步。

? 系统地学习和研究某个课题

借用吴军博士的话说,一本书可以看作系统学习和研究某个课题后的答卷,就好比在大学里写论文一样,它能够验证你对课题的学习和研究是否有成效,让大家都可以看见、分享你的学习和研究成果。

? 锻炼写作能力

写作是一项技能,需要反复地刻意练习,而写书的过程通常要求高、周期长,这是一个非常好的练习机会。

掌握正确的学习和研究方法

要系统地学习和研究一个课题,按照由浅入深的顺序,我们可以将其过程大致分为如下三个阶段:

? 第一阶段:认识整体

对于一个复杂课题,可以先从整体上搞清楚它的知识体系组成框架,搞清楚其中各个组成部分(知识模块)的大致脉络,从而从全局上建立起初步认知,以便为下一阶段选择知识模块进行深入研究做好铺垫。

? 第二阶段:逐一深入

基于第一阶段的整体认识,可以优先选择一些工作中需要用到的知识模块,或者感兴趣的知识模块,作为子课题逐一进行深入的系统研究。

? 第三阶段:回归整体

由于人的精力有限,在第二阶段,深入研究各知识模板期间,一些知识模块可能会被遗忘,因此需要回归整体,结合自己的验证与理解,建立牢固的知识体系。

在学习和研究的过程中要勤动手记录,可将零散的知识整理为博客文章,博客文章积累到一定数量之后亦可整理为图书,持续地做这样的知识积累工作,直到形成完善的知识体系,日后可供自己与他人使用。

2019年11月出版的《千金良方:MySQL性能优化金字塔法则》,可以说是我们在第二阶段中对一个子课题(MySQL性能优化)的答卷,而本书则可以说是我们对另一个子课题(MySQL主从复制)的答卷。对于MySQL来说,主从复制是一个非常重要的知识模块,而且据我所知,还有非常多从事MySQL相关工作的同行们,对MySQL主从复制的原理、应用场景等知识掌握得并不全面,甚至对其一知半解的人也不在少数。因此,在本书中,我们将其作为重点展开介绍。不过,遗憾的是,在学习和研究的第一阶段,我们还没有撰写相关图书,但我们正在积极筹备中,在不久的将来会为广大读者朋友们交上一份满意的“答卷”!

MySQL的数据生态

MySQL的二进制日志记录了一个数据库实例内数据的变更,这些内容是按照时间的先后顺序记录的。根据具体的二进制日志格式选项设置,可以记录数据库实例内执行的原始SQL语句文本,也可以记录数据库实例内执行SQL语句时产生的数据变更的行记录值。二进制日