官方工具|MySQL Router高可用原理與實(shí)戰(zhàn)
Mysql route介紹
什么是mysql route
MySQL Router是處于應(yīng)用client和dbserver之間的輕量級(jí)代理程序,它能檢測(cè),分析和轉(zhuǎn)發(fā)查詢到后端數(shù)據(jù)庫實(shí)例,并把結(jié)果返回給client。是mysql-proxy的一個(gè)替代品。其架構(gòu)圖和功能如下。
(1)Router實(shí)現(xiàn)讀寫分離,程序不是直接連接數(shù)據(jù)庫IP,而是固定連接到mysql router。MySQL Router對(duì)前端應(yīng)用是透明的。應(yīng)用程序把MySQL Router當(dāng)作是普通的mysql實(shí)例,把查詢發(fā)給MySQL Router,而MySQL Router會(huì)把查詢結(jié)果返回給前端的應(yīng)用程序。
(2)從數(shù)據(jù)庫服務(wù)器故障,業(yè)務(wù)可以正常運(yùn)行。由MySQL Router來進(jìn)行自動(dòng)下線不可用服務(wù)器。程序配置不需要任何修改。
(3)主數(shù)據(jù)庫故障,由MySQL Router來決定主從自動(dòng)切換,業(yè)務(wù)可以正常訪問。程序配置不需要做任何修改。
讀寫分離原理
MySQL Router接受前端應(yīng)用程序請(qǐng)求后,根據(jù)不同的端口來區(qū)分讀寫,把連接讀寫端口的所有查詢發(fā)往主庫,把連接只讀端口的select查詢以輪詢方式發(fā)往多個(gè)從庫,從而實(shí)現(xiàn)讀寫分離的目的。讀寫返回的結(jié)果會(huì)交給MySQL Router,由MySQL Router返回給客戶端的應(yīng)用程序。
Mysql router用途
MySQL Router的主要用途是讀寫分離,主主故障自動(dòng)切換,負(fù)載均衡,連接池等。
Mysql router主主故障自動(dòng)切換的坑
Mysql router主主故障切換功能經(jīng)過測(cè)試沒有問題,但是有一個(gè)比較大的坑需要注意,具體是什么坑和解決方法在文章末尾,因?yàn)槟阒耙菦]用接觸過mysql router估計(jì)以我的表達(dá)能力,說了你就暈了。
mysql router實(shí)驗(yàn)架構(gòu)介紹
實(shí)驗(yàn)環(huán)境架構(gòu)圖如下:
安裝部署mysql route
(1)下載地址:提供不同平臺(tái),二進(jìn)制包和rpm包,選擇合適安裝方式即可,我這里使用二進(jìn)制包安裝
(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、創(chuàng)建配置文件目錄,復(fù)制模版配置文件
- [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、配置文件設(shè)置,日志目錄需要自己手動(dòng)創(chuàng)建
- [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
- # 運(yùn)行目錄
- runtime_folder = /var/run
- [logger]
- # 日志運(yùn)行級(jí)別
- level = INFO
- # 主節(jié)點(diǎn)故障轉(zhuǎn)移配置
- [routing:basic_failover]
- # 寫節(jié)點(diǎn)地址
- bind_address=192.168.100.10
- # 寫節(jié)點(diǎn)端口
- bind_port = 7001
- # 模式,讀寫
- mode = read-write
- # 主節(jié)點(diǎn)地址:默認(rèn)情況下第一臺(tái)主數(shù)據(jù)庫為寫主庫,當(dāng)?shù)谝慌_(tái)主數(shù)據(jù)庫DOWN機(jī)后,第二臺(tái)數(shù)據(jù)庫被提升為主庫
- destinations = 192.168.100.11:3306,192.168.100.12:3306
- # 從節(jié)點(diǎn)負(fù)載均衡配置
- [routing:balancing]
- # 綁定的IP地址
- bind_address=192.168.100.10
- # 監(jiān)聽的端口
- bind_port = 7002
- # 連接超時(shí)時(shí)間
- connect_timeout = 3
- # 最大連接數(shù)
- max_connections = 1024
- # 后端服務(wù)器地址
- destinations = 192.168.100.12:3306,192.168.100.13:3306
- # 模式:讀還是寫
- mode = read-only
- [keepalive]
- interval = 60
日志目錄創(chuàng)建及授權(quán)
- [root@c7-node1 ~]# mkdir /data/log/mysql-route/
- [root@c7-node1 ~]# chown mysql:mysql /data/log/mysql-route/
(4) 啟動(dòng):mysql route官方?jīng)]有提供啟動(dòng)腳本,需要自己編寫
- [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、啟動(dòng)服務(wù)
- [root@c7-node1 ~]# systemctl enable mysqlrouter
- [root@c7-node1 ~]# systemctl start mysqlrouter
讀寫分離測(cè)試
1、創(chuàng)建測(cè)試帳號(hào),測(cè)試庫
- MariaDB [(none)]> create database mysql_route;
- MariaDB [(none)]> GRANT all ON mysql_route.* TO 'route'@'%' IDENTIFIED BY 'route';
- MariaDB [(none)]> FLUSH PRIVILEGES;
2、驗(yàn)證讀負(fù)載均衡:從結(jié)果看到每次讀都是訪問不同的主機(jī)
3、驗(yàn)證寫:可以看到每次寫都是寫到主節(jié)點(diǎn)
從庫down機(jī)測(cè)試
下面是從庫down機(jī)測(cè)試截圖,可以看到兩個(gè)節(jié)點(diǎn)都正常的情況下,是輪訓(xùn)從兩個(gè)從庫取數(shù)據(jù),如果其中一個(gè)從庫故障,那么mysql router會(huì)自動(dòng)下線故障的從庫,如果從庫恢復(fù),mysql router會(huì)自動(dòng)把從庫上線。
主主故障切換測(cè)試
驗(yàn)證:正常情況下數(shù)據(jù)寫入都是寫到主庫
我們手動(dòng)停止主庫的mysql服務(wù),模擬故障,再次寫入,可以看到寫入數(shù)據(jù)的節(jié)點(diǎn)是主庫的備份節(jié)點(diǎn)。
注意:
1、備份從庫不能打開read-only = on,不然切換之后寫入會(huì)報(bào)錯(cuò)
2、第一臺(tái)主庫DOWN后,MySQL Router如何處理?
默認(rèn)情況下第一臺(tái)主數(shù)據(jù)庫為寫主庫,當(dāng)?shù)谝慌_(tái)主數(shù)據(jù)庫DOWN機(jī)后,第二臺(tái)數(shù)據(jù)庫被提升為主庫,稍后如果第一臺(tái)主庫被修復(fù)后,那么默認(rèn)仍然連接第二臺(tái)為主庫進(jìn)行讀寫,不會(huì)自動(dòng)切回到第一臺(tái)主庫。
3、如果第一臺(tái)主數(shù)據(jù)庫被修復(fù)后,又希望切換回第一臺(tái)主庫,怎么辦?
可以重啟MySQL Router
主主故障切換的坑
Mysql router的主主故障切換如果是運(yùn)行在一主一從的情況下,從庫作為主庫的備份,這種情況是使用mysql router主主故障切換是沒有問題的,但是在一主多從的情況下使用主主故障切換就會(huì)處在如下問題。
在一主多從的情況,如果主庫down機(jī),切換到備份節(jié)點(diǎn),其他從庫的主庫地址連接還是故障的主庫,這樣就會(huì)造成一個(gè)從庫slave_io線程connecting狀態(tài),造成復(fù)制延遲。我之前的主庫地址是192.168.10.11,備份主庫地址是192.168.10.12,但是主庫故障之后,mysql route可以把寫請(qǐng)求路由到新的主庫,但是從庫嘗試連接的主庫還是192.168.10.11,這種情況是正常的,因?yàn)閙ysql router主主故障切換原理就是這樣,但是生產(chǎn)環(huán)境就不能這么玩了。
解決辦法:
1、在切換時(shí)需要自己編寫腳本觸發(fā)一個(gè)shell腳本或者event來處理重連的問題。
2、不使用mysql router主主故障轉(zhuǎn)移功能,而是自己使用其他方式保證mysql主庫高可用。
版權(quán)申明:作者:西門飛冰,一名90后it男,一直在北京工作,熱愛運(yùn)動(dòng),熱愛冒險(xiǎn),熱愛旅行。由作者原創(chuàng)投稿,版權(quán)歸原創(chuàng)者所有。除非無法確認(rèn),我們都會(huì)標(biāo)明作者及出處,如有侵權(quán)煩請(qǐng)告知,我們會(huì)立即刪除并表示歉意,謝謝。
關(guān)注 民工哥技術(shù)之路 微信公眾號(hào)對(duì)話框回復(fù)關(guān)鍵字:1024 可以獲取一份最新整理的技術(shù)干貨:包括系統(tǒng)運(yùn)維、數(shù)據(jù)庫、redis、MogoDB、電子書、Java基礎(chǔ)課程、Java實(shí)戰(zhàn)項(xiàng)目、架構(gòu)師綜合教程、架構(gòu)師實(shí)戰(zhàn)項(xiàng)目、大數(shù)據(jù)、Docker容器、ELK Stack、機(jī)器學(xué)習(xí)、BAT面試精講視頻等。