MySQL Router配置:单主组复制下如何路由写请求至主节点
解决MySQL Router无法转发写请求到主节点的问题
核心问题分析
你当前的MySQL Router配置使用round-robin轮询策略,会把请求平均分发给所有指定节点,但单主模式的组复制集群中,仅主节点可写,其余从节点开启了super-read-only,因此写请求发到从节点就会触发报错。要解决问题,关键是让Router自动识别集群主节点,将写请求仅转发至该节点。
推荐方案:用Router Bootstrap自动生成读写分离配置
MySQL Router提供的bootstrap命令可直接从组复制集群获取元数据,自动生成能识别主从角色的路由配置,主节点切换时还能自动更新,无需手动修改。操作步骤如下:
停止当前运行的MySQL Router服务
可通过Windows服务管理器停止,或用命令行执行:net stop MySQLRouter执行Bootstrap命令生成配置
打开命令提示符,切换到MySQL Router的bin目录(如D:\MySQL Router\bin),执行以下命令(替换为你的集群节点地址和有权限的账号):mysqlrouter --bootstrap root@db03.lan:3306 --user=routing --conf-path=D:\MySQL Router\mysqlrouter.confroot@db03.lan:3306:连接集群任意节点的管理员账号(需拥有mysql_router_replication权限)--user=routing:指定Router运行用户--conf-path:指定生成的配置文件路径
调整生成的配置(可选)
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重启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
相关产品推荐
相关产品推荐

