阿里云MySQL集群配置遇到的一些问题
购买时选型说明
略
使用时遇到了点点障碍
- 申请外网地址, 不在同一个专有网络和交换机下的IP需要开启外网地址才能访问, 不推荐在生产模式中使用
数据库代理设置

如上图, 数据库代理设置非常关键, 设置恰当可以提升数据库性能, 反正会降低其性能, 下面就来说明一下各个设置其含义
读写属性:
必须选择读写(读写分离)才能让代理自动将 SELECT 发往只读实例, 如果选“只读”,则无法写入,应用崩溃
不管是golang/php/swoole等应用一般都会选择读写
负载均衡策略
- 基于活跃请求数负载均衡: 常驻内存+长连接, 每个连接持续数分钟至数小时, 代理会认为该连接一直活跃, 结果代理就减少其新连接, 导致了负载不均.
- 基于权重比例负载均衡: 按预设权重均匀分发新连接, 不受长连接“活跃状态”影响
解读: 这个选择需要因地制宜, golang语言本身有连接池设计, 其本质不是长连接, 它会动态的创建销毁连接, 所以其更适合"给予活跃度请求". swoole等是固定数量的长连接, 必须选择"给予权重比例", 强制均匀分发. php-fpm每个请求很快结束, “活跃请求数”能真实反映当前实例压力, 所以推荐"基于活跃请求数负载均衡"实现动态负载均衡.
连接池(代理到MySQL服务器之间的连接)
客户端(Swoole Worker)建立一个会话, 代理为该会话长期保持一个到 RDS 的后端连接, 所有 SQL 复用该连接.
- 关闭连接池: 适用于长连接、连接数量少,或业务侧已经使用了其他连接池
- 会话级连接池: 适用于短连接、连接创建频繁,但业务受到事务级连接池使用限制的场景。
- 事务级连接池: 适用于短连接、连接创建频繁且数量达到MySQL数据库连接数限制的场景。
这里的"连接池", 和编程语言中的"连接池"是什么关系?
它们不是同一个东西,但协同工作,共同构成一个高效的数据库访问链路。
- 编程语言连接池: 复用应用到代理的连接,减少建连开销
- 阿里云数据库代理连接池: 复用代理到 RDS 实例的连接,减轻后端压力
一致性级别
- 最终一致性(弱)一致性需求较弱,更希望尽量减轻主节点压力,使更多读请求路由到只读节点时,您可以选择最终一致性。(同一个用户注册后立即登录, 可能登录失败)
- 会话一致性(中)是用户体验与性能的最佳平衡。单个会话内存在一致性依赖,推荐使用会话一致性. (保证同一个用户注册后立即登录成功)
- 全局一致性(强)性能差, 读多写少情况, 会话间的依赖大的情况.(会话A注册后, 会话B立即能看到)
一致性级别越高(全局一致性 > 会话一致性 > 最终一致性),读写分离性能越低。
一般情况下,推荐使用会话一致性,不仅对性能影响较小,且能满足大多数应用场景的需求。
延迟阈值
监控只读实例的 主从延迟 如果延迟 > 阈值(如 30s),自动将其从负载池中剔除不再分发读请求给它。
事务拆分
什么是事务拆分?允许事务中的 SELECT 走只读实例。强烈建议关闭,确保事务中所有操作都走主库。如果走从库, 在主从延迟的情况下有可能查询失败。
读权重分配
为每个 只读实例 分配一个权重值, 代理根据权重按比例分发 SELECT 请求
扩展阅读
略
最后更新于 2025-10-24 10:37:53 并被添加「」标签,已有 63 位童鞋阅读过。
本站使用「署名 4.0 国际」创作共享协议,可自由转载、引用,但需署名作者且注明文章出处
此处评论已关闭