MySQL Router 8 詳解

目錄

一、功能介紹

1. 透明路由

2. 元數據緩存

3. 簡單重定向

4. MySQL Router 8.0的新特性

二、安裝與啓動

1. 安裝

2. 啓動

三、配置

1. 配置文件位置

2. 配置文件語法

3. 配置文件示例


        MySQL Router最早是作爲MySQL-Proxy的替代方案出現的。作爲一個輕量級中間件,MySQL Router可在應用程序和後端MySQL服務器之間提供透明路由和負載均衡,從而有效提高MySQL數據庫服務的高可用性與可伸縮行。

        MySQL Router 2.0是其初始版本,適用於MySQL Fabric用戶,但已被棄用,不再支持。MySQL Router 2.1爲支持MySQL InnoDB Cluster而引入,MySQL Router 8.0則是MySQL Router 2.1上的擴展,版本號與MySQL服務器版本號保持一致。即Router 2.1.5作爲Router 8.0.3(以及MySQL Server 8.0.3)發佈,2.1.x分支被8.0.x取代。這兩個分支完全兼容。當前最新版本爲8.0.17,MySQL強烈建議使用Router 8與MySQL Server 8和5.7一起使用。

一、功能介紹

1. 透明路由

        MySQL Router通過智能地將客戶端連接路由到MySQL服務器來簡化應用程序開發。MySQL使用組複製在多個服務器之間複製數據,當服務器發生故障時執行自動故障轉移,基於paxos協議在剩餘實例中選舉一個新的主庫。這裏存在一個問題,如果應用程序直連主庫,當發生主庫切換時可用的數據庫IP地址發生變化,客戶端應用程序必須自行修改它的連接配置。這種方案極不現實,因爲需要應用程序瞭解組複製的拓撲結構並知道哪個MySQL實例是主庫,對於應用程序顯然是強人所難,這些處理邏輯本應對應用透明。

        而這正是MySQL Router的用武之地。當與InnoDB Cluster一起使用時,MySQL Router充當代理,嚮應用程序隱藏網絡上的多個MySQL實例,並將數據請求映射到其中一個集羣實例。只要有足夠的在線副本並且組件之間的通信完好無損,客戶端就能夠連接其中一個實例,保持對外服務的連續性。應用程序要做的只是連接到Router,而不是直連MySQL數據庫實例,其它的交給Router處理即可。

        MySQL Router的推薦部署模型是與InnoDB Cluster集成,其中Router與應用程序最好位於同一主機上。

2. 元數據緩存

        MySQL Router處於應用程序和MySQL服務器之間。當應用程序連接到Router時,Router從其候選池中選擇合適的MySQL服務器連接,此後Router轉發應用程序和MySQL之間的所有往返網絡流量。

        MySQL Router保留在線MySQL服務器的緩存列表,或配置的InnoDB Cluster的拓撲和狀態。Router啓動時,列表從Router的配置文件加載。當使用--bootstrap選項引導Router時,此列表由InnoDB羣集服務器生成。爲了更新緩存,Router元數據緩存組件與包含元數據的InnoDB Cluster服務器之一保持連接,通過從該MySQL實例的performance_schema庫表查詢元數據和實時狀態信息來實現。每當修改InnoDB集羣時都會更改集羣元數據,並且只要檢測到集羣狀態更改,就會通過MySQL服務器的Group Replication插件實時更新performance_schema庫表。

        當Router檢測到連接的MySQL服務器關閉時,它會嘗試連接到不同的MySQL服務器以從新的服務器獲取元數據和InnoDB Cluster狀態。關閉的MySQL服務器的應用程序連接會自動關閉。應用程序必須重新連接到Router,這要求應用程序實現重連機制。Router將它們重定向到在線MySQL服務器。

