MySQL Router 測試使用 1. 特性 MySQL Router 並沒有包括一些特別新的特性, 總體上看中規中矩, 不過 first-available 和插件兩個特性挺有意思, 后續會進行講解, 特性包括: 對連接請求進行路由;和 Fabric 配套使用, 方便管理; 插件特性, 需要的功能以插件形式提供; 2. 配置 MySQL Router 在啟動的時候會讀取默認的配置文件, 用戶可以通過 -DROUTER_CONFIGDIR= 或編輯 cmake/settings.cmake 來自定義配置文件, 默認情況下從以下路徑讀取: [root@cz-centos7 bin]# ./mysqlrouter --help Copyright (c) 2015, 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. Start MySQL Router. Configuration read from the following files in the given order (enclosed in parentheses means not available for reading): (./mysqlrouter.ini) (/root/.mysqlrouter.ini) Usage: mysqlrouter [-v|--version] [-h|--help] [-c|--config=] [-a|--extra-config=] Options: -v, --version Display version information and exit. -h, --help Display this help and exit. -c , --config Only read configuration from given file. -a , --extra-config Read this file after configuration files are read from either default locations or from files specified by the --config option. 值得一提的是 -c 選項指定的配置會被最先加載, -a 指定的配置后續加載. 2.1 配置文件設置 2.1.1 通用選項 通用選項可以放到 [DEFAULT] 塊中, 通常包括一些目錄路徑配置: logging_folder: MySQL Router 運行時產生 log 的目錄路徑, log 文件默認為 mysqlrouter.log, 不設置路徑默認輸出到標准輸出(STDOUT); plugin_folder: MySQL Router 的插件路徑, 該路徑必須和 MySQL Router 的安裝目錄對應上, 如果是自定義的安裝路徑, 該選項必須要指定, 默認為 /usr/local/lib/mysqlrouter; runtime_folder: MySQL Router 運行時候的目錄路徑, 默認為 /usr/local ; config_folder: MySQL Router 配置文件的路徑, 默認為 /usr/loca/etc/mysqlrouter 舉例如下: [DEFAULT] logging_folder = /var/log/mysqlrouter plugin_folder = /usr/local/mysqlrouter/lib runtime_folder = /usr/local/mysqlrouter
2.1.2 路由選項 以下選項可以放到路由策略 [routing:] 塊中: bind_address: 工具啟動的時候綁定的網卡地址, 默認為 127.0.0.1, 如果沒有指定端口, bind_port 選項則必須指定; bind_port: 工具啟動監聽的端口, 如果 bind_address 以 ip:port 形式指定, 則 bind_port 不需要再指定; connect_timeout: 工具連接后端 MySQL Server 的超時時間, 默認為 1s, 有效的值為 1 ~ 65535; destinations: 以分號形式提供后端需要連接的 MySQL Server 列表; mode: 該選項必須要指定, 不同模式對應不同的調度策略, 目前支持兩種方式: read-write 和 read-only; max_connections: 連接到 MySQL Router 的最大連接數, 類似 MySQL Server 中的 max_connections 選項;
在 mode 選項中, 我們可以選用 read-write 和 read-only 模式:
read-write: 通常用於路由到后端的 MySQL master, 在 read-write 模式中, 所有的流量都轉發到 destinations 指定的列表的首個地址, 比如 “127.0.0.1:3301, 127.0.0.1:3302″, 則所有的流量都轉發到 3301 端口, 如果 3301 端口失敗, 則嘗試連接 3302 端口, 如果列表中沒有有效的MySQL Server, 路由請求會被中斷丟棄; 這種方式被稱作 “first-available”. 這種方式可以適用於一般的主從架構中, 比如指定列表 “master:3301, slave1:3301″, 在 master 出現故障的時候, MySQL Router 會自己連接 slave1, 不過中間的切換過程需要我們做很多的操作來滿足這種工作模式. read-only: 路由請求到后端的 MySQL slave, 從這點看 read-only 模式下, destitions 指定的 MySQL Server 列表應該都是 slave, 不同於 read-write 都指定的是 master. 在 read-only 模式中, 使用輪詢( round-robin )方式轉發請求到后端的 Server. 如果一個 Server 不可用,則嘗試下一個 Server, 這意味着不會丟失一個請求, 如果服務都不可用, 則丟棄請求.這種模式下如果應用讀寫分離, read-only 會是比較好的選擇. 從上面兩點看, MySQL Router 的服務模式和我們熟知的 cobar, atlas, kingshard 等大為不同, master, slave 都需要單獨配置, 這點在擴展性方面比較差, 估計很多人不會喜歡該模式, 不過話說回來, 如果能夠和 Fabric 很好的配合使用的話, 可能會吸引一部分用戶使用. 2.1.3 日志 日志選擇可以放到 [logger] 塊中, 可以用來指定日志級別, 默認為 INFO, 輸出則依賴 logging_folder 的選項: [logger] level = DEBUG
2.2 配置舉例 我們以讀擴展的配置舉例說明(read-write 模式估計不受歡迎 ~~, 可以配置多個 routing:, MySQL Router 可以啟動多個routing ): [DEFAULT] logging_folder = /usr/local/mysqlrouter/log plugin_folder = /usr/local/mysqlrouter/lib/mysqlrouter runtime_folder = /usr/local/mysqlrouter [logger] level = DEBUG [routing:readtest] bind_address = 0.0.0.0:7001 mode = read-only destinations = 10.0.21.7:3301,10.0.21.17:3301 #不能有空格
3 連接測試 啟動 ./bin/mysqlrouter -c /usr/local/mysqlrouter/etc/mysqlrouter.ini 先來看看最簡單的測試: [root@cz-centos7 ~]# time for x in `seq 1 5`; do /opt/Percona-Server-5.5.33-rel31.1-566.Linux.x86_64/bin/mysql -h 10.0.21.90 -P 7001 -uroot percona -Bse "show global variables like 'hostname'; show tables"; done 配置舉例 [DEFAULT] logging_folder = /usr/local/mysqlrouter/log plugin_folder = /usr/local/mysqlrouter/lib/mysqlrouter runtime_folder = /usr/local/mysqlrouter [logger] level = DEBUG [routing:readtest] bind_address = 0.0.0.0:7001 mode = read-write destinations = 10.0.21.17:3301 #多個地址用逗號分隔, 中間不能有空格 我們這里只設置一個 master, 然后再對比下直連 MySQL 和連接 MySQL Router 的測試結果. 直連 master: [root@cz-centos7 ~]# /opt/mysql/bin/mysqlslap -h 10.0.21.17 -P 3301 -uroot -a --auto-generate-sql-execute-number=10000 --auto-generate-sql-load-type=read --auto-generate-sql-secondary-indexes=3 --auto-generate-sql-unique-query-number=1 --auto-generate-sql-write-number=1000 -c 10 Benchmark Average number of seconds to run all queries: 180.839 seconds Minimum number of seconds to run all queries: 180.839 seconds Maximum number of seconds to run all queries: 180.839 seconds Number of clients running queries: 10 Average number of queries per client: 10000 連接 MySQL Router: [root@cz-centos7 ~]# /opt/mysql/bin/mysqlslap -h 10.0.21.90 -P 7001 -uroot -a --auto-generate-sql-execute-number=10000 --auto-generate-sql-load-type=read --auto-generate-sql-secondary-indexes=3 --auto-generate-sql-unique-query-number=1 --auto-generate-sql-write-number=1000 -c 10 Benchmark Average number of seconds to run all queries: 433.598 seconds Minimum number of seconds to run all queries: 433.598 seconds Maximum number of seconds to run all queries: 433.598 seconds Number of clients running queries: 10 Average number of queries per client: 10000 從時間總是上看, 直連方式中10個線程執行 1w 次請求需要大約 181s 左右, 平均每個線程每秒執行5.5次, 連接 MySQL Router 則每個線程平均每秒執行2.3次, 多了一層轉發性能消耗還是比較明顯的. 這里只是簡單的測試, destinations 中如果提供多個服務作為 read 擴展, 相信性能還是會有所提升的. 總體上看, 應用程序本身支持讀寫分離的話, 分別指定兩個 routing section(read-write 和 read-only) 會是很不錯的選擇, 當然比起 atlas, cobar 等, 應用程序的結構會稍顯復雜, 擴展性不強.