天天看點

mysql 資料複制中間件_Mysql中間件應用之使用ProxySQL進行資料庫讀寫分離

這裡使用ProxySQL

兩個版本:官方版和percona版,

percona版是基于官方版基礎上修改,C++語言開發,輕量級但性能優異(支援處理千億級資料)

具有中間件所需的絕大多數功能,包括:

多種方式的讀/寫分離

定制基于使用者、基于schema、基于語句的規則對SQL語句進行路由

緩存查詢結果

後端節點監控

官方站點:https://proxysql.com/

官方手冊:https://github.com/sysown/proxysql/wiki

架構圖

mysql 資料複制中間件_Mysql中間件應用之使用ProxySQL進行資料庫讀寫分離

環境準備

實作讀寫分離前,先實作主從複制

注意:slave節點需要設定read_only=1

主機

系統

ip

ProxySQL

centos7

192.168.64.140

masterr

centos7

192.168.64.142

slave

centos7

192.168.64.143

1.實作142,143主從複制

142主

修改配置

vim /etc/my.cnf

[mysqld]

server_id=142

binlog_format=row 建議

檢視位置資訊

root:~ # mysql -e "show master logs;"

+------------------+-----------+

| Log_name | File_size |

+------------------+-----------+

| mysql-bin.000001 | 30343 |

| mysql-bin.000002 | 1038814 |

| mysql-bin.000003 | 245 |

| mysql-bin.000004 | 400 |

+------------------+-----------+

root:~ # systemctl start mariadb.service

root:~ # mysql -e "grant replication slave on *.* to repluser@'192.168.64.%' identified by 'centos';"

143從

修改配置

vim /etc/my.cnf

[mysqld]

server_id=143

read_only #必須加,ProxySQL通過此來判斷誰是讀伺服器

配置同步資訊

mysql>CHANGE MASTER TO

MASTER_HOST='192.168.64.142',

MASTER_USER='repluser',

MASTER_PASSWORD='centos',

MASTER_PORT=3306,

MASTER_LOG_FILE='mysql-bin.000004',

MASTER_LOG_POS=400;

啟動複制thread

mysql>start slave;

mysql>show slave status\G

主從已搭建完畢

MariaDB [(none)]> show slave status\G

*************************** 1. row ***************************

Slave_IO_State: Waiting for master to send event

Master_Host: 192.168.64.142

Master_User: repluser

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: mysql-bin.000006

Read_Master_Log_Pos: 245

Relay_Log_File: localhost-relay-bin.000007

Relay_Log_Pos: 529

Relay_Master_Log_File: mysql-bin.000006

Slave_IO_Running: Yes #線程都已開啟

Slave_SQL_Running: Yes

............

Master_Server_Id: 142

1 row in set (0.00 sec)

2.配置ProxySQL

1.ProxySQL安裝(需yum源)

cat <

[proxysql_repo]

name= ProxySQL YUM repository

baseurl=http://repo.proxysql.com/ProxySQL/proxysql1.4.x/centos/\$releasever

gpgcheck=1

gpgkey=http://repo.proxysql.com/ProxySQL/repo_pub_key

EOF

root:~ # yum clean all

root:~ # yum repolist

proxysql_repo/7 ProxySQL YUM repository 15

root:~ # yum install -y proxysql mariadb

root:~ # rpm -ql proxysql

/etc/init.d/proxysql #啟動腳本

/etc/proxysql.cnf #配置檔案

/usr/bin/proxysql #啟動程式

/usr/share/proxysql/tools/proxysql_galera_checker.sh

/usr/share/proxysql/tools/proxysql_galera_writer.pl

2.配置ProxySQL

資料庫說明:

main 是預設的”資料庫”名,表裡存放後端db執行個體、使用者驗證、路由規則等資訊。

表名以 runtime開頭的表示proxysql目前運作的配置内容,不能通過dml語句修改,

隻能修改對應的不以 runtime 開頭的(在記憶體)裡的表,然後 LOAD 使其生效,

SAVE 使其存到硬碟以供下次重新開機加載

disk 是持久化到硬碟的配置,sqlite資料檔案

stats 是proxysql運作抓取的統計資訊,包括到後端各指令的執行次數、流量、

processlist、查詢種類彙總/執行時間,等等

monitor 庫存儲 monitor 子產品收集的資訊,主要是對後端db的健康/延遲檢查

1.添加監控節點

