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 功能簡單介紹