之前也介紹MySQL高可用相關的文章:
Mysql route介紹
什麼是mysql route
MySQL Router是處於應用client和dbserver之間的輕量級代理程式,它能檢測,分析和轉發查詢到後端資料庫例項,並把結果返回給client。是mysql-proxy的一個替代品。其架構圖和功能如下。
(1)Router實現讀寫分離,程式不是直接連線資料庫IP,而是固定連線到mysql router。MySQL Router對前端應用是透明的。應用程式把MySQL Router當作是普通的mysql例項,把查詢發給MySQL Router,而MySQL Router會把查詢結果返回給前端的應用程式。
(2)從資料庫伺服器故障,業務可以正常執行。由MySQL Router來進行自動下線不可用伺服器。程式配置不需要任何修改。
(3)主資料庫故障,由MySQL Router來決定主從自動切換,業務可以正常訪問。程式配置不需要做任何修改。
讀寫分離原理
MySQL Router接受前端應用程式請求後,根據不同的埠來區分讀寫,把連線讀寫埠的所有查詢發往主庫,把連線只讀埠的select查詢以輪詢方式發往多個從庫,從而實現讀寫分離的目的。讀寫返回的結果會交給MySQL Router,由MySQL Router返回給客戶端的應用程式。
Mysql router用途
MySQL Router的主要用途是讀寫分離,主主故障自動切換,負載均衡,連線池等。
Mysql router主主故障自動切換的坑
Mysql router主主故障切換功能經過測試沒有問題,但是有一個比較大的坑需要注意,具體是什麼坑和解決方法在文章末尾,因為你之前要是沒用接觸過mysql router估計以我的表達能力,說了你就暈了。
mysql router實驗架構介紹
實驗環境架構圖如下:
安裝部署mysql route
(1)下載地址:提供不同平臺,二進位制包和rpm包,選擇合適安裝方式即可,我這裡使用二進位制包安裝
(2)解壓安裝
[root@c7-node1 ~]# tar xf mysql-router-2.0.3-linux-glibc2.12-x86-64bit.tar.gz -C /usr/local/
[root@c7-node1 ~]# cd /usr/local/
[root@c7-node1 local]# ln -s mysql-router-2.0.3-linux-glibc2.12-x86-64bit/ mysql-router
[root@c7-node1 local]# cd mysql-router
[root@c7-node1 mysql-router]# ll
total 0
drwxr-xr-x 2 7161 wheel 24 Feb 23 2016 bin
drwxr-xr-x 4 7161 wheel 36 Feb 23 2016 include
drwxr-xr-x 3 7161 wheel 150 Feb 23 2016 lib
drwxrwxr-x 2 7161 wheel 6 Feb 23 2016 run
drwxr-xr-x 3 7161 wheel 16 Feb 23 2016 share
(3) 配置
1、建立配置檔案目錄,複製模版配置檔案
[root@c7-node1 mysql-router]# mkdir /etc/mysql-route/
[root@c7-node1 mysql-router]# cp share/doc/mysqlrouter/sample_mysqlrouter.ini /etc/mysql-route/mysqlrouter.conf
2、配置檔案設定,日誌目錄需要自己手動建立
[root@node1 ~]# cat /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=192.168.100.10
# 寫節點埠
bind_port = 7001
# 模式,讀寫
mode = read-write
# 主節點地址:預設情況下第一臺主資料庫為寫主庫,當第一臺主資料庫DOWN機後,第二臺資料庫被提升為主庫
destinations = 192.168.100.11:3306,192.168.100.12:3306
# 從節點負載均衡配置
[routing:balancing]
# 繫結的IP地址
bind_address=192.168.100.10
# 監聽的埠
bind_port = 7002
# 連線超時時間
connect_timeout = 3
# 最大連線數
max_connections = 1024
# 後端伺服器地址
destinations = 192.168.100.12:3306,192.168.100.13:3306
# 模式:讀還是寫
mode = read-only
[keepalive]
interval = 60
日誌目錄建立及授權
[root@c7-node1 ~]# mkdir /data/log/mysql-route/
[root@c7-node1 ~]# chown mysql:mysql /data/log/mysql-route/
(4) 啟動:mysql route官方沒有提供啟動指令碼,需要自己編寫
[root@c7-node1 ~]# cat /usr/lib/systemd/system/mysqlrouter.service
[Unit]
Description=MySQL Router
After=syslog.target
After=network.target
[Service]
Type=simple
User=mysql
Group=mysql
ExecStart=/usr/local/mysql-router/bin/mysqlrouter -c /etc/mysql-route/mysqlrouter.conf
PrivateTmp=true
[Install]
WantedBy=multi-user.target
5、啟動服務
[root@c7-node1 ~]# systemctl enable mysqlrouter
[root@c7-node1 ~]# systemctl start mysqlrouter
讀寫分離測試
1、建立測試帳號,測試庫
MariaDB [(none)]> create database mysql_route;
MariaDB [(none)]> GRANT all ON mysql_route.* TO 'route'@'%' IDENTIFIED BY 'route';
MariaDB [(none)]> FLUSH PRIVILEGES;
2、驗證讀負載均衡:從結果看到每次讀都是訪問不同的主機
3、驗證寫:可以看到每次寫都是寫到主節點
從庫down機測試
下面是從庫down機測試截圖,可以看到兩個節點都正常的情況下,是輪訓從兩個從庫取資料,如果其中一個從庫故障,那麼mysql router會自動下線故障的從庫,如果從庫恢復,mysql router會自動把從庫上線。
主主故障切換測試
驗證:正常情況下資料寫入都是寫到主庫
我們手動停止主庫的mysql服務,模擬故障,再次寫入,可以看到寫入資料的節點是主庫的備份節點。
注意:
1、備份從庫不能開啟read-only = on,不然切換之後寫入會報錯
2、第一臺主庫DOWN後,MySQL Router如何處理?
預設情況下第一臺主資料庫為寫主庫,當第一臺主資料庫DOWN機後,第二臺資料庫被提升為主庫,稍後如果第一臺主庫被修復後,那麼預設仍然連線第二臺為主庫進行讀寫,不會自動切回到第一臺主庫。
3、如果第一臺主資料庫被修復後,又希望切換回第一臺主庫,怎麼辦?
可以重啟MySQL Router
主主故障切換的坑
Mysql router的主主故障切換如果是執行在一主一從的情況下,從庫作為主庫的備份,這種情況是使用mysql router主主故障切換是沒有問題的,但是在一主多從的情況下使用主主故障切換就會處在如下問題。
在一主多從的情況,如果主庫down機,切換到備份節點,其他從庫的主庫地址連線還是故障的主庫,這樣就會造成一個從庫slave_io執行緒connecting狀態,造成複製延遲。我之前的主庫地址是192.168.10.11,備份主庫地址是192.168.10.12,但是主庫故障之後,mysql route可以把寫請求路由到新的主庫,但是從庫嘗試連線的主庫還是192.168.10.11,這種情況是正常的,因為mysql router主主故障切換原理就是這樣,但是生產環境就不能這麼玩了。
解決辦法:
1、在切換時需要自己編寫指令碼觸發一個shell指令碼或者event來處理重連的問題。
2、不使用mysql router主主故障轉移功能,而是自己使用其他方式保證mysql主庫高可用。
版權申明:作者:西門飛冰,一名90後it男,一直在北京工作,熱愛運動,熱愛冒險,熱愛旅行。由作者原創投稿,版權歸原創者所有。除非無法確認,我們都會標明作者及出處,如有侵權煩請告知,我們會立即刪除並表示歉意,謝謝。
關注 民工哥技術之路 微信公眾號對話方塊回覆關鍵字:1024 可以獲取一份最新整理的技術乾貨:包括系統運維、資料庫、redis、MogoDB、電子書、Java基礎課程、Java實戰專案、架構師綜合教程、架構師實戰專案、大資料、Docker容器、ELK Stack、機器學習、BAT面試精講視訊等。