root:~ # mysql -uadmin -padmin -P6032 -h127.0.0.1 #連接配接至本機ProxySQL的資料庫

MySQL [(none)]> insert into mysql_servers(hostgroup_id,hostname,port) values(10,'192.168.64.142',3306);

MySQL [(none)]> insert into mysql_servers(hostgroup_id,hostname,port) values(10,'192.168.64.143',3306);

MySQL [(none)]> select * from mysql_servers;

mysql 資料複制中間件_Mysql中間件應用之使用ProxySQL進行資料庫讀寫分離

2.添加監控後端節點的使用者。ProxySQL通過每個節點的read_only值來自動調整它們是屬于讀組還是寫組

在master142上執行

MySQL> grant replication client on *.* to monitor@'192.168.8.%' identified by 'centos';

ProxySQL上配置監控

MySQL [(none)]> set mysql-monitor_username='monitor';

MySQL [(none)]> set mysql-monitor_password='centos';

加載到RUNTIME,并儲存到disk

MySQL [(none)]> load mysql variables to runtime;

MySQL [(none)]> save mysql variables to disk;

監控子產品的名額儲存在monitor庫的log表中

檢視監控連接配接是否正常的 (對connect名額的監控):(如果connect_error的結果為NULL則表示正常)

MySQL> select * from mysql_server_connect_log;

檢視監控心跳資訊 (對ping名額的監控):

MySQL> select * from mysql_server_ping_log;

檢視read_only和replication_lag的監控日志

MySQL> select * from mysql_server_read_only_log;

MySQL> select * from mysql_server_replication_lag_log;

3.設定分組

需要修改的是main庫中的mysql_replication_hostgroups表,該表有3個字段:

writer_hostgroup,reader_hostgroup,comment, 指定寫組的id為10,讀組的id為20

MySQL> insert into mysql_replication_hostgroups values(10,20,"test");

将mysql_replication_hostgroups表的修改加載到RUNTIME生效

MySQL> load mysql servers to runtime;

MySQL> save mysql servers to disk;

MySQL [(none)]> select * from mysql_servers;

mysql 資料複制中間件_Mysql中間件應用之使用ProxySQL進行資料庫讀寫分離

4.配置發送SQL語句的使用者

在master節點上建立通路使用者

MySQL> grant all on *.* to sqluser@'192.168.64.%' identified by 'fscx';

在ProxySQL配置,将使用者sqluser添加到mysql_users表中, default_hostgroup預設

組設定為寫組10,當讀寫分離的路由規則不符合時,會通路預設組的資料庫

MySQL> insert into mysql_users(username,password,default_hostgroup)values('sqluser','fscx',10);

MySQL> load mysql users to runtime;

MySQL> save mysql users to disk;

使用sqluser使用者測試是否能路由到預設的10寫組實作讀、寫資料

mysql -usqluser -pfscx -P6033 -h127.0.0.1 -e 'select @@server_id'

mysql -usqluser -pfscx -P6033 -h127.0.0.1 -e 'create database testdb'

mysql -usqluser -pfscx testdb -P6033 -h127.0.0.1 -e 'create table t(id int)

mysql 資料複制中間件_Mysql中間件應用之使用ProxySQL進行資料庫讀寫分離

5.在proxysql上配置路由規則,實作讀寫分離

與規則有關的表:mysql_query_rules和mysql_query_rules_fast_routing,後者是前者的擴充表,1.4.7之後支援

插入路由規則:将select語句分離到20的讀組,select語句中有一個特殊語句

SELECT...FOR UPDATE它會申請寫鎖,應路由到10的寫組

MySQL> insert into mysql_query_rules

(rule_id,active,match_digest,destination_hostgroup,apply)VALUES

(1,1,'^SELECT.*FOR UPDATE$',10,1),(2,1,'^SELECT',20,1);

MySQL> load mysql query rules to runtime;

MySQL> load mysql query rules to runtime;

注意:因ProxySQL根據rule_id順序進行規則比對,select ... for update規則的

rule_id必須要小于普通的select規則的rule_id

6.用戶端測試

測試讀操作是否路由給20的讀組

mysql 資料複制中間件_Mysql中間件應用之使用ProxySQL進行資料庫讀寫分離

測試寫操作,以事務方式進行測試

mysql 資料複制中間件_Mysql中間件應用之使用ProxySQL進行資料庫讀寫分離