架構圖
未命名 2.001.jpeg
介紹
- MySQL Router是處于應用client和dbserver之間的輕量級代理程序,它能檢測,分析和轉發查詢到后端數據庫實例,并把結果返回給client。是mysql-proxy的一個替代品。
- Router實現讀寫分離,程序不是直接連接數據庫IP,而是固定連接到mysql router。MySQL Router對前端應用是透明的。應用程序把MySQL Router當作是普通的mysql實例,把查詢發給MySQL Router,而MySQL Router會把查詢結果返回給前端的應用程序。
- 從數據庫服務器故障,業務可以正常運行。由MySQL Router來進行自動下線不可用服務器。程序配置不需要任何修改。
- 主數據庫故障,由MySQL Router來決定主從自動切換,業務可以正常訪問。程序配置不需要做任何修改。
讀寫分離原理
MySQL Router接受前端應用程序請求后,根據不同的端口來區分讀寫,把連接讀寫端口的所有查詢發往主庫,把連接只讀端口的select查詢以輪詢方式發往多個從庫,從而實現讀寫分離的目的。讀寫返回的結果會交給MySQL Router,由MySQL Router返回給客戶端的應用程序。
配置方法
基于 Docker
環境描述:
- 操作系統:Ubuntu 14.04
- router_master 主服務器(讀寫):172.17.0.8
- router_slave01 從服務器(讀,熱備份):172.17.0.9
- router_slave02 從服務器(讀):172.17.0.10
- mysql-router 路由服務器:172.17.0.2
1. MySQL 主從復制
2. MySQL-Router 配置
-
安裝部署 MySQL Router
- 下載:MySQL Router
- 解壓到指定目錄
tar -zxvf mysql-router-2.1.4-linux-glibc2.12-x86-64bit.tar.gz -C /usr/local/ cd /usr/local/ ln -s mysql-router-2.0.3-linux-glibc2.12-x86-64bit/ mysql-router
-
配置 MySQL Router
- 創建配置文件目錄,復制配置文件模板
mkdir /etc/mysql-route/ cp share/doc/mysqlrouter/sample_mysqlrouter.conf /etc/mysql-route/mysqlrouter.conf
- 配置文件
[DEFAULT] # 日志存放目錄 logging_folder = /data/log/mysql-route # 插件存放目錄 plugin_folder = /usr/local/mysql-router/lib/mysqlrouter # 配置文件存放目錄 config_folder = /etc/mysql-route # 運行目錄 runtime_folder = /var/run [logger] # 日志運行級別 level = INFO # 主節點故障轉移配置 [routing:basic_failover] # 寫節點地址 bind_address=172.17.0.2 # 寫節點端口 bind_port = 7001 # 模式,讀寫 mode = read-write # 主節點地址:默認情況下第一臺主數據庫為寫主庫,當第一臺主數據庫DOWN機后,第二臺數據庫被提升為主庫 destinations = 172.17.0.8:3306,172.17.0.9:3306 # 從節點負載均衡配置 [routing:balancing] # 綁定的IP地址 bind_address=172.17.0.2 # 監聽的端口 bind_port = 7002 # 連接超時時間 connect_timeout = 3 # 最大連接數 max_connections = 1024 # 后端服務器地址 destinations = 172.17.0.9:3306,172.17.0.10:3306 # 模式:讀還是寫 mode = read-only [keepalive] interval = 60
- 創建日志目錄
mkdir /data/log/mysql-route chown root:root /data/log/mysql-route/
啟動 MySQL Router
root@mysql-router:/usr/local/mysql-router/bin# ./mysqlrouter -c /etc/mysql-route/mysqlrouter.conf &
-
測試讀寫分離
- 先暫時停掉主從復制
- 在 master 節點插入數據,然后通過 mysql-proxy 查詢
- 在 slave 節點插入數據,然后通過 mysql-proxy 查詢
-
驗證負載均衡
- 讀操作
mysql -h 172.17.0.2 -uroot -P7002 -proot -e "show variables like 'hostname';"
- 寫操作
mysql -h 172.17.0.2 -uroot -P7001 -proot -e "show variables like 'hostname';"
-
測試主主故障切換
- 從庫 down 機
- 主庫 sown 機
缺陷
在一主多從的情況,如果主庫down機,切換到備份節點,其他從庫的主庫地址連接還是故障的
主庫,這樣就會造成一個從庫slave_io線程connecting狀態,造成復制延遲
- 解決方案:
1、在切換時需要自己編寫腳本觸發一個shell腳本或者event來處理重連的問題。
2、不使用mysql router主主故障轉移功能,而是自己使用其他方式保證mysql主庫高可用。