Mysql数据库高可用解决方案-Mysql Router

目录

[一.MySQL Router介绍](#一.MySQL Router介绍)

[1. 什么是 MySQL Router?](#1. 什么是 MySQL Router?)

[2. MySQL Router 的主要用途](#2. MySQL Router 的主要用途)

[3. MySQL Router 的工作原理](#3. MySQL Router 的工作原理)

[4. MySQL Router 的核心组件](#4. MySQL Router 的核心组件)

[5. MySQL Router 的部署和配置](#5. MySQL Router 的部署和配置)

[6. MySQL Router 的优势](#6. MySQL Router 的优势)

[7. 注意事项](#7. 注意事项)

[8. MySQL Router 与其他工具的对比](#8. MySQL Router 与其他工具的对比)

[9. 总结](#9. 总结)

[二.Mysql Router配置](#二.Mysql Router配置)

[1. MySQL Router 配置文件概述](#1. MySQL Router 配置文件概述)

[2. 配置文件的常用部分和参数](#2. 配置文件的常用部分和参数)

[2.1 [DEFAULT] 部分](#2.1 [DEFAULT] 部分)

[2.2 [logger] 部分](#2.2 [logger] 部分)

[2.3 [metadata_cache] 部分](#2.3 [metadata_cache] 部分)

[2.4 [routing] 部分](#2.4 [routing] 部分)

[3. 配置示例](#3. 配置示例)

[4. 使用引导(Bootstrap)生成配置](#4. 使用引导(Bootstrap)生成配置)

[5. 配置时的注意事项](#5. 配置时的注意事项)

[6. 验证配置](#6. 验证配置)

[7. 高级配置示例](#7. 高级配置示例)

[8. 总结](#8. 总结)


一.MySQL Router 介绍

MySQL Router 是一个轻量级中间件,用于在应用程序和后端 MySQL 服务器之间提供透明的连接路由。它是 MySQL 高可用性(HA)解决方案的重要组成部分,特别是在 MySQL InnoDB Cluster 和 Group Replication 环境中。以下是对 MySQL Router 的详细介绍,包括其功能、用途、架构和工作原理。

1. 什么是 MySQL Router?

MySQL Router 是 MySQL 官方提供的一个工具,旨在简化应用程序与 MySQL 数据库集群之间的连接管理。它通过智能路由数据库流量到合适的后端 MySQL 服务器,支持高可用性、可扩展性和负载均衡等功能。MySQL Router 不直接处理数据包内容,而是基于连接进行路由,因此性能开销低,适合高吞吐量场景。

核心特性:

  1. 透明路由:应用程序连接到 MySQL Router 就像连接到单个 MySQL 实例,无需修改应用程序逻辑。
  2. 高可用性:自动处理主节点故障并将连接重定向到可用节点。
  3. 负载均衡:支持多种路由策略(如轮询、首选可用),分发连接到不同服务器。
  4. 插件化架构:允许开发者通过插件扩展功能,满足自定义需求。
  5. 与 InnoDB Cluster 集成:作为 InnoDB Cluster 的核心组件,自动从集群元数据获取拓扑信息。

版本支持:

  1. MySQL Router 8.0 支持 MySQL Server 5.7 和 8.0。
  2. MySQL Router 8.4 支持 MySQL Server 8.0 和 8.4,但不支持更高版本(如 9.0)。

2. MySQL Router 的主要用途

MySQL Router 广泛应用于以下场景:

高可用性(HA):

  1. 在主从复制或 InnoDB Cluster 中,MySQL Router 自动将连接路由到当前主节点(Primary)。
  2. 当主节点故障时,Router 检测集群拓扑变化并将连接重定向到新的主节点,无需应用程序干预。

负载均衡:

  1. 对于读操作,Router 可以将连接分发到从节点(Secondary),减轻主节点压力。
  2. 支持轮询(Round-Robin)或首选可用(First-Available)等策略。

简化应用程序开发:

  1. 应用程序无需实现复杂的故障转移逻辑,只需连接到 Router 的端口,Router 负责路由和故障处理。
  2. 对应用程序透明,连接方式与直接连接 MySQL 服务器一致。

集群管理:

  1. 在 InnoDB Cluster 中,Router 通过元数据缓存插件(Metadata Cache Plugin)与集群通信,动态获取主从拓扑信息。

自定义扩展:

插件化架构允许开发者添加自定义路由逻辑或功能,例如特定的负载均衡策略。

示例场景:

应用程序连接到 Router 的端口(如 6446),Router 将写请求路由到主节点,读请求分发到从节点。

如果主节点故障,Router 自动将后续连接路由到新的主节点,应用程序只需重试连接。

3. MySQL Router 的工作原理

MySQL Router 作为应用程序和 MySQL 服务器之间的代理,负责管理连接路由。其工作流程如下:

客户端连接:

  1. 应用程序(MySQL 客户端或连接器)连接到 MySQL Router 监听的端口(如 6446 或 6447)。
  2. Router 提供多个端口,通常分为读写(Read/Write)和只读(Read-Only)端口。

路由决策:

  1. Router 根据配置的路由策略(如轮询、首选可用)和集群元数据,选择合适的后端 MySQL 服务器。
  2. 对于 InnoDB Cluster,Router 通过元数据缓存插件动态获取主从拓扑。

连接转发:

  1. Router 将客户端的 MySQL 数据包直接转发到目标服务器,不解析或修改数据包内容(连接路由方式),确保高性能。
  2. 如果目标服务器不可用,Router 返回连接错误,应用程序需重试连接,Router 会选择其他可用服务器。

故障处理:

  1. 如果连接的 MySQL 服务器故障,Router 断开客户端连接,客户端重试后 Router 选择新的可用服务器。
  2. 在 InnoDB Cluster 中,Router 定期刷新元数据,检测主从角色变化。

示例配置(简化):

bash 复制代码
[routing:read_write]

bind_address = 0.0.0.0

bind_port = 6446

destinations = metadata-cache://mycluster/default?role=PRIMARY

mode = read-write



[routing:read_only]

bind_address = 0.0.0.0

bind_port = 6447

destinations = metadata-cache://mycluster/default?role=SECONDARY

mode = read-only
  1. 6446 端口处理写请求,路由到主节点。
  2. 6447 端口处理读请求,路由到从节点(轮询分发)。

4. MySQL Router 的核心组件

MySQL Router 的功能通过插件实现,主要包括以下核心插件:

Connection Routing Plugin:

连接路由插件 :

  1. 负责基于连接的路由,直接转发 MySQL 数据包,提供最大吞吐量。
  2. 支持多种路由策略:

Round-Robin:轮询分发连接,适合读负载均衡。

First-Available:优先连接列表中的第一个可用服务器,适合主节点路由。

Next-Available:故障时切换到下一个可用服务器。

Round-Robin-with-Fallback:结合轮询和故障转移。

Metadata Cache Plugin:

与 InnoDB Cluster 或 Group Replication 集成,定期从集群元数据服务器获取主从拓扑信息。

确保 Router 始终路由到正确的节点(主节点或从节点)。

Keepalive Plugin:

防止 Router 在无服务配置时立即退出,适用于某些部署场景。

Logger Plugin:

记录 Router 的运行日志,用于调试和监控。

插件化架构:

开发者可以通过编写自定义插件扩展 Router 功能,例如实现特定的路由逻辑或监控功能。

5. MySQL Router 的部署和配置

MySQL Router 通常部署在应用程序所在的同一主机上,以减少网络延迟并支持本地 Unix 域套接字连接。以下是部署和配置的典型步骤:

安装 MySQL Router:

从 MySQL 官方网站下载(如 MySQL Router 8.4 或 8.0):https://dev.mysql.com/downloads/router/

支持多种平台(Linux、Windows、macOS 等)。

示例(Linux):

tar -xvf mysql-router-8.4.0-linux-glibc2.17-x86_64.tar.gz

配置 MySQL Router:

创建配置文件(通常为 mysqlrouter.conf),指定路由策略、端口和目标服务器。

示例(InnoDB Cluster):

bash 复制代码
[DEFAULT]

logging_folder = /var/log/mysqlrouter

runtime_folder = /var/run/mysqlrouter



[logger]

level = INFO



[metadata_cache:mycluster]

router_address = 127.0.0.1

bootstrap_server_addresses = mysql://127.0.0.1:3310

user = router_user

password = router_pass



[routing:read_write]

bind_address = 0.0.0.0

bind_port = 6446

destinations = metadata-cache://mycluster/default?role=PRIMARY

mode = read-write



[routing:read_only]

bind_address = 0.0.0.0

bind_port = 6447

destinations = metadata-cache://mycluster/default?role=SECONDARY

mode = read-only

引导(Bootstrap):

使用 --bootstrap 选项自动配置 Router,从 InnoDB Cluster 获取元数据:

mysqlrouter --bootstrap 127.0.0.1:3310 --directory /opt/myrouter --user snoopy

这会生成配置文件、启动/停止脚本和日志目录。

启动 MySQL Router:

使用配置文件启动:

mysqlrouter --config /path/to/mysqlrouter.conf

或使用引导生成的启动脚本:

/opt/myrouter/start.sh

设置为开机启动:

配置系统服务(如 systemd)以自动启动 Router,类似于 MySQL 服务器的设置。

推荐部署方式:

将 Router 部署在应用程序主机上,绑定到 localhost(bind_address=127.0.0.1)。

使用不同的端口(如 6446 用于读写,6447 用于只读)以区分流量类型。

6. MySQL Router 的优势

  1. 高性能:基于连接路由,不解析数据包,延迟低,吞吐量高。
  2. 透明性:应用程序无需修改代码,只需连接到 Router 的端口。
  3. 自动故障转移:与 InnoDB Cluster 集成,动态适应主从角色变化。
  4. 灵活性:支持多种路由策略和插件扩展,适应不同场景。
  5. 易于管理:通过引导功能自动配置,减少手动配置工作。

7. 注意事项

应用程序重试逻辑:

Router 不解析数据包,服务器故障时会返回连接错误,应用程序需实现重试逻辑。

示例:应用程序检测到连接错误后,重新连接到 Router 的同一端口。

权限要求:

引导时需要具有足够权限的 MySQL 用户(如对 mysql_innodb_cluster_metadata 表的访问权限)。

示例权限:

bash 复制代码
GRANT SELECT, EXECUTE ON mysql_innodb_cluster_metadata.* TO 'router_user'@'%';

GRANT INSERT, UPDATE, DELETE ON mysql_innodb_cluster_metadata.routers TO 'router_user'@'%';

端口冲突:

如果多个 Router 实例运行在同一主机上,需通过 base-port 配置避免端口冲突。

示例:base-port=3307。

性能影响:

Router 的性能开销极低,但建议部署在应用程序主机上以减少网络延迟。

版本兼容性:

确保 Router 版本与 MySQL 服务器版本兼容。例如,MySQL Router 8.4 不支持 MySQL 9.0。

日志和监控:

检查 Router 日志(默认在 logging_folder 指定目录)以排查问题。

示例日志:

bash 复制代码
2025-04-23 19:00:00 INFO [routing:read_write] started: listening on 0.0.0.0:6446; read-write

2025-04-23 19:00:00 INFO [metadata_cache] Connected with metadata server running on 127.0.0.1:3310

8. MySQL Router 与其他工具的对比

|---------------------|------------------------------------------------|-----------------|------------------|
| 特性 | MySQL Router MySQL 路由器 | ProxySQL 代理 SQL | HAProxy |
| 用途 | MySQL 集群路由、HA、负载均衡 | 高级查询路由、缓存、负载均衡 | 通用 TCP/HTTP 负载均衡 |
| 数据包解析 | 不解析,直接转发(连接路由) | 解析 SQL 查询 | 不解析,直接转发 |
| 性能 | 高(低开销) | 中(解析开销) | 高(通用负载均衡) |
| 与 InnoDB Cluster 集成 | 原生支持,自动配置 | 需要手动配置 | 需要手动配置 |
| 复杂性 | 简单,专注于 MySQL HA | 功能丰富,配置复杂 | 通用性强,配置中等 |
| 典型场景 | InnoDB Cluster、Group Replication InnoDB 集群、组复制 | 复杂查询路由、读写分离 | 通用负载均衡 |

选择建议:

  1. 如果使用 InnoDB Cluster 或 Group Replication,优先选择 MySQL Router,因其原生集成和简单配置。
  2. 如果需要 SQL 级别路由或查询缓存,考虑 ProxySQL。
  3. 如果需要通用负载均衡,HAProxy 是一个灵活的选择。

9. 总结

MySQL Router 是一个轻量、高效的中间件,专为 MySQL 高可用性和负载均衡设计。它通过透明路由和自动故障转移简化了应用程序与 MySQL 集群的交互,特别适合 InnoDB Cluster 和 Group Replication 环境。其插件化架构和低性能开销使其成为构建可扩展数据库架构的理想选择。

快速入门建议:

下载并安装 MySQL Router(推荐 8.4 版本)。

使用 --bootstrap 选项自动配置与 InnoDB Cluster 的连接。

配置读写和只读端口,启动 Router 并测试连接。

确保应用程序支持连接重试以处理故障转移。

信息来源于15个网页:

1、https://www.mysql.com/products/enterprise/router.html

2、https://dev.mysql.com/doc/mysql-router/8.0/en/

3、https://dev.mysql.com/doc/mysql-router/8.4/en/mysql-router-innodb-cluster.html

4、

https://medium.com/%40umairhassan27/mysql-router-with-mysql-ndb-cluster-a-quick-guide-ed81e1410ece

5、https://dev.mysql.com/blog-archive/setting-up-mysql-router/

6、GitHub - mysql/mysql-router: MySQL Router is lightweight middleware that provides transparent routing between your application and any backend MySQL Servers.

7、

https://www.quora.com/What-is-the-purpose-behind-bootstrapping-a-MySQL-router-for-use-with-an-InnoDB-cluster

8、

https://blogs.oracle.com/cloud-infrastructure/post/simple-guide-deploying-mysql-router-mysql-database-service-oci

9、

https://hub.docker.com/r/mysql/mysql-router

10、

https://dev.mysql.com/doc/mysql-router/8.4/en/

11、

MySQL Router 8.0

12、

https://dev.mysql.com/doc/mysql-router/8.0/en/mysql-router-general-using-developing.html

13、

https://dev.mysql.com/doc/mysql-router/8.0/en/mysql-router-innodb-cluster.html

14、

https://dev.mysql.com/doc/mysql-router/8.0/en/mysql-router-general.html

15、

https://dev.mysql.com/doc/mysql-shell-gui/en/mysql-shell-vscode-consoles-mysql-router.html

二.Mysql Router配置

MySQL Router 的配置是其核心功能实现的关键,通过配置文件(通常为 mysqlrouter.conf)定义路由策略、端口、目标服务器以及与 MySQL 集群的交互方式。本文将详细讲解 MySQL Router 的配置,包括配置文件结构、常用参数、配置示例以及配置时的注意事项,特别针对与 MySQL InnoDB Cluster 或 Group Replication 的集成。

1. MySQL Router 配置文件概述

MySQL Router 的配置文件采用 INI 格式,分为多个部分(Section),每个部分定义特定的功能模块或路由策略。配置文件通常位于安装目录或通过 --bootstrap 自动生成。

配置文件路径:

默认路径:<安装目录>/mysqlrouter.conf 或通过 --config 指定。

引导(Bootstrap)模式生成路径:<引导目录>/mysqlrouter.conf。

基本结构:

bash 复制代码
[DEFAULT]

logging_folder = /var/log/mysqlrouter

runtime_folder = /var/run/mysqlrouter



[logger]

level = INFO



[metadata_cache:cluster_name]

...



[routing:strategy_name]

...

主要部分:

  1. DEFAULT\]:全局设置,例如日志和运行时目录。

  2. metadata_cache\]:与 InnoDB Cluster 的元数据交互,用于动态获取集群拓扑。

2. 配置文件的常用部分和参数

以下是 MySQL Router 配置中最常用的部分及其关键参数,附带说明:

2.1 [DEFAULT] 部分

定义全局设置,适用于所有模块。

logging_folder:日志文件存储目录。

示例:logging_folder = /var/log/mysqlrouter

默认:空(日志输出到控制台)。

runtime_folder:运行时文件(如 PID 文件或套接字文件)存储目录。

示例:runtime_folder = /var/run/mysqlrouter

默认:当前工作目录。

plugin_folder:插件所在目录(通常无需手动设置)。

示例:plugin_folder = /usr/lib/mysqlrouter

config_folder:配置文件目录(通常无需设置)。

示例:config_folder = /etc/mysqlrouter

示例:

bash 复制代码
[DEFAULT]

logging_folder = /var/log/mysqlrouter

runtime_folder = /var/run/mysqlrouter

2.2 [logger] 部分

控制日志输出级别和行为。

level:日志级别。

可选值:DEBUG、INFO(默认)、WARNING、ERROR、FATAL。

示例:level = INFO

filename(可选):日志文件名,覆盖 [DEFAULT] 中的 logging_folder。

示例:filename = mysqlrouter.log

说明:

DEBUG 提供最详细的日志,适合排查问题。

INFO 是生产环境的推荐级别,记录关键操作。

2.3 [metadata_cache] 部分

用于与 InnoDB Cluster 或 Group Replication 集成,动态获取集群主从拓扑信息。

group_replication_id(可选):指定 Group Replication 的组 ID。

示例:group_replication_id = aaabbbccc-dddd-eeee-ffff-gggghhhhiiii

bootstrap_server_addresses:集群元数据服务器的地址列表(MySQL 实例)。

格式:mysql://host:port[,host:port,...]

示例:bootstrap_server_addresses = mysql://127.0.0.1:3310,mysql://127.0.0.1:3320

user:访问元数据的 MySQL 用户名。

示例:user = router_user

password:元数据用户的密码(建议加密存储)。

示例:password = router_pass

ttl:元数据缓存的生存时间(秒),控制拓扑刷新的频率。

示例:ttl = 0.5(每 0.5 秒刷新)。

默认:0.5 秒。

metadata_cluster:集群名称。

示例:metadata_cluster = mycluster

示例: metadata_cluster = mycluster

connect_timeout:连接元数据服务器的超时时间(秒)。

示例:connect_timeout = 30

read_timeout:读取元数据的超时时间(秒)。

示例:read_timeout = 30

示例:

bash 复制代码
[metadata_cache:mycluster]

bootstrap_server_addresses = mysql://127.0.0.1:3310,mysql://127.0.0.1:3320,mysql://127.0.0.1:3330

user = router_user

password = router_pass

ttl = 0.5

metadata_cluster = mycluster

说明:

bootstrap_server_addresses 应包含所有可能的元数据服务器地址(通常是集群中的所有节点)。

user 需要具有访问 mysql_innodb_cluster_metadata 表的权限。

ttl 值越小,拓扑更新越频繁,但会增加元数据查询开销。

2.4 [routing] 部分

定义具体的路由策略,例如读写分离或只读负载均衡。每个 [routing] 部分对应一个路由实例。

bind_address:Router 监听的地址。

示例:bind_address = 0.0.0.0(监听所有接口)。

默认:127.0.0.1。

bind_port:Router 监听的端口。

示例:bind_port = 6446

destinations:目标服务器或元数据缓存的引用。

静态路由:host:port[,host:port,...]

动态路由:metadata-cache://cluster_name/replicaset_name?role=ROLE

示例:destinations = metadata-cache://mycluster/default?role=PRIMARY

角色选项:

  1. PRIMARY:主节点(读写)。
  2. SECONDARY:从节点(只读)。
  3. PRIMARY_AND_SECONDARY:主从节点混合。

mode:路由模式。

read-write:路由到主节点,适合写操作。

read-only:路由到从节点,适合读操作。

示例:mode = read-write

protocol:连接协议。

可选值:classic(默认,MySQL 经典协议)、x(X Protocol)。

示例:protocol = classic

routing_strategy:路由策略。

first-available:选择第一个可用服务器。

next-available:故障时切换到下一个服务器。

round-robin:轮询分发连接。

round-robin-with-fallback:轮询为主,故障时回退。

示例:routing_strategy = round-robin

max_total_connections:Router 接受的最大连接数。

示例:max_total_connections = 512

默认:512。

connect_timeout:连接目标服务器的超时时间(秒)。

示例:connect_timeout = 1

client_ssl_mode:客户端到 Router 的 SSL 模式。

可选值:DISABLED、PREFERRED(默认)、REQUIRED。

示例:client_ssl_mode = PREFERRED

server_ssl_mode:Router 到服务器的 SSL 模式。

示例:server_ssl_mode = PREFERRED

示例:

bash 复制代码
[routing:read_write]
bind_address = 0.0.0.0
bind_port = 6446
destinations = metadata-cache://mycluster/default?role=PRIMARY
mode = read-write
routing_strategy = first-available
protocol = classic

[routing:read_only]
bind_address = 0.0.0.0
bind_port = 6447
destinations = metadata-cache://mycluster/default?role=SECONDARY
mode = read-only
routing_strategy = round-robin
protocol = classic

说明:

read_write 路由用于写操作,连接到主节点(role=PRIMARY)。

read_only 路由用于读操作,轮询分发到从节点(role=SECONDARY)。

端口 6446 和 6447 是常用约定,实际可自定义。

3. 配置示例

以下是一个完整的 MySQL Router 配置文件示例,适用于 InnoDB Cluster,提供读写分离和负载均衡。

bash 复制代码
[DEFAULT]

logging_folder = /var/log/mysqlrouter

runtime_folder = /var/run/mysqlrouter



[logger]

level = INFO



[metadata_cache:mycluster]

bootstrap_server_addresses = mysql://192.168.1.1:3306,mysql://192.168.1.2:3306,mysql://192.168.1.3:3306

user = router_user

password = router_pass

ttl = 0.5

metadata_cluster = mycluster

connect_timeout = 30

read_timeout = 30



[routing:read_write]

bind_address = 0.0.0.0

bind_port = 6446

destinations = metadata-cache://mycluster/default?role=PRIMARY

mode = read-write

routing_strategy = first-available

protocol = classic

max_total_connections = 512

connect_timeout = 1

client_ssl_mode = PREFERRED

server_ssl_mode = PREFERRED



[routing:read_only]

bind_address = 0.0.0.0

bind_port = 6447

destinations = metadata-cache://mycluster/default?role=SECONDARY

mode = read-only

routing_strategy = round-robin

protocol = classic

max_total_connections = 512

connect_timeout = 1

client_ssl_mode = PREFERRED

server_ssl_mode = PREFERRED

配置说明:

  1. Router 监听 6446(读写)和 6447(只读)端口。
  2. 元数据从三个 MySQL 节点(192.168.1.1:3306 等)获取,每 0.5 秒刷新。
  3. 写操作路由到主节点,读操作轮询分发到从节点。
  4. 使用经典协议,支持 SSL 连接。

4. 使用引导(Bootstrap)生成配置

MySQL Router 提供 --bootstrap 选项,自动从 InnoDB Cluster 获取元数据并生成配置文件,简化配置过程。

运行引导命令:

bash 复制代码
mysqlrouter --bootstrap mysql://[email protected]:3306 --directory /opt/myrouter --user snoopy

mysql://[email protected]:3306:集群中任一节点的地址。

--directory:生成配置文件的目录。

--user:运行 Router 的系统用户。

生成内容:

配置文件:/opt/myrouter/mysqlrouter.conf。

启动脚本:/opt/myrouter/start.sh。

停止脚本:/opt/myrouter/stop.sh。

日志目录:/opt/myrouter/log。

运行时目录:/opt/myrouter/run。

启动 Router:

/opt/myrouter/start.sh

引导的优势:

自动检测集群拓扑,生成正确的 metadata_cache 和 routing 配置。

自动设置默认端口(6446、6447 等)。

减少手动配置错误。

引导时的权限要求:

bash 复制代码
CREATE USER 'router_user'@'%' IDENTIFIED BY 'router_pass';

GRANT SELECT, EXECUTE ON mysql_innodb_cluster_metadata.* TO 'router_user'@'%';

GRANT INSERT, UPDATE, DELETE ON mysql_innodb_cluster_metadata.routers TO 'router_user'@'%';

GRANT SELECT ON performance_schema.replication_group_members TO 'router_user'@'%';

5. 配置时的注意事项

端口冲突:

确保 bind_port(如 6446、6447)未被占用。

如果多个 Router 实例运行在同一主机,使用 --base-port 指定端口范围:

mysqlrouter --bootstrap ... --base-port 7000

元数据用户权限:

确保 metadata_cache 部分的 user 有足够权限访问 mysql_innodb_cluster_metadata 表。

避免使用 root 用户,建议创建专用用户。

SSL 配置:

如果 MySQL 集群启用了 SSL,设置 client_ssl_mode 和 server_ssl_mode 为 REQUIRED。

提供 SSL 证书路径(如果需要):

client_ssl_cert = /path/to/client-cert.pem

client_ssl_key = /path/to/client-key.pem

性能优化:

调整 ttl 值:较小的 ttl(如 0.1 秒)适合快速故障转移,但增加元数据查询开销;较大的 ttl(如 5 秒)适合稳定集群。

增加 max_total_connections 以支持高并发。

日志监控:

检查日志文件(logging_folder 指定目录)以排查问题。

示例日志:

2025-04-23 19:00:00 INFO [routing:read_write] Started: listening on 0.0.0.0:6446

2025-04-23 19:00:00 INFO [metadata_cache] Connected to metadata server at 192.168.1.1:3306

应用程序重试逻辑:

Router 不处理 SQL 重试,应用程序需在连接失败时重试连接到同一端口。

示例:配置连接池(如 Java 的 HikariCP)设置重试间隔。

版本兼容性:

确保 Router 版本与 MySQL 服务器版本兼容。例如,MySQL Router 8.4 支持 MySQL 8.0 和 8.4,但不支持 9.0。

检查文档:https://dev.mysql.com/doc/mysql-router/8.4/en/

6. 验证配置

配置完成后,验证 Router 是否正常工作:

启动 Router:

mysqlrouter --config /path/to/mysqlrouter.conf

检查日志:

确认 Router 是否成功连接到元数据服务器并监听端口:

cat /var/log/mysqlrouter/mysqlrouter.log

测试连接:

使用 MySQL 客户端连接 Router 的端口:

mysql -u app_user -p -h 127.0.0.1 -P 6446

连接 6446 测试写操作(主节点)。

连接 6447 测试读操作(从节点)。

模拟故障转移:

停止主节点,观察 Router 是否将写连接路由到新的主节点。

示例:关闭主节点的 MySQL 服务:

systemctl stop mysql

7. 高级配置示例

以下是一些高级配置场景的示例:

7.1 静态路由(不使用元数据缓存)

如果不使用 InnoDB Cluster,可以手动指定目标服务器:

bash 复制代码
[routing:read_write]

bind_address = 0.0.0.0

bind_port = 6446

destinations = 192.168.1.1:3306

mode = read-write

routing_strategy = first-available



[routing:read_only]

bind_address = 0.0.0.0

bind_port = 6447

destinations = 192.168.1.2:3306,192.168.1.3:3306

mode = read-only

routing_strategy = round-robin

适用场景:简单的读写分离,不依赖集群元数据。

7.2 使用 Unix 域套接字

在本地部署时,使用 Unix 域套接字减少网络开销:

bash 复制代码
[routing:read_write]

bind_address = /var/run/mysqlrouter/rw.sock

destinations = metadata-cache://mycluster/default?role=PRIMARY

mode = read-write

routing_strategy = first-available

protocol = classic

连接方式:

bash 复制代码
mysql -u app_user -p --socket=/var/run/mysqlrouter/rw.sock

7.3 高并发配置

为高并发场景增加连接数并优化超时:

bash 复制代码
[routing:read_write]

bind_address = 0.0.0.0

bind_port = 6446

destinations = metadata-cache://mycluster/default?role=PRIMARY

mode = read-write

routing_strategy = first-available

max_total_connections = 2048

connect_timeout = 2

client_ssl_mode = REQUIRED

server_ssl_mode = REQUIRED

8. 总结

MySQL Router 的配置通过 INI 格式的配置文件实现,核心包括全局设置([DEFAULT])、日志([logger])、元数据缓存([metadata_cache])和路由策略([routing])。通过 --bootstrap 模式可以简化配置,自动生成与 InnoDB Cluster 集成的设置。配置时需注意端口冲突、权限设置、SSL 配置和应用程序重试逻辑。

推荐配置流程:

使用 --bootstrap 生成初始配置文件。

根据需求调整端口、路由策略和 SSL 设置。

验证日志和连接,确保路由正常。

配置系统服务以实现开机启动。

相关推荐
Gold Steps.21 天前
真实企业级K8S故障案例:ETCD集群断电恢复与数据保障实践
服务器·k8s·高可用·故障恢复
Z字小熊饼干爱吃保安1 个月前
Keepalive+LVS+Nginx+NFS高可用项目
运维·服务器·nginx·自动化·lvs·高可用
xxc_my1 个月前
LVS高可用负载均衡
服务器·负载均衡·lvs·高可用
极客先躯1 个月前
高级java每日一道面试题-2025年3月14日-微服务篇[Eureka篇]-Eureka如何保证高可用性?
java·微服务·eureka·集群·高可用
IT成长日记1 个月前
Redis哨兵模式(Sentinel)高可用方案介绍与配置实践
redis·sentinel·高可用·哨兵模式
竹竿袅袅1 个月前
Tomcat - Session 会话保持
运维·nginx·tomcat·负载均衡·高可用
极客先躯2 个月前
高级java每日一道面试题-2025年2月18日-数据库篇-MySQL 如何做到高可用方案?
java·数据库·mysql·架构·高可用
pitt19972 个月前
PostgreSQL10 物理流复制实战:构建高可用数据库架构!
数据库·数据库架构·高可用·物理复制·postgresql流复制
JAVA坚守者2 个月前
rabbitmq版本升级并部署高可用
rabbitmq·集群·高可用