Mysql - 讀寫分離與讀負載均衡之Maxscale


一、概述

常見的高可用方案如MMM和MHA等都將重點放在主庫上,一旦主庫出現故障,通過這些方案能將主庫故障進行轉移。
本文將給大家介紹一款由mariadb公司出品的中間件Maxscale,該中間件能實現讀寫分離和讀負載均衡,安裝和配置都十分簡單。
官方文檔https://mariadb.com/kb/en/maxscale-22-getting-started/


二、節點介紹

本次實驗采用4台虛擬機,操作系統版本Centos6.10,mysql版本5.7.25
maxscale 10.40.16.60  路由  路由節點
node1     10.40.16.61  主庫  提供寫服務
node2     10.40.16.62  從庫  提供讀服務
node3     10.40.16.63  從庫  提供讀服務

節點拓撲圖
Snipaste_2019-09-23_09-54-09


三、安裝

1. 配置一主二從

其中node1是主庫,node2和node3是從庫。具體的復制搭建這里就省略,要是這都不會,那么該文章對你就沒意思了。順便安利一個自己寫的mysql一鍵安裝腳本https://www.cnblogs.com/ddzj01/p/10678296.html
注明:集群中使用的復制賬號為repl,密碼是'123456'


2. 下載maxscale包

下載地址:https://downloads.mariadb.com/MaxScale/2.2.0/centos/6Server/x86_64/
Snipaste_2019-09-23_10-00-23
我在做實驗的時候,最開始使用的是maxscale的最新版本(如:2.2.21-GA),安裝完后發現參數文件/etc/maxscale.cnf里面都只支持mariadb(protocol=MariaDBBackend),而不支持oracle官方的mysql。所以就選用一個了比較老的maxscale版本。等實驗做完了,我再試着用最新版本的maxscale軟件+老的參數文件也是能夠運行的。所以如果使用的oracle官方的mysql,要想使用最新版本的maxscale,則需要使用老版本的參數文件去替換新版本中的參數文件。


3. 安裝maxscale

在maxscale節點
yum install -y libaio libaio-devel
rpm -ivh maxscale-2.2.0-1.centos.6.x86_64.rpm


四、配置

1. 在node1(主庫)創建相關賬號

監控賬號,maxscale使用該賬號監控集群狀態。如果發現某個從服務器復制線程停掉了,那么就不向其轉發請求了。
(root@localhost)[(none)]> grant replication slave, replication client on *.* to scalemon@'%' identified by '123456';

路由賬號,maxscale使用該賬號將不同的請求分發到不同的節點上。當客戶端連接到maxscale這個節點上時,maxscale節點會使用該賬號去查后端數據庫,檢查客戶端登陸的用戶是否有權限或密碼是否正確等等。
(root@localhost)[(none)]> grant select on mysql.* to maxscale@'%' identified by '123456';


2. 在maxscale節點配置參數文件/etc/maxscale.cnf

# MaxScale documentation on GitHub:
# https://github.com/mariadb-corporation/MaxScale/blob/2.1/Documentation/Documentation-Contents.md

# Global parameters
#
# Complete list of configuration options:
# https://github.com/mariadb-corporation/MaxScale/blob/2.1/Documentation/Getting-Started/Configuration-Guide.md

[maxscale]
threads=1            # 線程數,一般與cpu核數相同

# Server definitions
#
# Set the address of the server to the network
# address of a MySQL server.
#

[server1]
type=server
address=10.40.16.61  # node1的ip
port=3306
protocol=MySQLBackend

[server2]
type=server
address=10.40.16.62  # node2的ip
port=3306
protocol=MySQLBackend

[server3]
type=server
address=10.40.16.63  # node3的ip
port=3306
protocol=MySQLBackend

# Monitor for the servers
#
# This will keep MaxScale aware of the state of the servers.
# MySQL Monitor documentation:
# https://github.com/mariadb-corporation/MaxScale/blob/2.1/Documentation/Monitors/MySQL-Monitor.md

[MySQL Monitor]
type=monitor
module=mysqlmon
servers=server1,server2,server3  # 集群的所有server
user=scalemon                    # 監控賬號
passwd=123456                    # 監控賬號密碼
monitor_interval=10000           # 監控的時間間隔,單位為毫秒

# Service definitions
#
# Service Definition for a read-only service and
# a read/write splitting service.
#

# ReadConnRoute documentation:
# https://github.com/mariadb-corporation/MaxScale/blob/2.1/Documentation/Routers/ReadConnRoute.md

# [Read-Only Service]           # 讀負載均衡模塊,由於讀寫分離模塊也能實現讀負載均衡,因此注釋掉該模塊
# type=service
# router=readconnroute
# servers=server1
# user=myuser
# passwd=mypwd
# router_options=slave

# ReadWriteSplit documentation:
# https://github.com/mariadb-corporation/MaxScale/blob/2.1/Documentation/Routers/ReadWriteSplit.md

[Read-Write Service]
type=service
router=readwritesplit
servers=server1,server2,server3  # 集群的所有server
user=maxscale                    # 路由賬號
passwd=123456                    # 路由賬號密碼
max_slave_connections=100%       # 多少比例的從服務器被使用,默認就是所有的從服務器都提供讀服務

# This service enables the use of the MaxAdmin interface
# MaxScale administration guide:
# https://github.com/mariadb-corporation/MaxScale/blob/2.1/Documentation/Reference/MaxAdmin.md

[MaxAdmin Service]
type=service
router=cli

# Listener definitions for the services
#
# These listeners represent the ports the
# services will listen on.
#

