新書推薦:
《
走进史学(壹卷李伯重文集:李伯重先生的学术印记与时代见证)
》
售價:NT$
360.0
《
故宫书画集(精编盒装)版传统文化收藏鉴赏艺术书法人物花鸟扇面雕刻探秘故宫书画简体中文注释解析
》
售價:NT$
1490.0
《
《往事和近事(增订本)》(著名学者葛剑雄教授代表作,新增修订、全新推出。跨越三十多年的写作,多角度讲述中华文明)
》
售價:NT$
349.0
《
往事和近事:历史地理学泰斗、百家讲坛主讲葛剑雄经典文集
》
售價:NT$
349.0
《
父母的关键认知
》
售價:NT$
225.0
《
第三帝国:一部新的历史(纳粹主义具有何种魔力?纳粹运动会卷土重来吗?一部全面揭示希特勒及其罪恶帝国黑暗的历史)
》
售價:NT$
490.0
《
强迫症的历史:德国人的犹太恐惧症与大屠杀(德国历史上的反犹文化源自哪里?如何演化为战争对犹太人灭绝性的种族杀戮?德国历史研究专家克劳斯·费舍尔叙述德国反犹史及其极端形态的典范之作)
》
售價:NT$
440.0
《
粤港澳大湾区舆论引导与舆情应对精品案例:基于媒介化治理的思考
》
售價:NT$
445.0
|
編輯推薦: |
MySQL主从原理是高可用架构的基石。
本书彻底地分析了MySQL主从原理。
本书是作者多年来研究MySQL原理和实践的成果。
MySQL从业人员应人手一本备在身边,以防不时之需。
|
內容簡介: |
在超大规模流量的分布式系统环境下,无论是从系统性能的角度,还是从数据安全性的角度,掌握MySQL主从原理,都是当下技术人员的必备基本功。MySQL主从原理是高可用架构的基石,即便是MGR这种集群架构也可以看到主从的影子。要解决一个问题或者故障,*快的方式就是了解它的原理,快速定位问题。本书从源码层面抽丝剥茧般地描述MySQL主从原理,全面地介绍了GTID相关的知识点,并解析了主要Event的生成、作用和格式,以及线程的初步知识、MDL LOCK、排序等热门话题和主从相关的案例。无论是MySQL DBA和MySQL源码爱好者,还是刚进入数据库行业的小白读者,通过阅读本书,都能通过源码级分析,更好地理解和使用MySQL主从复制技术。
|
關於作者: |
高鹏网名八怪,现任中亦安图科技有限公司数据库专家,2008年开始从事OracleMySQL相关工作,Oracle OCM、MySQL源码爱好者,知数堂8期学员。有丰富的数据库性能调优、故障诊断经验。
|
目錄:
|
第1章 GTID 1
1.1 GTID的基本概念 1
1.1.1 GTID的作用 1
1.1.2 GTID的基本表示 1
1.1.3 server_uuid的生成 2
1.1.4 GTID的生成 2
1.1.5 GTID_EVENT和PREVIOUS_GTIDS_LOG_EVENT简介 3
1.1.6 gtid_executed表的作用 4
1.2 mysql.gtid_executed表、gtid_executed变量、gtid_purged变量的修改时机 5
1.2.1 定义 5
1.2.2 主库修改时机 7
1.2.3 从库修改时机 8
1.2.4 通用修改时机 10
1.2.5 通用修改时机源码函数简析 10
1.3 GTID模块初始化简介和参数binlog_gtid_simple_recovery 11
1.3.1 GTID模块初始化流程图 12
1.3.2 步骤解析 13
1.4 GTID中的运维 16
1.4.1 跳过一个事务 17
1.4.2 mysqldump导出行为的改变 17
1.4.3 搭建GTID AUTO_POSITION MODE的主从 18
1.4.4 主从切换 20
1.4.5 参数gitd_mode的含义 21
1.4.6 在线开启GTID 21
1.4.7 离线开启GTID 22
1.4.8 开启GTID的注意事项 23
1.4.9 统计值ONGOING_ANONYMOUS_TRANSACTION_COUNT的变更时机 23
1.4.10 设置MASTER_AUTO_POSITION = 1的影响 25
1.4.11 离线开启GTID丢失数据的测试 25
第2章 Event 28
2.1 binary log Event 的总体格式 28
2.1.1 引言 28
2.1.2 binary log综述 28
2.1.3 Event的总体格式 29
2.1.4 Event header和Event footer 29
2.1.5 具体解析 30
2.1.6 本书涉及的Event类型 31
2.2 重点Event之FORMAT_DESCRIPTION_EVENT和
PREVIOUS_GTIDS_LOG_EVENT 32
2.2.1 FORMAT_DESCRIPTION_EVENT 32
2.2.2 PREVIOUS_GTIDS_LOG_EVENT 35
2.3 重点Event之GTID_EVENT 39
2.3.1 GTID_EVENT的作用 39
2.3.2 源码重要接口 40
2.3.3 主体格式 40
2.3.4 简单解析 41
2.3.5 生成时机 41
2.3.6 ANONYMOUS_GTID_EVENT 41
2.3.7 GTID的三种模式 42
2.4 重点Event之QUERY_EVENT和MAP_EVENT 43
2.4.1 QUERY_EVENT 43
2.4.2 MAP_EVENT 46
2.5 重点Event之WRITE_EVENT和DELETE_EVENT 51
2.5.1 WRITE_EVENT 51
2.5.2 DELETE_EVENT 57
2.6 重点Event之UPDATE_EVENT和XID_EVENT 61
2.6.1 UPDATE_ROWS_EVENT 61
2.6.2 XID_EVENT 66
2.7 参数binlog_row_image的影响 68
2.7.1 参数影响 68
2.7.2 过滤方式 70
2.7.3 DML Event中的标识 70
2.8 巧用Event发现问题 73
2.8.1 工具简介 73
2.8.2 分析长期未提交的事务 74
2.8.3 分析大事务 75
2.8.4 分析binary log中Event的生成速度 75
2.8.5 分析每个表生成了多少个DML Event 75
2.8.6 工具展示 75
第3章 主库 79
3.1 binlog cache简介 79
3.1.1 binlog cache综述 79
3.1.2 使用binlog cache的流程 80
3.1.3 参数binlog_cache_size的作用及其初始化 80
3.1.4 临时文件的分配和使用 81
3.1.5 参数max_binlog_cache_size的作用 82
3.1.6 如何观察到临时文件 82
3.2 事务Event的生成和写入流程 83
3.2.1 流程综述 83
3.2.2 删除阶段流程 85
3.2.3 提交阶段流程 85
3.2.4 两个注意点 86
3.3 MySQL层事务提交流程简析 86
3.3.1 参数设置 86
3.3.2 总体流程图 87
3.3.3 步骤解析第一阶段 90
3.3.4 步骤解析第二阶段(FLUSH阶段) 90
3.3.5 步骤解析第三阶段(SYNC阶段) 92
3.3.6 步骤解析第四阶段(COMMIT阶段) 93
3.3.7 步骤解析第五阶段 94
3.3.8 提交阶段的注意点 95
3.4 基于WRITESET的并行复制方式 95
3.4.1 奇怪的last commit 96
3.4.2 WRITESET是什么 96
3.4.3 WRITESET的生成 97
3.4.4 add_pke函数的流程 98
3.4.5 WRITESET设置对last commit的处理方式 99
3.4.6 WRITESET的历史MAP 100
3.4.7 WRITESET的并行复制对last commit的处理流程 100
3.4.8 WRITESET_SESSION的方式 104
3.4.9 关于参数binlog_transaction_dependency_history_size的说明 104
3.4.10 没有主键的情况 104
3.4.11 为什么同一个session执行的事务能生成同样的last commit 105
3.4.12 WRITESET并行复制方式的优缺点 105
3.5 主库的DUMP线程 106
3.5.1 POSITION MODE和GTID AUTO_POSITION MODE的不同点 106
3.5.2 流程图 108
3.5.3 步骤解析 109
3.5.4 重点说明 112
3.6 DUMP线程查找和过滤GTID的基本算法 113
3.6.1 环境假设 113
3.6.2 检查从库的GTID是否大于主库的GTID 114
3.6.3 检查需要的binary log是否已经清理 114
3.6.4 实际扫描binary log 115
3.6.5 GTID过滤 115
第4章 从库 117
4.1 从库MTS多线程并行回放(一) 117
4.1.1 MTS综述 117
4.1.2 协调线程的分发机制 118
4.1.3 步骤解析 120
4.1.4 并行回放判定一例 124
4.2 从库MTS多线程并行回放(二) 126
4.2.1 工作线程执行Event 126
4.2.2 MTS检查点中的重要概念 127
4.2.3 MTS中执行检查点的流程 132
4.2.4 MTS的关键点 136
4.3 MTS中的gap测试和参数lave_preserve_commit_ order 136
4.3.1 MTS中的gap测试 136
4.3.2 参数slave_preserve_commit_order的影响 138
4.4 从库的IO线程 139
4.4.1 引入 139
4.4.2 IO线程的启动流程图 140
4.4.3 流程解析 142
4.5 从库的SQL线程(MTS协调线程)和参数sql_slave_skip_counter 146
4.5.1 SQL线程的功能 146
4.5.2 流程图 146
4.5.3 重要步骤说明 148
4.5.4 各个Event做了什么 151
4.6 从库数据的查找和参数slave_rows_search_algorithms 153
4.6.1 从一个例子出发 153
4.6.2 确认查找数据的方式 156
4.6.3 ROW_LOOKUP_HASH_SCAN方式的数据查找 159
4.6.4 从库数据查找的要点 161
4.7 从库的关闭和异常恢复流程 162
4.7.1 正常的stop slave流程 162
4.7.2 stop slave为什么会慢 163
4.7.3 从库启动需要读取的信息 164
4.7.4 关于repository表的事务性 165
4.7.5 相关参数 166
4.7.6 恢复流程 167
4.8 安全高效的从库设置 170
4.8.1 从库参数设置建议 170
4.8.2 单SQL线程模式 171
4.8.3 MTS 174
4.8.4 一个非安全设置的例子 176
4.8.5 参数sync_relay_log的影响 177
4.9 从库Seconds_Behind_Master的计算方式 177
4.9.1 Seconds_Behind_Master的计算方式 178
4.9.2 影响Seconds_Behind_Master的因素 178
4.9.3 不同操作计算延迟的方式 181
4.9.4 MTS中Seconds_Behind_Master计算误差测试 181
4.9.5 手动修改系统时间导致Seconds_Behind_Master为0 183
4.10 Seconds_Behind_Master延迟场景归纳 185
4.10.1 延迟场景 185
4.10.2 相关测试 186
4.10.3 延迟诊断的方法论 189
第5章 案例解析 190
5.1 线程简介和MySQL调试环境搭建 190
5.1.1 线程简介 190
5.1.2 PID、LWP ID、Thread TID 192
5.1.3 MySQL线程和系统LWP ID的关系 193
5.1.4 调试环境的搭建 194
5.1.5 调试环境的使用 197
5.2 MySQL排序详细解析 198
5.2.1 为什么要讨论排序 198
5.2.2 从一个问题出发 199
5.2.3 测试案例 200
5.2.4 阶段1:确认排序字段及顺序 202
5.2.5 阶段2:计算sort字段长度 202
5.2.6 阶段3:计算额外字段的空间 203
5.2.7 阶段4:确认每行的长度 205
5.2.8 阶段5:确认最大内存分配 206
5.2.9 阶段6:读取数据进行内存排序 207
5.2.10 阶段7:排序方式总结输出 210
5.2.11 阶段8:进行最终排序 211
5.2.12 排序的其他问题 212
5.2.13 使用OPTIMIZER_TRACE查看排序信息 214
5.2.14 回到问题本身 215
5.2.15 答疑 217
5.3 MySQL中的MDL Lock简介 219
5.3.1 MDL Lock综述 219
5.3.2 重要数据结构和概念 220
5.3.3 为MDL Lock增加打印函数 225
5.3.4 在合适的位置增加打印函数 227
5.3.5 常见MDL Lock类型的加锁测试 229
5.4 奇怪的FTWRL堵塞案例 237
5.4.1 两个不同的现象 237
5.4.2 sleep 函数生效点 239
5.4.3 FTWRL做了什么工作 240
5.4.4 例5-3步骤解析 242
5.4.5 例5-4步骤解析 243
5.4.6 FTWRL堵塞和被堵塞的简单总结 244
5.5 产生大量小relay log故障案例 245
5.5.1 案例现象 245
5.5.2 参数slave_net_timeout分析 245
5.5.3 原因剖析 246
5.5.4 案例模拟 246
5.5.5 实现方式 248
5.6 从库system lock原因简析 250
5.6.1 binary log的写入时间和Event中的时间 250
5.6.2 问题由来 251
5.6.3 从库system lock延迟的原因 251
5.6.4 system lock问题分析 252
5.6.5 模拟测试 253
|
內容試閱:
|
前言 从2017年开始,笔者所在的公司开始大量上线MySQL5.7基于GTID的主从构架,在实际的运维工程中,产生了不少问题和疑惑,比如:
主从延迟为什么瞬间跳动?
延迟为0就一定代表没有延迟吗?
从库能和主库一样利用索引吗?
MTS是如何提高从库应用效率的?
mysql.gtid_executed表在从库初始化的时候扮演什么样的角色?
我们开始结合源码来解决问题并解除疑惑。慢慢地,整个主从体系越来越清晰,我们的经验也越来越丰富,为了将这些积累的知识和经验分享给更多的人,我决定撰写本书,这是本书由来的第一个原因。
从MySQL 5.7.17开始,MySQL官方推出了MGR高可用构架,MGR是未来MySQL高可用构架发展的方向,它和主从有着天然的联系,比如GTID、Event、SQL线程等基本都是通用的,要深入学习MGR,必须先深入学习主从原理。为了让广大读者能够打好学习MGR的基础,我更加坚定了撰写本书的想法,这也是本书由来的第二个原因。
在MySQL这个开源领域,人才济济、高手如云,优秀的著作比比皆是,比如最近我的朋友罗小波、沈刚著的《数据生态:MySQL复制技术与生产实践》就是一本优秀的MySQL主从相关书籍,书中的案例可作为本书的补充。我希望以本书为载体和广大的MySQL爱好者互相交流、互相学习、共同进步,这也是本书由来的最后一个原因。
讨论范围 我从2018年开始着手撰写本书,到2019年中旬初稿完成。在我开始学习的时候,MySQL的主流版本还是MySQL 5.7,因此本书的所有代码均限定在MySQL 5.7.22这个版本。现在回想整个撰写过程,比我想象的艰难很多,消耗了我大量的精力和时间。还好有朋友的和同事的支持,最终基本完成。由于精力有限,本书不包含半同步部分,实属遗憾。本书主要讨论范围如下:
源码版本 MySQL 5.7.22。
不覆盖半同步。
只考虑参数master_info_repository和参数relay_log_info_repository设置为TABLE的情况。
只考虑参数binlog_format设置为ROW的情况。
术语约定 行格式:参数binlog_format设置为ROW。
语句格式:参数binlog_format设置为STATEMENT。
binary log:代表binlog物理文件。
order commit:代表MYSQL_BIN_LOG::ordered_commit函数,因为本书中使用频率较高,所以做了简化。
GTID AUTO_POSITION MODE:代表主从使用的是GTID,同时设置了master_auto_position=1。
POSITION MODE:代表主从使用的是传统位点方式。
GTID MODE:代表主从使用的是GTID,但是没有设置master_auto_position=1。
单SQL线程:用来和MTS进行区分,代表只有一个SQL线程进行Event的应用。
MTS:Multi-Threaded Slaves的简称,包含一个协调线程和多个工作线程,Event由工作线程应用。
本书结构 深入学习主从原理,需要按照一定的顺序学习,如果不知道GTID、不知道Event、不知道主库如何生成Event,那么肯定不能深入理解主从原理,因此本书按照这种顺序进行讲解。本书一共分为5章,前4章应该作为一个整体顺序阅读,第5章和前面4章没有关联,可以独立阅读。
第1章:介绍GTID相关的知识点,包含GTID的构成、GTID模块的初始化、GTID中的运维等知识点。
第2章:介绍binary log中的主要Event,从作用、格式讲解、实际解析等几个维度讲解各个Event。
第3章:介绍主库是如何生成Event的,以及DUMP线程是如何通过GTID进行主库binary log定位,并且进行Event传输的。
第4章:介绍从库是如何应用Event的,并且还包含了推荐的参数设置和Seconds_Behind_Master延迟的相关知识点。
第5章:本章作为知识拓展,讲解线程的初步知识、MDL LOCK、排序等热门话题,还包含了主从相关的案例。
目标读者 MySQL DBA。
MySQL源码爱好者。
致谢 感谢业内众多MySQL专家在百忙之中为本书做推荐序,他们是翟卫祥、温正湖、桑栎、叶金荣、吴炳锡、王伟、黄炎、王英杰、冯光普、李大玉、李真旭、杨建荣、杨奇龙、徐晨亮。
感谢北京中亦安图科技领导黄远邦为本书做封底序。
感谢我的同事戴正勇、杨海波、田兴椿、邹启建,没有你们的帮助和支持,本书不可能完成。
感谢电子工业出版社的孙学瑛编辑对我写作的支持,她严谨的态度让人钦佩。
感谢我的父亲高祖恒,妻子颜蕾和两个可爱的儿子,感谢你们的支持,你们的支持是我最大的动力,我爱你们。
读者反馈和勘误 由于笔者能力有限,书中难免存在一些错误和不妥,敬请批评和指正,如果您有更多宝贵的意见请通过如下方式进行联系和反馈。
|
|