基於maxscale的讀寫分離部署筆記

  • 2019 年 10 月 5 日
  • 筆記

使用maxscale搭建的讀寫分離架構,後期還可以再結合MHA做master的故障轉移,這樣業務層面上不需要做任何的改動即可。

基於connect方式的不要使用。從庫延遲他還會繼續分發請求過去,暫時不適合生產使用。

實驗演示:

目前的主從結構:

node93     10.1.20.93 master

node94  10.1.20.94 slave

node95  10.1.20.95 slave

node96  10.1.20.96 maxscale

先在master主庫上創建相關的賬戶:

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

創建監控用戶,用於[MySQL Monitor]段的配置中:

> create database maxscale_schema ;    # maxscale監控用的心跳信息會寫到這個庫裏面

> create user scalemon@'%' identified by"111111";

> grant replication slave, replication client on*.* to scalemon@'%';

> grant all on maxscale_schema.* to scalemon@'%';

創建路由用戶,用於[Read-Write Service]段的配置中:

> create user maxscale@'%' identified by"111111";

> grant select on mysql.* to maxscale@'%';

maxscale 部署:

rpm -ivh maxscale-2.0.5-1.rhel.6.x86_64.rpm

主要生成文件如下:

/etc/maxscale.cnf

/etc/maxscale.cnf.template

/usr/bin/cdc.py

/usr/bin/cdc_kafka_producer.py

/usr/bin/cdc_last_transaction.py

/usr/bin/cdc_users.py

/usr/bin/maxadmin

/usr/bin/maxavrocheck

/usr/bin/maxbinlogcheck

/usr/bin/maxkeys

/usr/bin/maxpasswd

/usr/bin/maxscale

/var

/var/lib

/var/lib/maxscale

創建秘鑰文件:

[root@maxscale /root ]# maxkeys /var/lib/maxscale

生成加密後的密碼:

[root@maxscale /root ]# maxpasswd/var/lib/maxscale/.secrets 123456

上面劃掉的這2步驟我們用不到,直接在配置文件/etc/maxscale.cnf里寫上明文密碼就行了。(這裡踩了坑,配置這個參數,導致後面maxscale起來後,無法連接到其他庫提示access denied)

vim/etc/security/limits.conf:

    * softnofile 65535 

    * hardnofile 65535

vim/etc/sysctl.conf :

    fs.file-max=655350

    net.ipv4.ip_local_port_range= 1025 65000

    net.ipv4.tcp_tw_reuse= 1

修改完內和參數後,需要重啟下服務器。

修改配置文件:

cat /etc/maxscale.cnf

[maxscale]

threads=auto

ms_timestamp=1             #timestamp精度

syslog=1                   #將日誌寫入到syslog中

maxlog=1                   #將日誌寫入到maxscale的日誌文件中

log_to_shm=0               #不將日誌寫入到共享緩存中,開啟debug模式時可打開加快速度

log_warning=1              #記錄告警信息

log_notice=1               #記錄notice 

log_info=1                 #記錄info 

log_debug=0                #不打開debug模式

log_augmentation=1         #日誌遞增

# Server definitions

#

# Set the address of the server to the network

# address of a MySQL server.

#

# 需要把master和slave地址都配上,maxscale會自動分辨出哪個是master和slave

[server1]

type=server

address=10.1.20.93

port=3306

protocol=MySQLBackend

[server2]

type=server

address=10.1.20.94

port=3306

protocol=MySQLBackend

[server3]

type=server

address=10.1.20.95

port=3306

protocol=MySQLBackend

# Monitor for the servers

#

# This will keep MaxScale aware of the state of theservers.

# MySQL Monitor documentation:

# https://github.com/mariadb-corporation/MaxScale/blob/master/Documentation/Monitors/MySQL-Monitor.md

[MySQL Monitor]

type=monitor

module=mysqlmon

servers=server1,server2,server3    # 這裡要把全部server都寫上,以便maxscale去監測

user=scalemon 

passwd=111111  

monitor_interval=10000    # 每隔10s檢查一次

detect_replication_lag=true     # 檢查複製延遲的情況

detect_stale_master=true       # 當所有的slave都不可用時,select查詢請求會轉發到master。

# Service definitions

#

# Service Definition for a read-only service and

# a read/write splitting service.

#

# ReadConnRoute documentation:

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

由於我們使用了 [Read-Write Service],可以刪除另一個服務[Read-Only Service],注釋掉下面整塊兒內容即可。

# 需要把master和slave地址都配上

#[Read-Only Service]

#type=service

#router=readconnroute

#servers=server1,server2,server3

#user=maxscale           # 讀寫分離的賬戶和密碼

#passwd=111111           # 讀寫分離的賬戶和密碼

#router_options=slave

# ReadWriteSplit documentation:

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

# 配置的讀寫分離,需要把master和slave地址都配上

[Read-Write Service]

type=service

router=readwritesplit

servers=server1,server2,server3

user=maxscale        # 讀寫分離的賬戶和密碼

passwd=111111       # 讀寫分離的賬戶和密碼

max_slave_connections=100%         # 所有的slave提供select查詢服務

max_slave_replication_lag = 5      # slave超時5秒,就把請求轉發到其他slave

use_sql_variables_in = all         #

# This service enables the use of the MaxAdmininterface

# MaxScale administration guide:

#https://github.com/mariadb-corporation/MaxScale/blob/master/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

啟動maxscale:

maxscale -f/etc/maxscale.cnf

ss -lnt 可以看到4006端口啟動了。

可以使用之前的業務賬號連接到maxscale的4006端口上,例如:

mysql -utest -ptest -P 4006 -h 10.1.20.96 

注意begin;select @@hostname;commit;這種的select會在主庫上執行。此外,執行存儲過程或者函數時候也是會自動在主庫去執行的。

執行SQL > begin;select@@hostname; commit; insert into t2 select 3; select @@hostname; 對應的在/var/log/maxscale/maxscale.log記錄如下:

很明顯的可以看:開啟事務、插入等操作會被轉發到主庫去處理。而單純的select則會被轉發到某個從庫去處理。

maxscale不能對master進行故障切換,可以配合使用MHA來進行。MHA的故障切換後,maxscale可以自動識別哪台機器是master。然後自動將求發送到新的主從結構中。

maxscale的延遲檢測:

和pt-heartbeat的原理類似。maxscale會對master和slave上replication_heartbeat表的master_timestamp時間戳進行對比,相減得出差異。這個差異就是MySQL主從同步的延遲值。

select * frommaxscale_schema.replication_heartbeat;

從庫故障或延遲過大會被自動剔除:

我們可以在192.168.2.12上stop slave; 稍等片刻,再執行查詢操作的話,會發現請求不會被轉發到192.168.2.12的mysql上,maxscale裏面自動將這個機器踢下線了。如下圖:

192.168.2.12 出現延遲,則在maxscale日誌顯示如下:

192.168.2.12 的3306端口不通(可能mysqld掛掉或者服務器宕機),則在maxscale日誌顯示如下:

其他後補充進筆記的,管理maxscale的一些命令:

maxadmin -S /tmp/maxadmin.sock