阿里云MySQL集群配置遇到的一些问题

购买时选型说明

使用时遇到了点点障碍

  • 申请外网地址, 不在同一个专有网络和交换机下的IP需要开启外网地址才能访问, 不推荐在生产模式中使用

数据库代理设置

wechat_2025-10-24_085217_939.png

如上图, 数据库代理设置非常关键, 设置恰当可以提升数据库性能, 反正会降低其性能, 下面就来说明一下各个设置其含义

读写属性:

必须选择读写(读写分离)才能让代理自动将 SELECT 发往只读实例, 如果选“只读”,则无法写入,应用崩溃

不管是golang/php/swoole等应用一般都会选择读写

负载均衡策略

  • 基于活跃请求数负载均衡: 常驻内存+长连接, 每个连接持续数分钟至数小时, 代理会认为该连接一直活跃, 结果代理就减少其新连接, 导致了负载不均.
  • 基于权重比例负载均衡: 按预设权重均匀分发新连接, 不受长连接“活跃状态”影响

解读: 这个选择需要因地制宜, golang语言本身有连接池设计, 其本质不是长连接, 它会动态的创建销毁连接, 所以其更适合"给予活跃度请求". swoole等是固定数量的长连接, 必须选择"给予权重比例", 强制均匀分发. php-fpm每个请求很快结束, “活跃请求数”能真实反映当前实例压力, 所以推荐"基于活跃请求数负载均衡"实现动态负载均衡.

连接池(代理到MySQL服务器之间的连接)

客户端(Swoole Worker)建立一个会话, 代理为该会话长期保持一个到 RDS 的后端连接, 所有 SQL 复用该连接.

  • 关闭连接池: 适用于长连接、连接数量少,或业务侧已经使用了其他连接池
  • 会话级连接池: 适用于短连接、连接创建频繁,但业务受到事务级连接池使用限制的场景。
  • 事务级连接池: 适用于短连接、连接创建频繁且数量达到MySQL数据库连接数限制的场景。

这里的"连接池", 和编程语言中的"连接池"是什么关系?

它们不是同一个东西,但协同工作,共同构成一个高效的数据库访问链路。

  • 编程语言连接池: 复用应用到代理的连接,减少建连开销
  • 阿里云数据库代理连接池: 复用代理到 RDS 实例的连接,减轻后端压力

一致性级别

  • 最终一致性(弱)一致性需求较弱,更希望尽量减轻主节点压力,使更多读请求路由到只读节点时,您可以选择最终一致性。(同一个用户注册后立即登录, 可能登录失败)
  • 会话一致性(中)是用户体验与性能的最佳平衡。单个会话内存在一致性依赖,推荐使用会话一致性. (保证同一个用户注册后立即登录成功)
  • 全局一致性(强)性能差, 读多写少情况, 会话间的依赖大的情况.(会话A注册后, 会话B立即能看到)

一致性级别越高(全局一致性 > 会话一致性 > 最终一致性),读写分离性能越低。
一般情况下,推荐使用会话一致性,不仅对性能影响较小,且能满足大多数应用场景的需求。

延迟阈值

监控只读实例的 主从延迟 如果延迟 > 阈值(如 30s),自动将其从负载池中剔除不再分发读请求给它。

事务拆分

什么是事务拆分?允许事务中的 SELECT 走只读实例。强烈建议关闭,确保事务中所有操作都走主库。如果走从库, 在主从延迟的情况下有可能查询失败。

读权重分配

为每个 只读实例 分配一个权重值, 代理根据权重按比例分发 SELECT 请求

扩展阅读

此处评论已关闭