1. 程式人生 > >MHA+ProxySQL 讀寫分離高可用

MHA+ProxySQL 讀寫分離高可用

源碼包 技術 ups 修改 only date creat 臟讀 登陸

文檔結構如下:

技術分享圖片

1、ProxySQL說明

ProxySQL是mysql的一款中間件的產品,是靈活的mysql代理層,可以實現讀寫分離,支持query路由器的功能,支持動態指定sql進行緩存,支持動態加載配置,故障切換和一些sql的過濾功能。

其他產品:Dbproxy,MyCAT,OneProxy等。

2、MHA+Proxysql 讀寫分離實驗

2.1. 安裝步驟

IP

角色

操作系統

版本

172.16.10.21

Proxysql

Redhat6.7

1.4.9

172.16.10.32

Master

Redhat6.7

5.7.20

172.16.10.34

Slave1

Redhat6.7

5.7.20

172.16.10.36

Salve2

Redhat6.7

5.7.20

172.16.10.30

VIP

從庫開啟read_only=1,主庫read_only=0

ProxySQL安裝源碼包:

yum -y install perl-DBD-MYSQL perl-DBI perl-Time-Hires perl-IO-Socket-ssl

或者簡單粗暴的 :yum -y install perl*

proxySQL軟件包下載地址:

https://www.percona.com/downloads/proxysql/

安裝proxysql

rpm -ivh proxysql-1.4.9-1.1.el6.x86_64.rpm

配置文件路徑為:/etc/proxysql.cnf

啟動proxysql

service proxysql start

技術分享圖片

netstat -anlp |grep proxysql

技術分享圖片

6032是管理端口,6033是對外服務的端口號

用戶名和密碼默認都是admin

使用幫助如下:

技術分享圖片

查看proxysql 安裝庫情況:

mysql -uadmin -padmin -h127.0.0.1 -P6032

技術分享圖片

2.2. Proxysql庫說明

Proxysql 版本1.4.9-percona-1.1實例:

Main:內存配置數據庫,即memory,表裏存放後端db實例,用戶驗證,路由規則等信息。Main庫中有如下信息:

技術分享圖片

mysql_servers --後端可以連接mysql服務器的列表

mysql_users --配置後端數據庫的賬號和監控的賬號

mysql_query_rules --指定query路由到後端不同服務器的規則列表

disk庫:持續化磁盤的配置。

Stats庫:統計信息的匯總。

Monitor庫:一些監控的收集信息,包括數據庫的健康狀態。

2.3. 配置proxysql監控

https://github.com/sysown/proxysql/wiki/Configuring-ProxySQL

頂層為runtime,中間層為memory,底層也就是持久層disk和config file。

技術分享圖片

Runtime:代表Proxysql當前生效的正在使用的配置,無法直接修改這裏的配置,必須要從下一層load進來。

Memory:memory層上面連接runtime層,下面連接持久化層。在這層可以正常操作Proxysql配置,隨便修改,不會影響生產環境。修改一個配置一般都是現在memory層完成,確認正常後在加載到runtime和持久化到磁盤。

Disk和config file:持久化配置信息,重啟後內存的配置信息會丟失,所以需要將配置信息保留在磁盤中。重啟時,可以從磁盤快速加載回來。

1為寫組,2為讀組。

insert into mysql_servers(hostgroup_id,hostname,port) values(10,‘172.16.10.32‘,3307);

insert into mysql_servers(hostgroup_id,hostname,port) values(10,‘172.16.10.34‘,3307);

insert into mysql_servers(hostgroup_id,hostname,port) values(10,‘172.16.10.36‘,3307);

select * from mysql_servers;

技術分享圖片

配置監控賬戶:

create user ‘mon‘@‘172.16.10.%‘ IDENTIFIED BY ‘mon‘;

GRANT all privileges ON *.* TO ‘mon‘@‘172.16.10.%‘ with grant option;

對外訪問賬戶:

