You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL Router配置:单主组复制下如何路由写请求至主节点

解决MySQL Router无法转发写请求到主节点的问题

核心问题分析

你当前的MySQL Router配置使用round-robin轮询策略,会把请求平均分发给所有指定节点,但单主模式的组复制集群中,仅主节点可写,其余从节点开启了super-read-only,因此写请求发到从节点就会触发报错。要解决问题,关键是让Router自动识别集群主节点,将写请求仅转发至该节点。

推荐方案:用Router Bootstrap自动生成读写分离配置

MySQL Router提供的bootstrap命令可直接从组复制集群获取元数据,自动生成能识别主从角色的路由配置,主节点切换时还能自动更新,无需手动修改。操作步骤如下:

  1. 停止当前运行的MySQL Router服务
    可通过Windows服务管理器停止,或用命令行执行:

    net stop MySQLRouter
    
  2. 执行Bootstrap命令生成配置
    打开命令提示符,切换到MySQL Router的bin目录(如D:\MySQL Router\bin),执行以下命令(替换为你的集群节点地址和有权限的账号):

    mysqlrouter --bootstrap root@db03.lan:3306 --user=routing --conf-path=D:\MySQL Router\mysqlrouter.conf
    
    • root@db03.lan:3306:连接集群任意节点的管理员账号(需拥有mysql_router_replication权限)
    • --user=routing:指定Router运行用户
    • --conf-path:指定生成的配置文件路径
  3. 调整生成的配置(可选)
    Bootstrap会自动生成两个核心路由段:

    • [routing:primary_rw]:负责写请求,默认绑定端口6446,路由策略为first-available(自动指向当前主节点)
    • [routing:primary_ro]:负责读请求,默认绑定端口6447,路由策略为round-robin或load-balanced
      你可根据需求修改bind_address和bind_port,比如将写端口改为3306,让应用直接通过默认端口连接写请求:
    [routing:primary_rw]
    bind_address = db.lan
    bind_port = 3306
    destinations = metadata-cache://primary/default?role=PRIMARY
    routing_strategy = first-available
    
  4. 重启MySQL Router服务

    net start MySQLRouter
    

    此后所有发往3306端口的写请求都会自动转发到当前主节点,主节点切换时Router会自动感知并更新路由。

备选方案:手动配置第二个Router指向主节点(不推荐)

若不想使用Bootstrap,也可单独配置一个Router实例专门处理写请求,但此方式的缺点是主节点切换后需手动更新配置,无法自动适配。手动配置示例如下:

[DEFAULT]
user = routing
logging_folder = D:\MySQL Router\logs
max_total_connections = 1500

[routing:write]
bind_address = db.lan
bind_port = 3307  # 用独立端口区分写路由
destinations = db03.lan:3306  # 手动指定当前主节点地址
routing_strategy = first-available

当主节点切换到其他节点时,需手动修改destinations的值并重启Router,否则写请求会失败。

内容的提问来源于stack exchange,提问作者DanielW

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 14:23:17