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 等, 應用程序的結構會稍顯複雜, 擴展性不強.