3. 簡單重定向

        Router將MySQL連接重定向到可用的MySQL服務器,這意味着數據包是在未經檢查的情況下整體路由的。如果連接失敗,應用程序須要重試連接,MySQL Router在嘗試連接失敗後選擇新的MySQL服務器。這被稱爲簡單重定向連接路由,因爲它需要應用程序重試連接。也就是說,如果從MySQL Router到MySQL服務器的連接中斷,則應用程序會遇到連接失敗,但新的連接嘗試會觸發Router查找並連接到另一臺MySQL服務器。路由連接的服務器和路由策略在配置文件中定義。

        使用MySQL Router不需要特定的庫或接口,與不使用Router相比,應用程序所感知的唯一區別是如何建立與MySQL服務器的連接。因爲MySQL Router在嘗試連接時只是單純重定向,並不讀取數據包或執行分析,所以應用程序需要捕獲連接錯誤並重試連接到Router。

        使用MySQL Router的工作流程如下:

  1. MySQL客戶端連接到MySQL Router。
  2. Router檢查可用的MySQL服務器。
  3. Router打開一個適用MySQL服務器的連接。
  4. Router在應用程序和MySQL服務器之間來回轉發數據包
  5. 如果連接的MySQL服務器出現故障, Router將斷開連接。當應用程序重試連接到Router時,Router選擇另一個可用MySQL服務器。

        部署MySQL Router時建議但不強制遵循兩點:

  • 在與應用程序相同的主機上安裝並運行MySQL Router。
  • 使用配置文件中的bind_port = 127.0.0.1:<port>將 Router綁定到localhost,或者禁用TCP連接(--conf-skip-tcp)並將其限制爲僅使用Unix套接字連接(--conf-use-sockets)。

        建議主要出於性能考慮。每當在網絡中引入通信組件時,都會產生一定的開銷,並且會受到工作負載的嚴重影響。幸運的是,MySQL Router的性能影響非常小。官方文檔顯示,當前版本的簡單重定向連接路由,其速度與直連數據庫相比僅慢約1%。

4. MySQL Router 8.0的新特性

        較之以前2.x版本,MySQL Router 8.0新增瞭如下主要功能:

  • 添加了可選的routing_strategy配置選項。可用值爲first-available、next-available、round-robin和round-robin-with-fallback。以前版本中,這些策略對應mode選項中的調度模式,其中read-write對應first-available,而read-only對應round-robin。它們保留了這些模式的先前行爲。
  • 添加了--ssl-key和--ssl-cert命令行選項,指定客戶端證書和私鑰以方便客戶端身份驗證。用於使用REQUIRE X509創建root帳戶時。
  • 添加了connect_timeout和read_timeout元數據配置文件選項。它們在[DEFAULT]命名空間下定義,並影響元數據服務器連接等內部操作。
  • Bootstrap接受InnoDB Cluster的任何成員,並自動查找並重新連接到可寫服務器。以前只接受主庫。
  • Bootstrap接受--config選項並讀取[logger]級別選項的定義。
  • 最大併發客戶端連接數從500增加到5000。
  • 添加了一個新的mysqlrouter_plugin_info實用程序來幫助調試MySQL Router插件。

二、安裝與啓動

1. 安裝

        MySQL Router的安裝過程依賴於所使用的操作系統和安裝介質,二進制包的安裝通常比較簡單,而源碼包則需要先編譯再安裝。例如在Linux上的安裝最新的MySQL Router二進制包,只需要用mysql用戶執行一條解壓命令就完成了:

tar -Jxvf mysql-router-8.0.17-linux-glibc2.12-x86_64.tar.xz

        解壓後生成如下目錄:

[mysql@hdp1~]$ll mysql-router-8.0.17-linux-glibc2.12-x86_64
total 108
drwxrwxr-x 2 mysql mysql    126 Sep  2 15:26 bin
drwxrwxr-x 3 mysql mysql   4096 Sep  2 15:26 lib
-rw-r--r-- 1 mysql mysql 101805 Jun 25 18:23 LICENSE.router
drwxrwxr-x 3 mysql mysql     17 Sep  2 15:22 man
-rw-r--r-- 1 mysql mysql    700 Jun 25 18:23 README.router
drwxrwxr-x 3 mysql mysql     16 Sep  2 15:22 share

bin目錄下存放的是可執行文件,可將該目錄添加到PATH環境變量中方便執行,例如:

export PATH=.:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/home/mysql/mysql-5.6.14/bin:/home/mysql/mysql-router-8.0.17-linux-glibc2.12-x86_64/bin;

然後就可以執行mysqlrouter命令,如檢查版本或顯示幫助:

[mysql@hdp1~]$mysqlrouter --version
MySQL Router  Ver 8.0.17 for linux-glibc2.12 on x86_64 (MySQL Community - GPL)
[mysql@hdp1~]$mysqlrouter --help
[mysql@hdp1~]$mysqlrouter --help
MySQL Router  Ver 8.0.17 for linux-glibc2.12 on x86_64 (MySQL Community - GPL)
Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Configuration read from the following files in the given order (enclosed
in parentheses means not available for reading):
  (/home/mysql/mysql-router-8.0.17-linux-glibc2.12-x86_64/bin/.././mysqlrouter.conf)
  (/home/mysql/mysql-router-8.0.17-linux-glibc2.12-x86_64/bin/.././mysqlrouter.ini)
  (/home/mysql/.mysqlrouter.conf)
  (/home/mysql/.mysqlrouter.ini)

