前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Mysql 主备原理

Mysql 主备原理

作者头像
执生
发布2020-11-27 14:45:47
1.8K0
发布2020-11-27 14:45:47
举报
文章被收录于专栏:立权的博客立权的博客

Mysql 支持互为主从,主库通过binlog 将执行的语句传给从库,具体的执行机构:

   主库上的 dump thread,主库上的 binlog 只有在写入到硬盘之后才能通过 dump thread 传出

   从库上的 IO thread,接收主库的 dump thread 发过来的 binlog 并且生成 relay log,这么一层中间日志

   从库上的 sql thread,执行 relay log 中的语句

值得注意的是 ,从库 会 向主库 验证身份,并且告知 主库 binlog 需要开始 读取的位置, 主库才会通过 dump thread 发送给 io thread

各个从库 请求的位置不一样,得到的最终数据可能不一样,连接上之后,主库会一直传 binlog 内容给 从库,直到没有可以传的内容为止。至此之后,如果再有语句执行,写入 binlog 到 磁盘。

则主库 再通过 dump thread 传给 io thread

binlog 有 三种格式 :

  1. row  这种格式 记录的是关乎主键的,也就是记录 主键 = x 这一行被修改了什么,如果被修改的是多行,则会记录 主键 = x,主键 = y ... 被修改了什么

  2.statement  这种格式 是 单纯记录执行的语句的,但是单纯地记录语句 可能发生不一致的情况,比如主库和从库对于 binlog 的同一条语句选用了 不同索引。

       比如 delete * from table where a > x and b < y , 假设 a 和 b 上都有索引,那么可能主库选择 索引 a, 从库选择 索引 b,删除的列可能不完全相同,导致主从不一致

  3.mixed  这种格式 是上述两种的混合。当记录的是有歧义的语句时候,会使用 row 格式,否则用 statement 格式。也就是 像 2 那样有歧义的话,就会使用 row 格式,而不是 statement

循环复制问题,前面提到,mysql 支持互为主从,那么 binlog 不会在 互为主从的两个数据库之间循环复制吗?

不会,因为数据库会按照 server id 来判断 binlog 是否能被执行

比如 A库 server id = 1,B库 server id = 2, A 和 B 互为主从,互为主从的 库必须 server id 不同

那么 A库产生的 binlog 上 标有 server id = 1, 传给B库,B库执行后产生 binlog,产生的 binlog 的 server id 和 之前的一样, 也就是1

然后再 传给A库 , A库判断 server id 和自己一样,不执行,循环中断。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-11-25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档