# [Read-Only Listener]           # 注釋該模塊
# type=listener
# service=Read-Only Service
# protocol=MySQLClient
# port=4008

[Read-Write Listener]
type=listener
service=Read-Write Service
protocol=MySQLClient
port=4006

[MaxAdmin Listener]
type=listener
service=MaxAdmin Service
protocol=maxscaled
# socket=default                # 注釋該socket
port=6603                       # 為maxadmin選擇一個端口
View Code


3. 在maxscale節點安裝mysql客戶端

注意這一步不是必須的,我只是為了方便后面的實驗,選擇在該節點安裝一個mysql客戶端,然后通過該客戶端去連maxscale
tar -zxvf mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz -C /usr/local/
cd /usr/local/
ln -s mysql-5.7.25-linux-glibc2.12-x86_64 mysql
echo 'export PATH=$PATH:/usr/local/mysql/bin' >> /root/.bash_profile
cd ~
source .bash_profile


五、maxscale相關操作

1. 啟動maxscale服務

maxscale -f /etc/maxscale.cnf

 

2. 登錄maxscale管理器

默認的用戶名和密碼是admin/mariadb
[root@monitor ~]# maxadmin --user=admin --password=mariadb

查看集群狀態
image
可以看到我並沒有在maxscale.cnf中指明哪一個是master哪一個是slave,maxscale會自動識別出集群的master與slave角色。所以我們可以將maxscale與mha結合起來,既能實現主庫的故障轉移,又能實現讀寫分離和從庫的負載均衡。

查看集群中的用戶
image


六、測試

1. 測試讀寫分離

在node1(主庫)上創建一個測試賬號
(root@localhost)[(none)]> grant all on *.* to scott@'%' identified by 'tiger';

在maxscale節點連接數據庫
[root@monitor ~]# mysql -uscott -ptiger -h10.40.16.60 -P4006
注意這里的-h連接的maxscale節點,-P是maxscale的端口,如果maxscale與mysql client不在同一台機器,還需要關閉maxscale上的防火牆
image

驗證讀寫分離
image

可以看到,讀的請求就轉發給了node2,而寫的請求轉發給了node1,讀寫分離驗證成功。


2. 測試讀負載均衡

image

在mysql服務器上分別查看當前的連接狀態
node1
image

node2
image

node3
image
可以看到在maxscale上面進行的三個連接在這三台mysql服務器上都進行了連接,所不同的是,node2有兩個會話在執行該語句,而node3有一個會話在執行該語句。也就是說默認會將讀的操作均勻分配到每個從節點中。


3. 單個slave出現故障

修改maxscale.cnf參數,將路由日志的級別設置為info,這步跟實驗無關,只是為了方便看日志
image

重啟maxscale服務
ps -ef | grep maxscale | grep -v grep | awk '{print $2}' | xargs kill -9
maxscale -f /etc/maxscale.cnf

停掉node2的復制
(root@localhost)[(none)]> stop slave;

觀察/tmp/maxscale.log
image

查看集群狀態
image

通過客戶端連接集群
mysql -uscott -ptiger -h10.40.16.60 -P4006 -BNe "select @@hostname;"
image
可以看到node2已經不提供讀服務了


4. 所有slave都出現故障

停掉node3的復制
(root@localhost)[(none)]> stop slave;

觀察/tmp/maxscale.log
image

查看集群狀態
image

通過客戶端連接集群
mysql -uscott -ptiger -h10.40.16.60 -P4006 -BNe "select @@hostname;"
image
可以看到讀寫分離已經不再有效,因為沒有slave了,只能去主庫讀。
我看到有的文章寫,如果所有從服務器都失效,即使主庫正常也會連接失敗,需要在配置文件中添加detect_stale_master=true,但是我這里並沒有這種情況,可能是早期的maxscale特性導致的,這里僅作為一個記錄。


5. 恢復slave

node2&node3
(root@localhost)[(none)]> start slave;

查看集群狀態
image

可以看到slave恢復后,又會自動加入到maxscale中來。


6. 測試從庫延遲

在node1(主庫)創建數據庫和給scalemon用戶賦權
(root@localhost)[hello]> grant all on *.* to scalemon@'%' identified by '123456';
(root@localhost)[hello]> create database maxscale_schema;

在maxscale節點修改參數文件/etc/maxscale
添加以下參數
image

重啟maxscale服務
ps -ef | grep maxscale | grep -v grep | awk '{print $2}' | xargs kill -9
maxscale -f /etc/maxscale.cnf

把node2的數據庫鎖住
(root@localhost)[(none)]> flush table with read lock;

在node1中做點修改
(root@localhost)[hello]> insert into t1 values(2);

過一段時間再連數據庫發現只能連接到node3了
mysql -uscott -ptiger -h10.40.16.60 -P4006 -BNe "select @@hostname;"
image

從庫延遲測試成功,但是遺憾的是我通過maxadmin和后台日志都沒看出任何異常來,可能是有命令我還沒熟吧。


七、總結

maxscale就給大家介紹到這里了,我在網上搜maxscale相關的博客時,發現並不多,而且即使有幾篇,也非常老,說明這個中間件使用的並不是很廣,如果大家對於這個持異議,歡迎大家留言。如果要在生產中使用這種中間件,還需要多多測試穩定性和加了中間件后查詢效率的損耗。

優點:
1. 配置簡單
2. 能實現讀寫分離
3. 能實現讀負載均衡

缺點:
1. 由於增加了中間層,所以對查詢效率有損耗

2. 中間層節點也容易出現單點故障

本文實驗部分取材於https://blog.csdn.net/yehanyy/article/details/78983763


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM