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

购买时选型说明

  • 计费方式:包年包月
  • 地域: 深圳
  • 引擎: MySQL5.7
  • 产品系列: 基础系列(单台), 高可用系列(一主一备的高可用架构,备节点不可访问, 可或者读能力), 集群系列(一主多备的高可用架构,支持自动故障切换。备节点可访问,提升读能力). 集群系列
  • 产品类型: 标准版
  • 存储类型: 高性能云盘 比 ESSD云盘 更好
  • VPC: 选择与服务器同一个
  • 主可用区及网络: 选择与服务器同一个区域
  • 备节点数量: 在集群模式下, 可选择有几个备节点, 这里选择2个, 现在的架构是1主2备, 后面在数据库代理中配置读写分离
  • 部署方案: 选择单区域部署, 都在一个区域访问更快
  • 实例规格: 独享 16核32G
  • 数据库代理: 通用型
  • 存储空间: 100G默认即可, 减少也少不了多少钱
  • 实例名称: 给实例取个名, 方便后续分辨
  • 数据库端口: 和代码中的一致
  • 其他配置默认即可
  • 时间: 2026年5月17日 08:48:27 - 2026年5月25日 00:00:00 (7天)

购买后必要设置

  • 拓扑结构: 数据库连接 (直连地址, DMS), 数据库代理连接 (代理地址, 生产环境, 读写分离、连接池等)
  • 账号管理: 新增高权限账号, 账号密码和项目内的一致, 这样就只需修改项目数据库host就可以使用了
  • 修改端口(直连): 基本信息 -> 拓扑结构管理 -> 数据库链接 -> 编辑 -> 修改链接信息
  • 修改端口(代理): 基本信息 -> 拓扑结构管理 -> 数据库代理链接 -> 修改内网 -> 修改链接信息
  • 申请外网地址: 如果非本账号下的服务器, 需要外网地址访问, 这里暂时不需要
  • 白名单设置: 白名单与安全组 -> 默认会添加vpc网段白名单, 已经够用
  • 数据库链接: 页面中记录了直连/代理连接信息, 其信息在拓扑结构中也可以设置
  • 数据库连接测试: 数据库连接 -> 连接诊断 -> 内网诊断
  • 数据库代理: 连接拓扑管理非常重要, 其中 连接修改配置非常重要, 具体见数据库代理设置设置
  • 监控报警: 运行过程中的主要查看页面
  • 备份与恢复: 备份策略 - 编辑基础备份, 保留天数7天,快照备份周期全选,秒级备份开启,快照备份开始时间段选凌晨, 日志备份默认,其他默认
  • 日志管理: 运行期间查看慢日志/错误日志
  • 参数设置: 一般不变, 修改需要详细了解才行
  • 数据迁移及同步: 非常重要, 数据迁移要用到(购买很便宜的)

DMS数据库管理

  • 登录进阿里云的DMS管理系统
  • 常用功能 -> 实例管理 -> 删除过期的实例, 过期的干扰使用需删除
  • 常用功能 -> 实例管理 -> 同步阿里云实例, 可同步部分实例
  • 常用功能 -> 实例管理 -> 新增, Redis需要手动新增, 新增时选择:实例类型Redis/实例地区深圳/实例ID选择已有的/访问方式选择免密
  • 刷新DMS就可以看到刚才添加的实例, Redis可直接使用因为是免密的, MySQL需要登录

数据迁移及同步

  • 创建迁移任务
  • 配置源库机器目标库
    • 测试数据库正式数据库数据库名不一样, 不然容易将测试库和正式库混淆, DMS不允许修改数据库名
    • 首次迁移选择库表结构迁移全量迁移, 全量迁移不收费
    • 数据校验为全量校验
  • 对象配置
  • 预检查
  • 购买

使用时遇到了点点障碍

  • 申请外网地址, 不在同一个专有网络和交换机下的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 请求

扩展阅读

此处评论已关闭