以前也介紹MySQL高可用相關的文章:前端
什麼是mysql route mysql
MySQL Router是處於應用client和dbserver之間的輕量級代理程序,它能檢測,分析和轉發查詢到後端數據庫實例,並把結果返回給client。是mysql-proxy的一個替代品。其架構圖和功能以下。linux
(1)Router實現讀寫分離,程序不是直接鏈接數據庫IP,而是固定鏈接到mysql router。MySQL Router對前端應用是透明的。應用程序把MySQL Router看成是普通的mysql實例,把查詢發給MySQL Router,而MySQL Router會把查詢結果返回給前端的應用程序。面試
(2)從數據庫服務器故障,業務能夠正常運行。由MySQL Router來進行自動下線不可用服務器。程序配置不須要任何修改。redis
(3)主數據庫故障,由MySQL Router來決定主從自動切換,業務能夠正常訪問。程序配置不須要作任何修改。sql
讀寫分離原理shell
MySQL Router接受前端應用程序請求後,根據不一樣的端口來區分讀寫,把鏈接讀寫端口的全部查詢發往主庫,把鏈接只讀端口的select查詢以輪詢方式發往多個從庫,從而實現讀寫分離的目的。讀寫返回的結果會交給MySQL Router,由MySQL Router返回給客戶端的應用程序。數據庫
Mysql router用途segmentfault
MySQL Router的主要用途是讀寫分離,主主故障自動切換,負載均衡,鏈接池等。
Mysql router主主故障自動切換的坑
Mysql router主主故障切換功能通過測試沒有問題,可是有一個比較大的坑須要注意,具體是什麼坑和解決方法在文章末尾,由於你以前要是沒用接觸過mysql router估計以個人表達能力,說了你就暈了。
實驗環境架構圖以下:
(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) 配置
一、建立配置文件目錄,複製模版配置文件
[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
二、配置文件設置,日誌目錄須要本身手動建立
[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
五、啓動服務
[root@c7-node1 ~]# systemctl enable mysqlrouter [root@c7-node1 ~]# systemctl start mysqlrouter
一、建立測試賬號,測試庫
MariaDB [(none)]> create database mysql_route; MariaDB [(none)]> GRANT all ON mysql_route.* TO 'route'@'%' IDENTIFIED BY 'route'; MariaDB [(none)]> FLUSH PRIVILEGES;
二、驗證讀負載均衡:從結果看到每次讀都是訪問不一樣的主機
三、驗證寫:能夠看到每次寫都是寫到主節點
下面是從庫down機測試截圖,能夠看到兩個節點都正常的狀況下,是輪訓從兩個從庫取數據,若是其中一個從庫故障,那麼mysql router會自動下線故障的從庫,若是從庫恢復,mysql router會自動把從庫上線。
驗證:正常狀況下數據寫入都是寫到主庫
咱們手動中止主庫的mysql服務,模擬故障,再次寫入,能夠看到寫入數據的節點是主庫的備份節點。
注意:
一、備份從庫不能打開read-only = on,否則切換以後寫入會報錯
二、第一臺主庫DOWN後,MySQL Router如何處理?
默認狀況下第一臺主數據庫爲寫主庫,當第一臺主數據庫DOWN機後,第二臺數據庫被提高爲主庫,稍後若是第一臺主庫被修復後,那麼默認仍然鏈接第二臺爲主庫進行讀寫,不會自動切回到第一臺主庫。
三、若是第一臺主數據庫被修復後,又但願切換回第一臺主庫,怎麼辦?
能夠重啓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主主故障切換原理就是這樣,可是生產環境就不能這麼玩了。
解決辦法:
一、在切換時須要本身編寫腳本觸發一個shell腳本或者event來處理重連的問題。
二、不使用mysql router主主故障轉移功能,而是本身使用其餘方式保證mysql主庫高可用。
版權申明:做者:西門飛冰,一名90後it男,一直在北京工做,熱愛運動,熱愛冒險,熱愛旅行。由做者原創投稿,版權歸原創者全部。除非沒法確認,咱們都會標明做者及出處,若有侵權煩請告知,咱們會當即刪除並表示歉意,謝謝。
關注 民工哥技術之路 微信公衆號對話框回覆關鍵字:1024 能夠獲取一份最新整理的技術乾貨:包括系統運維、數據庫、redis、MogoDB、電子書、Java基礎課程、Java實戰項目、架構師綜合教程、架構師實戰項目、大數據、Docker容器、ELK Stack、機器學習、BAT面試精講視頻等。