...

        各種安裝包的下載地址爲https://dev.mysql.com/downloads/router/。其它情況的安裝可參考https://dev.mysql.com/doc/mysql-router/8.0/en/mysql-router-installation.html

2. 啓動

        MySQL Router啓動時需要讀取其配置文件,獲取基本連接路由信息。Router插件執行基於連接的路由,這意味着它將數據包轉發到服務器而不檢查它們。這是一種提供高吞吐量的簡單方法。一個基本的連接路由設置如下所示:

[logger]
level = INFO

[routing:secondary]
bind_address = localhost
bind_port = 7001
destinations = 172.16.1.125:3306,172.16.1.126:3306,172.16.1.127:3306
routing_strategy = round-robin

[routing:primary]
bind_address = localhost
bind_port = 7002
destinations = 172.16.1.125:3306,172.16.1.126:3306,172.16.1.127:3306
routing_strategy = first-available

        這裏設置了兩個路由策略:通過本地7001端口,循環連接到172.16.1.125:3306、172.16.1.126:3306、172.16.1.127:3306三個MySQL實例,由round-robin路由策略所定義;通過本地7002端口,對同樣的三個MySQL實例設置首個可用策略。首個可用策略使用目標列表中的第一個可用服務器,即當172.16.1.125:3306可用時,所有7002端口的連接都轉發到它,否則轉發到172.16.1.126:3306,以此類推。Router不會檢查數據包,也不會根據分配的策略或模式限制連接,因此應用程序可以據此確定將讀寫請求發送到不同的服務器。本例中可將讀請求發送到本地7001端口,將讀負載均衡到三臺服務器。同時將寫請求發送到7002,這樣只寫一個服務器,從而實現的讀寫分離。

        將以上配置保存到/home/mysql/.mysqlrouter.conf文件,並後臺啓動MySQL Router:

[mysql@hdp1~]$mysqlrouter -c /home/mysql/.mysqlrouter.conf &

查看進程確認MySQL Router已經啓動:

[mysql@hdp1~]$ps -ef | grep router
mysql    327410 326543  0 16:31 pts/0    00:00:00 mysqlrouter -c /home/mysql/.mysqlrouter.conf
...

缺省的日誌文件中顯示如下信息:

[mysql@hdp1~]$more ~/mysql-router-8.0.17-linux-glibc2.12-x86_64/mysqlrouter.log 
2019-09-02 16:42:36 routing INFO [7f151540b700] [routing:primary] started: listening on localhost:7002, routing strategy = first-available
2019-09-02 16:42:36 routing INFO [7f1514c0a700] [routing:secondary] started: listening on localhost:7001, routing strategy = round-robin
[mysql@hdp1~]$

查看監聽狀態:

[mysql@hdp1~]$netstat -tnlp
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -                   
tcp        0      0 127.0.0.1:199           0.0.0.0:*               LISTEN      -                   
tcp6       0      0 :::80                   :::*                    LISTEN      -                   
tcp6       0      0 :::22                   :::*                    LISTEN      -                   
tcp6       0      0 ::1:7001                :::*                    LISTEN      329852/mysqlrouter  
tcp6       0      0 ::1:7002                :::*                    LISTEN      329852/mysqlrouter  
[mysql@hdp1~]$

        現在,MySQL Router正在偵聽端口7001和7002,並將請求發送到適當的MySQL實例:

