首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >PolarDB 大能人系列--开年"我"就丢人 之 从节点不能用 !

PolarDB 大能人系列--开年"我"就丢人 之 从节点不能用 !

作者头像
AustinDatabases
发布2026-03-12 18:35:29
发布2026-03-12 18:35:29
30
举报
文章被收录于专栏:AustinDatabasesAustinDatabases

开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, OceanBase, Sql Server等有问题,有需求都可以加群群内有各大数据库行业大咖,可以解决你的问题。加群请联系 liuaustin3 ,(共3400人左右 1 + 2 + 3 + 4 +5 + 6 + 7 + 8 +9)(1 2 3 4 5 6 7 8群已经爆满 9群 300+,开10群PolarDB专业学习群110+)

这是Austindatabases公众号的2026年的第三个系列,我是大能人。本系列会围绕PolarDB 进行知识分享,发现PolarDB云中中的问题,以及产品设计中的一些建议为主题,基于本人工作中当前核心的数据库是PolarDB for MySQL 和 PolarDB for PostgreSQL 为基础,里面也会融合一些 RDS 数据库产品,作为年度第三个核心的知识点。这是一个系列,本年度将在此系列来对 PolarDB的内容进行学习和分享

PolarDB 大能人系列--推演PolarDB 4年都干了什 !!!

上期说留了一个问题,事情发生在过完年后的一个工作日,开发找到我说他们的PolarDB 8.02 出现问题,表象就是从节点没有任何的select语句执行,所有的读写压力都集中在写节点。

从节点的压力
从节点的压力

从节点的压力

写节点压力
写节点压力

写节点压力

随即开发询问是怎么回事,根据我们使用PolarDB的经验,这样的情况一般发生在以下的集中情况

1 连接到错误的地址,应用或者个人链接到数据库并未使用集群地址,而是使用了主地址,这样的情况所有的连接必须打到主节点,会产生这样的情况。

2 使用显示事务,也就是在每个语句中执行中,都带入了begin; 语句 ; commit;

而不是autocommit = 1; 将每个语句的执行都隐式提交。

主机屏幕
主机屏幕

主机屏幕

3 在一个事务中存在写语句 和 读语句并存,并且写语句在前的情况,封装在一起。

以上的三种情况,默认PolarDB是不会进行只读语句的分发到从节点的情况。

这里我深知这几个问题,但是大意失荆州。开发的亲告知,他们不会封装事务到查询语句。同时要求我进行测试,看看是不是只读语句无法打入到只读节点,通过集群的地址。

这里我偷懒了,由于当时忙,让同事去处理了此事,同时应该是用了Python进行了集中并发的测试处理,测试中明显的将生产的主节点的压力打了上去,而只读节点还是没有任何的语句。

期间我也尝试了,运行了几个select sleep(10);这些语句是可以打入到只读节点,并被发现的。

后续麻烦了阿里云的PolarDB的诸位亲,帮助查问题。最后打开了数据库审计系统,通过审计将在数据库中执行的每条语句进行抓取。

明显看到问题是在每个执行期间,执行了 set autocomment = 0; 在每个语句执行前。问题找到了,但是开发问,为什么我们进行测试的时候,也是反应到只读节点没有任何的反应。

最后发现,是同事的python 程序默认的情况下也会发出autocommit = 0; 的语句。

最后证明,问题完全不在PolarDB,而是开发和我们的疏忽导致的问题。那么如果开发无法进行程序的修改,还是会发出autocommit = 0;的语句如何进行select语句的拆分。

使用事务拆分技术
使用事务拆分技术

使用事务拆分技术

在PolarDB for MySQL中会有一个 事务拆分的选项,我们只要启用,事务全拆分就可以解决这个问题。

同时PolarDB可以保证不会出现,业务逻辑错误的问题,比如写入数据,必须能查到刚刚更新的数据,这个是可以做到了,从数据库原理上,每次的读都是比对日志的中的序列号,如果万一从节点还没有这个 DML的数据,那么会启动全局一致性,如果20ms内这个数据没有,会自动将查询语句导入会主节点,进行数据的查询。

最后

1 对麻烦了PolarDB 的研发同学处理这么低级的错误,抱歉,下次我写一个程序,避免出现如上的问题,集训压测和测试。

2 对于熟知的PolarDB原理不要迷糊,坚定系统就是这样,而不是怀疑是不是数据库代理出现问题,等等的一些无端的猜想。

最后求证根因是程序的连接池在配置的时候,将一个参数autocommit = false,导致新建一个链接就会将执行的语句封装成一个事务,直到这个链接失效。

图片
图片
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-03-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AustinDatabases 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档