如何輕松實現MySQL數據庫的讀寫分離和負載均衡?


配置好了 Mysql 的主從復制結構后,我們希望實現讀寫分離,把讀操作分散到從服務器中,並且對多個從服務器能實現負載均衡。讀寫分離和負載均衡是 Mysql 集群的基礎需求,MaxScale 就可以幫着我們方便的實現這些功能。


 
image.png

MaxScale 的基礎構成

MaxScale 是Mysql 的兄弟公司 MariaDB 開發的,現在已經發展得非常成熟。MaxScale 是插件式結構,允許用戶開發適合自己的插件。
MaxScale 目前提供的插件功能分為5類

  1. 認證插件
    提供了登錄認證功能,MaxScale會讀取並緩存數據庫中 user 表中的信息,當有連接進來時,先從緩存信息中進行驗證,如果沒有此用戶,會從后端數據庫中更新信息,再次進行驗證

  2. 協議插件
    包括客戶端連接協議,和連接數據庫的協議。

  3. 路由插件
    決定如何把客戶端的請求轉發給后端數據庫服務器,讀寫分離和負載均衡的功能就是由這個模塊實現的。

  4. 監控插件
    對各個數據庫服務器進行監控,例如發現某個數據庫服務器響應很慢,那么就不向其轉發請求了。

  5. 日志和過濾插件
    提供簡單的數據庫防火牆功能,可以對SQL進行過濾和容錯。

配置方式

准備3台服務器,安裝 Mysql,配置一主二從的復制結構。主從復制的配置過程參加上一節內容。

安裝 MaxScale

最好在另一台服務器上安裝,如果資源不足,可以和某個 Mysql 放在一起。
MaxScale 的下載地址,最新版本2.3.4,實例中使用的是1.4.5:
https://downloads.mariadb.com/files/MaxScale

根據自己的服務器選擇合適的安裝包,以 centos 7 為例安裝步驟如下:

yum install libaio.x86_64 libaio-devel.x86_64 novacom-server.x86_64 libedit -y
wget https://downloads.mariadb.com/MaxScale/1.4.5/centos/7/x86_64/maxscale-1.4.5-1.centos.7.x86_64.rpm
rpm -ivh maxscale-1.4.5-1.centos.7.x86_64.rpm

 

配置MaxScale

在開始配置之前,需要在 master 中為 MaxScale 創建兩個用戶,用於監控模塊和路由模塊:

  1. 創建監控用戶
create user 'maxmon'@'%' identified by '123456';
grant replication slave,replication client on *.* to 'maxmon'@'%';

 

  1. 創建路由用戶
create user 'maxrou'@'%' identified by '123456';
grant select on mysql.* to 'maxrou'@'%';
flush privileges;

 

  1. 修改maxscale配置文件
    用戶創建完成后,開始配置
vi /etc/maxscale.cnf

 

找到 [server1] 部分,修改其中的 address 和 port,指向 master 的 IP 和端口
復制2次 [server1] 的整塊兒內容,改為 [server2] 與 [server3],同樣修改其中的 address 和 port,分別指向 slave1 和 slave2

 
 

找到 [MySQL Monitor] 部分,修改 servers 為 server1,server2,server3,修改 user 和 passwd 為之前創建的監控用戶的信息(maxmon,123456)

 
 

找到 [Read-Write Service] 部分,修改 servers 為 server1,server2,server3,修改 user 和 passwd 為之前創建的路由用戶的信息(maxrou,123456)

 
 

由於我們使用了 [Read-Write Service],需要刪除另一個服務 [Read-Only Service],刪除其整塊兒內容即可,底部還有一個[Read-Only Client]也需要刪除。

配置完成,保存並退出編輯器。

啟動MaxScale

執行啟動命令

maxscale --config=/etc/maxscale.cnf

 

查看 MaxScale 的響應端口是否已經就緒

netstat -ntelp

 

 
 

4006 是Read-Write Listener使用的端口,用於連接MaxScale

6603 是MaxAdmin Listener使用的端口,用於MaxScale 管理器

登錄 MaxScale 管理器,查看一下數據庫連接狀態,默認的用戶名和密碼是 admin/mariadb

maxadmin --user=admin --password=mariadb
MaxScale> list servers

 

 
 

可以看到,MaxScale 已經連接到了 master 和 slave

測試

先在 master 上創建一個測試用戶

create user 'rtest'@'%' identified by '111111';
grant ALL PRIVILEGES on *.* to 'rtest'@'%';

 

使用 Mysql 客戶端到連接 MaxScale

mysql -urtest -p'111111' -h'192.168.33.11' -P4006

 

執行查看數據庫服務器名的操作來知道當前實際所在的數據庫

Select @@hostname;
start transaction;
Select @@hostname;
roolback;
Select @@hostname;

 

 
image.png

開啟事務后,就自動路由到了 master,普通的查詢操作,是在 slave上。

總結

通過MaxScale可以很輕松的實現MySQL數據庫的讀寫分離和負載均衡。

想要了解更多Java架構技術點的,可以關注一下我,另外順便給大家推薦一下我的Java交流社區:519752913,里面會分享一些資深架構師錄制的視頻錄像:有Spring,MyBatis,Netty源碼分析,高並發、高性能、分布式、微服務架構的原理,JVM性能優化這些成為架構師必備的知識體系。還能領取免費的學習資源,相信會對你有所幫助的。

 

作者:山東大蔥哥
鏈接:https://www.jianshu.com/p/70d94a8f6491

 


免責聲明!

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



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