[mysql@hdp1~]$mysql -uwxy -p123456 -P7001 --protocol=TCP -e"select @@hostname"
Warning: Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| hdp2       |
+------------+
[mysql@hdp1~]$mysql -uwxy -p123456 -P7001 --protocol=TCP -e"select @@hostname"
Warning: Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| hdp3       |
+------------+
[mysql@hdp1~]$mysql -uwxy -p123456 -P7001 --protocol=TCP -e"select @@hostname"
Warning: Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| hdp4       |
+------------+
[mysql@hdp1~]$mysql -uwxy -p123456 -P7001 --protocol=TCP -e"select @@hostname"
Warning: Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| hdp2       |
+------------+
[mysql@hdp1~]$mysql -uwxy -p123456 -P7002 --protocol=TCP -e"select @@hostname"
Warning: Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| hdp2       |
+------------+
[mysql@hdp1~]$mysql -uwxy -p123456 -P7002 --protocol=TCP -e"select @@hostname"
Warning: Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| hdp2       |
+------------+
[mysql@hdp1~]$mysql -uwxy -p123456 -P7002 --protocol=TCP -e"select @@hostname"
Warning: Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| hdp2       |
+------------+
[mysql@hdp1~]$

        由上可見,發送到本地7001端口的請求,被循環轉發到三個服務器,而發送到本地7002端口的請求,全部被轉發到172.16.1.125:3306。

        routing_strategy是MySQL Router的核心選項,從8.0.4版本開始引入,當前有效值爲first-available、next-available、round-robin、round-robin-with-fallback。顧名思義,該選項實際控制路由策略,即客戶端請求最終連接到哪個MySQL服務器實例。相對於以前版本mode的選項,routing_strategy選項更爲靈活,並且不能同時設置routing_strategy和mode,靜態路由的設置只能選擇其中之一。對於InnoDB Cluster而言,該設置時可選的,缺省使用round-robin策略。

  • round-robin:每個新連接都以循環方式連接到下一個可用的服務器,以實現負載平衡。
  • round-robin-with-fallback:用於InnoDB Cluster。每個新的連接都以循環方式連接到下一個可用的SECONDARY服務器。如果SECONDARY服務器不可用,則以循環方式使用PRIMARY服務器。
  • first-available:新連接從目標列表路由到第一個可用服務器。如果失敗,則使用下一個可用的服務器,如此循環,直到所有服務器都不可用爲止。
  • next-available:與first-available類似,新連接從目標列表路由到第一個可用服務器。與first-available不同的是,如果一個服務器被標記爲不可訪問,那麼它將被丟棄,並且永遠不會再次用作目標。重啓Router後,所有被丟棄服務器將再次可選。此策略向後兼容MySQL Router 2.x中mode爲read-write的行爲。

        現在7002端口的路由策略爲first-available,下面依次停止172.16.1.125:3306、172.16.1.126:3306、172.16.1.127:3306,觀察7002端口的訪問情況。

# 停止 172.16.1.125:3306
[mysql@hdp2~]$mysqladmin -uwxy -p123456 -h172.16.1.125 -P3306 shutdown
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
[mysql@hdp2~]$

# 訪問7002
[mysql@hdp1~]$mysql -uwxy -p123456 -P7002 --protocol=TCP -e"select @@hostname"
Warning: Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| hdp3       |
+------------+

# 停止 172.16.1.126:3306
[mysql@hdp3~]$mysqladmin -uwxy -p123456 -h172.16.1.126 -P3306 shutdown
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
[mysql@hdp3~]$

# 訪問7002
[mysql@hdp1~]$mysql -uwxy -p123456 -P7002 --protocol=TCP -e"select @@hostname"
Warning: Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| hdp4       |
+------------+
[mysql@hdp1~]$

# 停止 172.16.1.127:3306
[mysql@hdp4~]$mysqladmin -uwxy -p123456 -h172.16.1.127 -P3306 shutdown
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
[mysql@hdp4~]$

# 啓動172.16.1.125:3306
[mysql@hdp2~]$mysqld_safe --defaults-file=/etc/my.cnf &

# 訪問7002
[mysql@hdp1~]$mysql -uwxy -p123456 -P7002 --protocol=TCP -e"select @@hostname"
Warning: Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| hdp2       |
+------------+
[mysql@hdp1~]$

        first-available總是循環查找目標列表中第一個可用服務器並連接它。將7002的策略改爲next-available,把上面的步驟再做一遍,會看到最後的查詢失敗。即使此時172.16.1.125:3306可用也不會再次連接它,除非重啓Router。

# 最後的查詢連接失敗
[mysql@hdp1~]$mysql -uwxy -p123456 -P7002 --protocol=TCP -e"select @@hostname"
Warning: Using a password on the command line interface can be insecure.
ERROR 2003 (HY000): Can't connect to remote MySQL server for client connected to 'localhost:7002'

# 重啓路由
[mysql@hdp1~]$kill `ps -ef | grep router | grep -v grep | awk '{print $2}'`
[mysql@hdp1~]$mysqlrouter -c ~/.mysqlrouter.conf &

# 再次查詢
[mysql@hdp1~]$mysql -uwxy -p123456 -P7002 --protocol=TCP -e"select @@hostname"
Warning: Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| hdp2       |
+------------+
[mysql@hdp1~]$

        可以在網絡上的單臺或多臺主機上運行多個MySQL路由器實例,而無需將MySQL Router隔離到單個機器上。這是因爲MySQL Router對任何特定服務器或主機都不具有親和性。要停止MySQL Router,只需用kill或killall命令直接殺掉相關進程。MySQL Router只起到一個轉發流量的作用,它實在太“輕”了,以至都沒有一個單獨的停止命令。

三、配置

        MySQL Router啓動時可以從配置文件、擴展配置文件、命令行選項三個地方獲取配置信息。本節說明MySQL Router配置文件的位置、配置文件語法和配置選項。

1. 配置文件位置

(1)缺省配置文件
        MySQL Router在啓動時掃描缺省配置文件,並可選擇在運行時從命令行加載用戶定義的配置文件。默認情況下,MySQL Router掃描依賴於操作系統的特定位置以查找配置文件。執行mysqlrouter --help可以查看系統上的缺省配置文件位置:

[mysql@hdp1~]$mysqlrouter --help | more
MySQL Router  Ver 8.0.17 for linux-glibc2.12 on x86_64 (MySQL Community - GPL)
Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Configuration read from the following files in the given order (enclosed
in parentheses means not available for reading):
  (/home/mysql/mysql-router-8.0.17-linux-glibc2.12-x86_64/bin/.././mysqlrouter.conf)
  (/home/mysql/mysql-router-8.0.17-linux-glibc2.12-x86_64/bin/.././mysqlrouter.ini)
  /home/mysql/.mysqlrouter.conf
  (/home/mysql/.mysqlrouter.ini)
Plugins Path:
  /home/mysql/mysql-router-8.0.17-linux-glibc2.12-x86_64/lib/mysqlrouter

Default Log Directory:
  /home/mysql/mysql-router-8.0.17-linux-glibc2.12-x86_64

Default Persistent Data Directory:
  /home/mysql/mysql-router-8.0.17-linux-glibc2.12-x86_64/bin/../var/lib/mysqlrouter

Default Runtime State Directory:
  /home/mysql/mysql-router-8.0.17-linux-glibc2.12-x86_64/bin/../run

...

        從幫助信息的開始部分可以看到MySQL Router查找的缺省配置文件和查找順序。括號中的文件不可用,這裏只有/home/mysql/.mysqlrouter.conf一個可用缺省配置文件。注意,如果使用-c或--config選項傳入用戶定義的配置文件,則不會加載缺省配置文件。

(2)用戶定義和擴展配置文件
        用戶定義配置文件由-c或--config命令行選項指定,擴展配置文件由-a或--extra-config命令行選項指定。從缺省配置文件或使用--config選項指定的文件讀取配置後,讀取擴展配置文件:

shell> mysqlrouter --config /custom/path/to/router.conf --extra-config /another/config.conf

可以傳入多個擴展配置選項,並按照輸入的順序加載文件:

shell> mysqlrouter --config b.conf --extra-config a.conf --extra-config c.conf

在上面的示例中,首先加載b.conf,然後按順序加載a.conf和c.conf。此外由於使用了--config,不會加載缺省配置文件。每個加載的配置文件都會覆蓋先前讀取的配置文件中的設置。

2. 配置文件語法

        MySQL Router配置文件格式類似於MySQL服務器的配置文件,符合傳統INI文件格式,其中包含多個段,每個段中包含多個選項。選項中的目錄支持支持正斜槓和反斜槓,反斜槓無條件複製而不是轉義字符。配置文件可以包含註釋行,註釋行以井號(#)或分號(;)開頭,並繼續到行尾。注意只支持整行註釋,不支持行中、行尾註釋。(1)段
每個配置文件都包含一個配置段列表,其中每個段包含一系列配置選項,每個配置選項都有名稱和值,例如:

[section name]
option = value
option = value
option = value

[section name:optional section key]
option = value
option = value
option = value

        中括號中的是段名和可選的段鍵,段名與段鍵之間用冒號(:)分隔。段名和段鍵的組合對於配置是唯一的,中括號內不能有首尾空格。段名與段鍵由一個或多個字母、數字或下劃線(_)的序列組成,不允許使用其它字符。

        段類似於命名空間。例如user選項,其含義取決於其關聯的段。[DEFAULT]段中的user指的是運行MySQL Router的系統用戶,該用戶也受--user命令行選項控制。[metadata_cache]段中定義的user,指的是訪問MySQL服務器元數據的MySQL用戶。

        下面列舉幾個主要的段:

  • [DEFAULT]:DEFAULT是一個特殊的段,用於選項缺省值,在該段中查找其它段中沒出現的選項,通常配置擴展配置文件的目錄、日誌的目錄、MySQL Router運行時的目錄(如pid文件)等。DEFAULT段不接受段鍵。
  • [logger]:logger段只有一個選項,設置日誌的記錄級別。
  • [routing:NAME]:該段是MySQL Router主要配置部分,設置不同的路由實例,其中NAME是自定義的段鍵名。

(2)選項

        在段名之後,可以有一個零或多個選項行,其中每個選項行的形式如下:

name = value

        處理之前將刪除選項名稱或選項值上的任何首尾空格。選項名稱不區分大小寫。選項值支持在大括號中引用選項名稱,作爲變量插入值。變量引用值是在檢索選項值時完成的,而不是在讀取配置文件時。如果變量未定義,則不進行替換,並按字面讀取選項值。考慮下面的示例配置文件:

[DEFAULT]
prefix = /usr/

[sample]
bin = {prefix}bin/{name}
lib = {prefix}lib/{name}
name = magic
directory = /data/{mysqlrouterdata}

這裏bin的值是“/usr/bin/magic”,lib的值是“/usr/lib/magic”。由於未定義名爲“{mysqlrouterdata}”的變量,directory的值是“/data/{mysqlrouterdata}”。

        MySQL Router定義了配置文件可用的如下預定義變量。變量使用大括號,例如{program}作爲Router可執行程序預定義變量。

  • program:程序的名稱,通常是mysqlrouter。
  • origin:二進制文件所在目錄。
  • logging_folder:日誌文件所在目錄。
  • plugin_folder:插件文件所在目錄。
  • runtime_folder:運行時數據文件所在目錄。
  • config_folder:配置文件所在目錄。

3. 配置文件示例

        啓動時,MySQL Router會讀取配置文件列表,這些配置文件一起構成Router的配置。至少需要一個配置文件,否則啓動Router時會報 Error: No valid configuration file available 錯誤。下面是一個名爲mycluster的MySQL InnoDB cluster的基本連接路由示例,讀寫流量發送到6446端口,只讀訪問使用6447端口。

[DEFAULT]
logging_folder=/opt/routers/myrouter/log
runtime_folder=/opt/routers/myrouter/run
data_folder=/opt/routers/myrouter/data
connect_timeout=30
read_timeout=30

[logger]
level = INFO

[metadata_cache:mycluster]
router_id=5
bootstrap_server_addresses=mysql://localhost:3310,mysql://localhost:3320,mysql://localhost:3330
user=mysql_router
metadata_cluster=mycluster
ttl=5

[routing:mycluster_default_rw]
bind_address=0.0.0.0
bind_port=6446
destinations=metadata-cache://mycluster/default?role=PRIMARY
routing_strategy=round-robin

[routing:mycluster_default_ro]
bind_address=0.0.0.0
bind_port=6447
destinations=metadata-cache://mycluster/default?role=SECONDARY
routing_strategy=round-robin

        該配置中定義了五個段:

  • [DEFAULT]中定義了數據文件目錄、日誌文件目錄、運行時文件目錄的位置,以及連接和讀取MySQL元數據服務器的超時時間爲30秒。
  • [logger]中定義日誌級別爲info,可選值有info、debug、warning、error、fatal,不區分大小寫。
  • [metadata_cache:mycluster]中定義MySQL服務器元數據訪問信息:router_id是整型的路由ID。bootstrap_server_addresses是逗號分隔的InnoDB cluster中的MySQL實例。user定義訪問元數據的用戶。metadata_cluster定義InnoDB cluster名稱。ttl定義緩存時間爲5秒。
  • [routing:mycluster_default_rw]和[routing:mycluster_default_ro]分別定義讀寫路由和只讀路由。bind_address指定路由使用本機IP地址。配置文件中的bind_address選項只接受一個地址,但是可以使用bind_addres = 0.0.0.0綁定到localhost上的所有地址。bind_port指定客戶端連接Router使用的端口。destinations引用由metadata-cache定義的目標地址,以利用InnoDB Cluster的元數據緩存來動態配置主機信息。如果不使用InnoDB Cluster,destinations可以指定爲逗號分隔的IP:port地址,但bind_address中的地址不能出現在destinations列表中。routing_strategy定義路由策略,本例中讀寫和只讀均爲循環訪問三個節點。

        配置選項的完整說明,參見https://dev.mysql.com/doc/mysql-router/8.0/en/mysql-router-conf-options.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章