28 | 读写分离有哪些坑?
28 | 读写分离有哪些坑?
讲述:林晓斌
时长21:22大小19.52M
强制走主库方案
Sleep 方案
判断主备无延迟方案
配合 semi-sync
等主库位点方案
GTID 方案
小结
上期问题时间
赞 52
提建议
精选留言(83)
- 有铭2019-01-16这专栏真的是干货满满,每看一篇我都有“我发现我真的不会使用MySQL”和“我原来把MySQL用错了”的挫败感
作者回复: 这样我觉得你和我的时间都值了😆 把你更新了认识的点发到评论区,这样会印象更深哈🤝
共 8 条评论121 - 曾剑2019-01-16老师写的每一篇文章都能让我获益良多。每一篇都值得看好几遍。 今天的问题,大表做DDL的时候可能会出现主从延迟,导致等 GTID 的方案可能会导致这部分流量全打到主库,或者全部超时。 如果这部分流量太大的话,我会选择上一篇文章介绍的两种方法: 1.在各个从库先SET sql_log_bin = OFF,然后做DDL,所有从库及备主全做完之后,做主从切换,最后在原来的主库用同样的方式做DDL。 2.从库上执行DDL;将从库上执行DDL产生的GTID在主库上利用生成一个空事务GTID的方式将这个GTID在主库上生成出来。 各个从库做完之后再主从切换,然后再在原来的主库上同样做一次。 需要注意的是如果有MM架构的情况下,承担写职责的主库上的slave需要先停掉。展开
作者回复: 👍 表示这两篇文章你都get到了
共 5 条评论90 - 某、人2019-01-16老师我先请教两个问题(估计大多数同学都有这个疑惑)😄: 1.现在的中间件可以说是乱花渐欲迷人眼,请问老师哪一款中间件适合大多数不分库分表,只是做读写分离业务的proxy,能推荐一款嘛?毕竟大多数公司都没有专门做中间件开发的团队 2.如果是业务上进行了分库分表,老师能推荐一款分库分表的proxy嘛?我目前了解到的针对分库分表的proxy都或多或少有些问题。不过分布式数据库是一个趋势也是一个难点。
作者回复: 额,这个最难回答了 说实话因为我原来团队是团队自己做的proxy(没有开源),所以我对其他proxy用得并不多,实在不敢随便指一个。 如果我说个比较熟悉的话,可能MariaDB MaxScale还不错
共 5 条评论40 - 狼猫2019-06-24全网最好的课程,没有之一,不接受反驳34
- 易翔2019-01-16为老师一句你的时间和我的时间都值了。点赞共 2 条评论28
- Mr.Strive.Z.H.L2019-01-21老师您好: 关于主库大表的DDL操作,我看了问题答案,有两种方案。第一种是读写请求转到主库,在主库上做DDL。第二种是从库上做DDL,完成后进行主从切换。 关于第二种,有一个疑惑: 从库上做DDL,读写请求走主库,等到从库完成后,从库必须要同步DDL期间,主库完成的事务后才能进行主从切换。而如果DDL操作是删除一列,那么在同步过程中会出错呀?(比如抛出这一列不存在的错误)。展开
作者回复: 你说得对,这种方案下能支持的DDL只有以下几种: 创建/删除索引、新增最后一列、删除最后一列 其中DBA会认为“合理”的DDL需求就是: “创建/删除索引、新增最后一列” 新春快乐~
共 7 条评论25 - 猪哥哥2019-01-17老师, 你真棒, 我公司的生产环境解决过期读使用的就是强制走主库方案, 看了这篇文章, 困惑了很久的问题迎刃而解!很感谢!20
- 钱2019-08-041:单机的性能总是有限的,所以,就出现了读写分离 2:读写分离带来了更高的性能,也引入了数据不一致的问题 3:为了数据一致性,又产生了各种解决方案 人少力量小,人多了事就多,如果管理能力好,还是人多好办事。 原理是这样,没怎么实操过,感谢老师的分享,让自己的认知边界有移动了一点点。
作者回复: 👍
共 2 条评论17 - Max2019-01-17我一般是先是在从库上设置 set_log_bin=off,然后执行ddl,语句。 然后完成以后,主从做一下切换。然后在主库上在执行一下set_log_bin=off,执行ddl语句。 然后在做一下主从切换。 个人对pt-online-scheman-change不是很推荐使用,它的原理基本是创建触发器,然后创建和旧表一样结构的数据表, 把旧表的数据复制过去。最后删除旧表。以前做个一个测试,如果旧表一直在被select,删除过程会一直会等待。 所以个人不是很建议。万一不小心变成从删库到路步,那就得不偿失了。 老师,有个问题想请教一下,一主多从可以多到什么地步,以前我们CTO解决的方案就是加机器,一主十三从。 当时我是反对的,其实个人建议还是从SQL,业务上面去优化。而不是一味的加机器。如果加机器解决的话,还要DBA做什么呢?展开
作者回复: 前面的分析很好哈 然后一主13从有点多了,否则主库生成binlog太快的话,主库的网卡会被打爆。要这么多的话,得做级联。 DBA解决不能靠加机器解决的事情^_^ 而且如果通过优化,可以把13变成3,那也是DBA的价值
共 2 条评论13 - 二马2019-01-16最近做性能测试时发现当并发用户达到一定量(比如500),部分用户连接不上,能否介绍下MySQL连接相关问题,谢谢!
作者回复: 修改max_connections参数
12 - 万勇2019-01-16老师,请教下。 1.对大表做ddl,是可以采用先在备库上set global log_bin=off,先做完ddl,然后切换主备库。为了保证数据一致性,在切主备的时候,数据库会有个不可用的时间段,对业务会造成影响。现在的架构方式,中间层还有proxy,意味着proxy也需要修改主备配置,做reload。这样做的话,感觉成本太高,在真正的生产环境中,这种方法适用吗? 2.目前我们常采用的是对几百万以上的表用pt-online-schema-change,这种方式会产生大量的binlog,业务高峰期不能做,会引起主备延迟。在生产业务中,我觉得等主库节点或者等gtid这种方案挺不错,至少能保证业务,但也会增加主库的压力。 3.5.7版本出的group_replication多写模式性能不知道如何?架构变动太大,还不敢上。展开
作者回复: 1. 是这样的,我们说的是,如果非紧急情况下,还是尽量用gh-ost,在“紧急”的情况下,才这么做;确实是要绕过proxy的,也就是说,这事儿是要负责运维的同学做; 2. pt工具是有这个问题,试一下gh-ost哈;group_replication多写模式国内我还没有听到国内有公司在生产上大规模用的,如果你有使用经验,分享一下哈
共 2 条评论8 - 我是曾经那个少年2021-03-03阿里云数据库的方案就是,增加事物注解强制走主库,我感觉这个思路挺好,业务上也比较简单。6
- 天下第七2020-10-17这绝对极客时间最干货的专栏,内容+评论都是高精,原来我不会MySQL,我对MySQL一无所知,惭愧惭愧。6
- Zhaoyang2020-01-27最近这几篇文章,真是看的我比较辛苦,因为我平时的业务都是增删改查,而且,有DBA同学呢,所以主从这里我接触的非常少,我顶多也就考虑一下主从不同步的问题。其他问题我都不会想到。也不会知道怎么解决。 那我接下来还是先把专栏过一遍把,先留个大概其的印象,目前来说并没有搞懂,因为自己确实没有经历过。共 2 条评论6
- 啊啊啊哦哦2019-04-10老师。最近公司在阿里云要用 一主多从。 我想问下阿里的。 select *from test for update 会定位到主库吗
作者回复: 设计不出bug的话,应该要😆
共 2 条评论5 - Dovelol2019-01-16老师好,有几个问题想请教下, 1.如果不想有过期读,用等GTID的方案,那么每次查询都要有等GTID的相关操作,增加的这部分对性能有多少影响; 2.我们用的读写分离proxy不支持等GTID,那是不是自己要在客户端实现这部分逻辑,等于读写分离的架构既用了proxy,又在客户端做了相关策略,感觉这方案更适合有能力自研proxy的公司啊; 3.感觉目前大多数生产环境还是用的读主库这种方式避免过期读,如果只能用这种方案的话该怎么扩展mysql架构来避免主库压力太大呢。 我们是项目上线很久然后加的读写分离,好多service层代码写的不好,可以读从库的sql被写到了事务中,这样会被proxy转到主库上读,所以导致主库负担了好多读的sql,感觉读写分离不仅对mysql这块要掌握,整体的代码结构上也要有所调整吧。展开
作者回复: 1. 这个等待时间其实就基本上是主备延迟的时间 2. 用了proxy这事情就得proxy做了,就不要客户端做了。没有gtid,可以用倒数第二种方法呀:) 3. 是的,其实“走主库”这种做法还挺多的。我之前看到有的公司的做法,就是直接拆库了。等于一套“一主多从”拆成多套。
5 - Charles | 姜海龙2019-08-12这专栏真的是干货满满,每看一篇我都有“我发现我真的不会使用MySQL”和“我原来把MySQL用错了”的挫败感共 2 条评论4
- 晓杰2019-06-15看了判断主备无延迟这种方案,有个疑惑: 读写分离的读应该是读从库的吧,为什么是去判断主备无延迟,而不是判断主从的无延迟
作者回复: 在说主备延迟/主从延迟的时候,从库和备库我当成同一个概念了😆
4 - SZQ2021-09-06这一篇看了第三遍,还是看得头晕,等到猴年马月再回来看一下吧3
- 杨2020-04-23我主从库以前都不知道怎么实现的哈哈,看了老师的专栏学到了很多 如何开启gtid老师看看这个可以吗? gtid_mode=ON enforce_gtid_consistency=ON http://blog.itpub.net/31429259/viewspace-2643665/ 等库位点方案select master_pos_wait(File, Position, 1)我在mysql中执行不了是什么原因呀? 客户端代码中调用 mysql_session_track_get_first 这个函数? 这个我用java或者go怎么调用?直接java调用函数函数一样调用mysql_session_track_get_first吗展开3