create user ‘wr‘@‘172.16.10.%‘ IDENTIFIED BY ‘wr‘;

GRANT all privileges ON *.* TO ON *.* TO ‘wr‘@‘172.16.10.%‘ with grant option;

配置Proxysql監控:

set mysql-monitor_username=‘mon‘;

set mysql-monitor_password=‘mon‘;

load mysql servers to runtime;

save mysql servers to disk;

技術分享圖片

之後驗證監控信息:

select * from monitor.mysql_server_connect_log limit 6;

技術分享圖片

select * from monitor.mysql_server_ping_log order by time_start_us limit 6;

技術分享圖片

監控信息提示正常。

2.4. 配置Proxysql主從分區信息

配置主從分區需要用到mysql_replication_hostgroups

show create table mysql_replication_hostgroups\G;

技術分享圖片

writer_hostgroup 寫入組的編號

reader_hostgroup 讀取組的編號

實驗使用10作為寫入組,20作為讀取組。

insert into mysql_replication_hostgroups values(10,20,‘proxy‘);

load mysql servers to runtime;

save mysql servers to disk;

select * from mysql_replication_hostgroups;

技術分享圖片

Proxysql 會根據server的read_only的取值將服務進行分組,read_only=0的server,master被分到編號為10的組,read_only=1的server,slave則被分到編號為20的讀組。

select * from mysql_servers;

技術分享圖片

Mysql_users表中的 transaction_persistent字段默認為0,建議在創建完用戶之後設置為1,避免發生臟讀幻讀等現象:

insert into mysql_users(username,password,default_hostgroup) values(‘wr‘,‘wr‘,10);

update mysql_users set transaction_persistent=1 where username=‘wr‘;

load mysql users to runtime;

save mysql users to disk;

測試登陸(端口6033):

mysql -uwr -pwr -h 172.16.10.34 -P3307 -e "show slave status\G"

技術分享圖片

2.5. 配置讀寫分離策略

配置讀寫分離使用的表mysql_query_rules:

match_pattern:字段就是代表設置的規則。

destination_hostgroup:字段代表默認指定的分組。

apply代表真正執行應用規則。

insert into mysql_query_rules(active,match_pattern,destination_hostgroup,apply) values(1,‘^SELECT.*FOR UPDATE$‘,10,1);

insert into mysql_query_rules(active,match_pattern,destination_hostgroup,apply) values(1,‘^SELECT‘,20,1);

LOAD MYSQL QUERY RULES TO RUNTIME;

SAVE MYSQL QUERY RULES TO DISK;

2.6. 測試讀寫分離

通過wr所創建的賬戶連接Proxysql登陸數據庫。

mysql -uwr -pwr -h172.16.10.21 -P6033

技術分享圖片

技術分享圖片

通過管理端口登陸查看:

mysql -uadmin -padmin -h127.0.0.1 -P6032

select * from stats_mysql_query_digest;

技術分享圖片

可以得知,select count(*) from t; 這條語句自動編號到20的讀組上,即slave上。

測試update。

技術分享圖片

技術分享圖片

測試update語句在10的寫組上。

2.7. 讀寫分離權重調整

讀寫分離設置成功後,可以調節權重,如slave2(172.16.10.36)多進行讀操作。

update mysql_servers set weight=10 where hostname=‘172.16.10.36‘;

load mysql servers to runtime;

load mysql variables to runtime;

load mysql users to runtime;

save mysql servers to disk;

save mysql variables to disk;

save mysql users to disk;

技術分享圖片

select * from mysql_servers;

技術分享圖片

2.8. MHA failover測試

測試前:

Master 172.16.10.32為master,組數為10,寫組。

Failover後:

技術分享圖片

新的master為172.16.10.34(原slave1)

select * from runtime_mysql_servers;

技術分享圖片

新的master為寫組(10),原為20讀組。

進行讀寫分離測試:

技術分享圖片

發現讀寫分離仍然成功(回切後也成功)。

技術分享圖片

MHA+ProxySQL 讀寫分離高可用