目錄
一.MySQL Router介紹
1. 什么是 MySQL Router?
2. MySQL Router 的主要用途
3. MySQL Router 的工作原理
4. MySQL Router 的核心組件
5. MySQL Router 的部署和配置
6. MySQL Router 的優勢
7. 注意事項
8. MySQL Router 與其他工具的對比
9. 總結
二.Mysql Router配置
1. MySQL Router 配置文件概述
2. 配置文件的常用部分和參數
2.1 [DEFAULT] 部分
2.2 [logger] 部分
2.3 [metadata_cache] 部分
2.4 [routing] 部分
3. 配置示例
4. 使用引導(Bootstrap)生成配置
5. 配置時的注意事項
6. 驗證配置
7. 高級配置示例
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 不直接處理數據包內容,而是基于連接進行路由,因此性能開銷低,適合高吞吐量場景。
核心特性:
- 透明路由:應用程序連接到 MySQL Router 就像連接到單個 MySQL 實例,無需修改應用程序邏輯。
- 高可用性:自動處理主節點故障并將連接重定向到可用節點。
- 負載均衡:支持多種路由策略(如輪詢、首選可用),分發連接到不同服務器。
- 插件化架構:允許開發者通過插件擴展功能,滿足自定義需求。
- 與 InnoDB Cluster 集成:作為 InnoDB Cluster 的核心組件,自動從集群元數據獲取拓撲信息。
版本支持:
- MySQL Router 8.0 支持 MySQL Server 5.7 和 8.0。
- MySQL Router 8.4 支持 MySQL Server 8.0 和 8.4,但不支持更高版本(如 9.0)。
2. MySQL Router 的主要用途
MySQL Router 廣泛應用于以下場景:
高可用性(HA):
- 在主從復制或 InnoDB Cluster 中,MySQL Router 自動將連接路由到當前主節點(Primary)。
- 當主節點故障時,Router 檢測集群拓撲變化并將連接重定向到新的主節點,無需應用程序干預。
負載均衡:
- 對于讀操作,Router 可以將連接分發到從節點(Secondary),減輕主節點壓力。
- 支持輪詢(Round-Robin)或首選可用(First-Available)等策略。
簡化應用程序開發:
- 應用程序無需實現復雜的故障轉移邏輯,只需連接到 Router 的端口,Router 負責路由和故障處理。
- 對應用程序透明,連接方式與直接連接 MySQL 服務器一致。
集群管理:
- 在 InnoDB Cluster 中,Router 通過元數據緩存插件(Metadata Cache Plugin)與集群通信,動態獲取主從拓撲信息。
自定義擴展:
插件化架構允許開發者添加自定義路由邏輯或功能,例如特定的負載均衡策略。
示例場景:
應用程序連接到 Router 的端口(如 6446),Router 將寫請求路由到主節點,讀請求分發到從節點。
如果主節點故障,Router 自動將后續連接路由到新的主節點,應用程序只需重試連接。
3. MySQL Router 的工作原理
MySQL Router 作為應用程序和 MySQL 服務器之間的代理,負責管理連接路由。其工作流程如下:
客戶端連接:
- 應用程序(MySQL 客戶端或連接器)連接到 MySQL Router 監聽的端口(如 6446 或 6447)。
- Router 提供多個端口,通常分為讀寫(Read/Write)和只讀(Read-Only)端口。
路由決策:
- Router 根據配置的路由策略(如輪詢、首選可用)和集群元數據,選擇合適的后端 MySQL 服務器。
- 對于 InnoDB Cluster,Router 通過元數據緩存插件動態獲取主從拓撲。
連接轉發:
- Router 將客戶端的 MySQL 數據包直接轉發到目標服務器,不解析或修改數據包內容(連接路由方式),確保高性能。
- 如果目標服務器不可用,Router 返回連接錯誤,應用程序需重試連接,Router 會選擇其他可用服務器。
故障處理:
- 如果連接的 MySQL 服務器故障,Router 斷開客戶端連接,客戶端重試后 Router 選擇新的可用服務器。
- 在 InnoDB Cluster 中,Router 定期刷新元數據,檢測主從角色變化。
示例配置(簡化):
[routing:read_write]bind_address = 0.0.0.0bind_port = 6446destinations = metadata-cache://mycluster/default?role=PRIMARYmode = read-write[routing:read_only]bind_address = 0.0.0.0bind_port = 6447destinations = metadata-cache://mycluster/default?role=SECONDARYmode = read-only
- 6446 端口處理寫請求,路由到主節點。
- 6447 端口處理讀請求,路由到從節點(輪詢分發)。
4. MySQL Router 的核心組件
MySQL Router 的功能通過插件實現,主要包括以下核心插件:
Connection Routing Plugin:
連接路由插件 :
- 負責基于連接的路由,直接轉發 MySQL 數據包,提供最大吞吐量。
- 支持多種路由策略:
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):
[DEFAULT]logging_folder = /var/log/mysqlrouterruntime_folder = /var/run/mysqlrouter[logger]level = INFO[metadata_cache:mycluster]router_address = 127.0.0.1bootstrap_server_addresses = mysql://127.0.0.1:3310user = router_userpassword = router_pass[routing:read_write]bind_address = 0.0.0.0bind_port = 6446destinations = metadata-cache://mycluster/default?role=PRIMARYmode = read-write[routing:read_only]bind_address = 0.0.0.0bind_port = 6447destinations = metadata-cache://mycluster/default?role=SECONDARYmode = 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 的優勢
- 高性能:基于連接路由,不解析數據包,延遲低,吞吐量高。
- 透明性:應用程序無需修改代碼,只需連接到 Router 的端口。
- 自動故障轉移:與 InnoDB Cluster 集成,動態適應主從角色變化。
- 靈活性:支持多種路由策略和插件擴展,適應不同場景。
- 易于管理:通過引導功能自動配置,減少手動配置工作。
7. 注意事項
應用程序重試邏輯:
Router 不解析數據包,服務器故障時會返回連接錯誤,應用程序需實現重試邏輯。
示例:應用程序檢測到連接錯誤后,重新連接到 Router 的同一端口。
權限要求:
引導時需要具有足夠權限的 MySQL 用戶(如對 mysql_innodb_cluster_metadata 表的訪問權限)。
示例權限:
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 指定目錄)以排查問題。
示例日志:
2025-04-23 19:00:00 INFO [routing:read_write] started: listening on 0.0.0.0:6446; read-write2025-04-23 19:00:00 INFO [metadata_cache] Connected with metadata server running on 127.0.0.1:3310
8. MySQL Router 與其他工具的對比
特性 | MySQL Router | ProxySQL | HAProxy |
用途 | MySQL 集群路由、HA、負載均衡 | 高級查詢路由、緩存、負載均衡 | 通用 TCP/HTTP 負載均衡 |
數據包解析 | 不解析,直接轉發(連接路由) | 解析 SQL 查詢 | 不解析,直接轉發 |
性能 | 高(低開銷) | 中(解析開銷) | 高(通用負載均衡) |
與 InnoDB Cluster 集成 | 原生支持,自動配置 | 需要手動配置 | 需要手動配置 |
復雜性 | 簡單,專注于 MySQL HA | 功能豐富,配置復雜 | 通用性強,配置中等 |
典型場景 | InnoDB Cluster、Group Replication | 復雜查詢路由、讀寫分離 | 通用負載均衡 |
選擇建議:
- 如果使用 InnoDB Cluster 或 Group Replication,優先選擇 MySQL Router,因其原生集成和簡單配置。
- 如果需要 SQL 級別路由或查詢緩存,考慮 ProxySQL。
- 如果需要通用負載均衡,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。
基本結構:
[DEFAULT]logging_folder = /var/log/mysqlrouterruntime_folder = /var/run/mysqlrouter[logger]level = INFO[metadata_cache:cluster_name]...[routing:strategy_name]...
主要部分:
- [DEFAULT]:全局設置,例如日志和運行時目錄。
- [logger]:日志級別和輸出設置。
- [metadata_cache]:與 InnoDB Cluster 的元數據交互,用于動態獲取集群拓撲。
- [routing]:定義具體的路由策略,例如讀寫分離或負載均衡。
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
示例:
[DEFAULT]logging_folder = /var/log/mysqlrouterruntime_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
示例:
[metadata_cache:mycluster]bootstrap_server_addresses = mysql://127.0.0.1:3310,mysql://127.0.0.1:3320,mysql://127.0.0.1:3330user = router_userpassword = router_passttl = 0.5metadata_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
角色選項:
- PRIMARY:主節點(讀寫)。
- SECONDARY:從節點(只讀)。
- 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
示例:
[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,提供讀寫分離和負載均衡。
[DEFAULT]logging_folder = /var/log/mysqlrouterruntime_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:3306user = router_userpassword = router_passttl = 0.5metadata_cluster = myclusterconnect_timeout = 30read_timeout = 30[routing:read_write]bind_address = 0.0.0.0bind_port = 6446destinations = metadata-cache://mycluster/default?role=PRIMARYmode = read-writerouting_strategy = first-availableprotocol = classicmax_total_connections = 512connect_timeout = 1client_ssl_mode = PREFERREDserver_ssl_mode = PREFERRED[routing:read_only]bind_address = 0.0.0.0bind_port = 6447destinations = metadata-cache://mycluster/default?role=SECONDARYmode = read-onlyrouting_strategy = round-robinprotocol = classicmax_total_connections = 512connect_timeout = 1client_ssl_mode = PREFERREDserver_ssl_mode = PREFERRED
配置說明:
- Router 監聽 6446(讀寫)和 6447(只讀)端口。
- 元數據從三個 MySQL 節點(192.168.1.1:3306 等)獲取,每 0.5 秒刷新。
- 寫操作路由到主節點,讀操作輪詢分發到從節點。
- 使用經典協議,支持 SSL 連接。
4. 使用引導(Bootstrap)生成配置
MySQL Router 提供 --bootstrap 選項,自動從 InnoDB Cluster 獲取元數據并生成配置文件,簡化配置過程。
運行引導命令:
mysqlrouter --bootstrap mysql://router_user@192.168.1.1:3306 --directory /opt/myrouter --user snoopy
mysql://router_user@192.168.1.1: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 等)。
減少手動配置錯誤。
引導時的權限要求:
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,可以手動指定目標服務器:
[routing:read_write]bind_address = 0.0.0.0bind_port = 6446destinations = 192.168.1.1:3306mode = read-writerouting_strategy = first-available[routing:read_only]bind_address = 0.0.0.0bind_port = 6447destinations = 192.168.1.2:3306,192.168.1.3:3306mode = read-onlyrouting_strategy = round-robin
適用場景:簡單的讀寫分離,不依賴集群元數據。
7.2 使用 Unix 域套接字
在本地部署時,使用 Unix 域套接字減少網絡開銷:
[routing:read_write]bind_address = /var/run/mysqlrouter/rw.sockdestinations = metadata-cache://mycluster/default?role=PRIMARYmode = read-writerouting_strategy = first-availableprotocol = classic
連接方式:
mysql -u app_user -p --socket=/var/run/mysqlrouter/rw.sock
7.3 高并發配置
為高并發場景增加連接數并優化超時:
[routing:read_write]bind_address = 0.0.0.0bind_port = 6446destinations = metadata-cache://mycluster/default?role=PRIMARYmode = read-writerouting_strategy = first-availablemax_total_connections = 2048connect_timeout = 2client_ssl_mode = REQUIREDserver_ssl_mode = REQUIRED
8. 總結
MySQL Router 的配置通過 INI 格式的配置文件實現,核心包括全局設置([DEFAULT])、日志([logger])、元數據緩存([metadata_cache])和路由策略([routing])。通過 --bootstrap 模式可以簡化配置,自動生成與 InnoDB Cluster 集成的設置。配置時需注意端口沖突、權限設置、SSL 配置和應用程序重試邏輯。
推薦配置流程:
使用 --bootstrap 生成初始配置文件。
根據需求調整端口、路由策略和 SSL 設置。
驗證日志和連接,確保路由正常。
配置系統服務以實現開機啟動。