1. 程式人生 > >Maxscale 功能簡單介紹

Maxscale 功能簡單介紹

maxscale 讀寫分離 mysql讀寫分離 maxscale讀寫分離

MaxScale使用基於數據庫語句規則檢測再轉發到後端群集內的服務器,透明地為應用程序提供負載均衡和高可用性功能,具有可擴展和靈活的架構。


MaxScale中的限制參考官方文檔:

https://mariadb.com/kb/en/mariadb-enterprise/mariadb-maxscale-22-limitations-and-known-issues-within-mariadb-maxscale/


配置分為幾大模塊:

全局配置[maxscale]

主要配置服務的基本參數,比如啟動線程數、線程堆棧大小、日誌等級、數據目錄等等項...

服務狀態監控[MySQL Monitor]

該項主要作用是用於對後端數據庫服務進行狀態檢測及控制

Mysql Monitor

Galera Monitor

NDBCluster Monitor

Multi-Master Monitor

從簡單master-slave架構到復雜的galera cluster都支持,就是不知道能不能支持mysql group replication,沒測試過.........

後端服務定義[server name]

路由

MaxScale的主要任務是接受來自客戶端應用程序的數據庫連接,通過解析這些語句/鏈接並路由到後端正確的數據庫服務上,所以路由是maxscale的核心部件,目前有四種路由方式可以供我們選擇

基於鏈接的負載均衡:* ReadConnRoute

基於語句的讀寫分離:* ReadWriteSplit

庫級別的簡單分庫:* SchemaRouter

二進制日誌服務器:* Binlogrouter,可以作為中繼服務使用,且不會像復制線程一樣重放binlog,這使得它的效率會很高,到真正的slave節點幾乎只是個網絡延後

Maxadmin

監聽配置


配置項就不過多做解釋,Mariadb官網有詳細的文檔參考(https://mariadb.com/kb/en/mariadb-enterprise/maxscale/),下面是我測試的配置文件供參考,主要是對讀寫分離進行測試

#?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=4??????????????????#線程數,盡量不要超過CPU個數
thread_stack_size=5Mi
auth_connect_timeout=10
proxy_protocol=1???????????#協議包,使後端mariadb服務顯示連接的源IP
log_to_shm=0???????????????#不將日誌寫入到共享緩存中??
log_warning=1??????????????#日誌記錄告警信息??
log_notice=1???????????????#記錄notice??
log_info=1?????????????????#日誌記錄info??
log_debug=0????????????????#關閉debug模式??
log_augmentation=1?????????#日誌遞增?
#datadir=/data/maxscale????#數據目錄,基於binlog中繼模式時保存的binlog文件目錄?

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

[server1]
type=server
address=10.5.10.17
port=3306
protocol=MySQLBackend
serversize=30					#負載均衡百分比
#allow_external_slaves=true

[server2]
type=server
address=10.5.10.18
port=3306
protocol=MySQLBackend
serversize=70
#allow_external_slaves=true

#?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

#monitor配置,如不配置monitor需通過maxadmin手動設置主從狀態,不然無法讀寫分離
[MySQL?Monitor]
type=monitor
module=mysqlmon?????????????????????????#模塊
servers=server1,server2
user=maxscale
passwd=9C8890EB5EEEDB069DD56DF649001E9C
monitor_interval=1000???????????????????#監測後端服務器心跳的間隔時間,單位毫秒
detect_replication_lag=true?????????????#開啟檢查slave延遲
detect_stale_master=true????????????????#打開slave宕機分發查詢到master的機制,當所有slave宕機服務依然可用
detect_standalone_master=true???????????#當該參數打開時,簡單主從雙節點的集群當master宕機會檢測在線的slave能否作為新master使用,假如使用了MHA或自動切換工具就會自動檢查到master並提供寫服務
failcount=5?????????????????????????????#標記新master之前,發生故障的機器失敗次數
allow_cluster_recovery=true?????????????#宕機恢復的節點是否允許重新加入集群提供服務


#?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=server2
user=maxscale
passwd=9C8890EB5EEEDB069DD56DF649001E9C
router_options=slave
weightby=serversize						#負載均衡權重控制,使用每個服務的serversize值
#?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
max_slave_replication_lag=5?????????????????????#允許slave延遲時間,超過該值將不會分發查詢操作到slave
user=maxscale
passwd=9C8890EB5EEEDB069DD56DF649001E9C
master_accept_reads=false???????????????????????#是否允許master接收查詢操作
#max_slave_connections=100%
use_sql_variables_in=master?????????????????????#包含臨時變量的sql路由到的位置,可配置項[all/master/slave]
#auth_all_servers=true

#?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配置模塊
[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
##########################



在利用sysbench進行壓力測試時發現所有請求都分發在master上,這可能和sysbench事務請求方式有關,而手動操作卻能正常分離,畢竟測試也就沒去深究怎麽回事,由於我們現在的環境使用的是mysqlrouter

做的中間件,所以就直接和mysqlrouter做了個單節點壓力對比,同樣的節點mysqlrouter壓測oltp能達到7w-8w的qps,而maxscale只有5-6W的qps,mysqlrouter大家都知道是oracle官方的輕量級路由中間件,性能

損耗很低,比直連mysql低不了多少,我們可以看成利用maxscale做中間件的單節點比直連效率降低20%左右,畢竟做了連接解析等一系列操作嘛,可以理解的......,如果一個節點扛不住可以做maxscale層做負載

嘛,maxscale是無數據存儲的。


在測試途中發現maxscale幾個好用的點:

自動檢查slave延遲,延遲時間超過設置的值就不給對應節點路由連接過去,直到延遲時間低於閾值,maxscale主從檢查方式是在master上創建一個maxscale_schema庫並創建replication_heartbeat心跳表,在

master上每隔一個心跳時間就插入當前時間戳,再在slave讀取該表的值進行計算延遲時間,這方式簡單粗暴,相對於mysql源生復制采用讀取的event和執行的event時間戳計算時間差的方式更精確一些,需要給

maxscale配置的monitor用戶指定maxscale_schema庫replication_heartbeat表的讀寫權限

master宕機自動檢查是否有新master可提供寫入操作,該功能使我們平時的高可用變的簡單,宕機切換之後不需要對maxscale做任何操作就自動能恢復寫入操作

由於maxscale的monitor機制,會檢查所有節點的身份,當宕機的節點恢復時可以自動加入到集群提供服務,這個還需要和slave延遲檢測像結合使用,以免讀取不到新數據

讀寫分離路由當master宕機,slave依然可以提供讀服務,不用擔心master宕了所有讀寫都無法操作的情況

配置文件密碼可加密,操作方式:

????[root@localhost?maxscale]#?maxkeys?
????Generating?.secrets?file?in?/var/lib/maxscale.
????[root@localhost?maxscale]#?maxpasswd??123456
????17EB6DA393620980EF8294BD738E4B8A

根據maxscale對用戶權限驗證的方式是直接采用後端數據庫服務的權限驗證,以及需要檢測主從角色,maxscale配置的用戶有下面幾個權限需求:

GRANT?replication?client?on?*.*?to?‘maxscale‘@‘maxscalehost‘;
GRANT?SELECT?ON?mysql.user?TO?‘maxscale‘@‘maxscalehost‘;
GRANT?SELECT?ON?mysql.db?TO?‘maxscale‘@‘maxscalehost‘;
GRANT?SELECT?ON?mysql.tables_priv?TO?‘maxscale‘@‘maxscalehost‘;
GRANT?SHOW?DATABASES?ON?*.*?TO?‘maxscale‘@‘maxscalehost‘;


Maxscale 功能簡單介紹