1. 程式人生 > >Mysql中間件Proxysql實現mysql主從架構讀寫分離

Mysql中間件Proxysql實現mysql主從架構讀寫分離

指標 yum源 check 查看 app 數據庫 進行 sql mysq

實驗主機

  • Master: 192.168.0.17
  • Slave: 192.168.0.20
  • Proxysql:192.168.0.30
    建議關閉防火墻
    建立Master: 192.168.0.17與Slave: 192.168.0.20的MySQL主從復制架構

Proxysql:192.168.0.30主機上基於yum安裝proxysql

[[email protected] ~ 20:21:05]#cat <<EOF | tee /etc/yum.repos.d/proxysql.repo
> [proxysql_repo]
> name= ProxySQL YUM repository
> baseurl=http://repo.proxysql.com/ProxySQL/proxysql-1.4.x/centos/\$releasever
> gpgcheck=1
> gpgkey=http://repo.proxysql.com/ProxySQL/repo_pub_key
> EOF

技術分享圖片

查看yum源配置是否成功
技術分享圖片
成功了可以開始安裝proxysql
yum install proxysql
技術分享圖片
用mysql工具進入proxy管理頁面

[[email protected] ~ 20:08:36]#mysql -uadmin -padmin -P6032 -h127.0.0.1

技術分享圖片
查看proxy的表
技術分享圖片
對表mysql_servers中插入主從節點信息,加載到RUNTIME,並保存到disk

MySQL [(none)]> insert into mysql_servers(hostgroup_id,hostname,port) values(10,‘192.168.0.17‘,3306);
MySQL[(none)]>insert into mysql_servers(hostgroup_id,hostname,port) values(10,‘192.168.0.20‘,3306);
MySQL [(none)]> load mysql servers to runtime;
MySQL [(none)]> save mysql servers to disk;

技術分享圖片
添加監控後端節點的用戶。ProxySQL通過每個節點的read_only值來自動調整它們是屬於讀組還是寫組

MariaDB [(none)]> grant replication client on *.* to [email protected]‘192.168.0.%‘ identified by ‘123‘;
MariaDB [(none)]> flush privileges;

技術分享圖片
ProxySQL上配置監控用戶,加載到RUNTIME,並保存到disk

MySQL [(none)]> set mysql-monitor_username=‘monitor‘;
MySQL [(none)]> set mysql-monitor_password=‘123‘;
MySQL [(none)]> load mysql variables to runtime;
MySQL [(none)]> save mysql variables to disk;

技術分享圖片
查看監控連接是否正常

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;

設置分組信息:
需要修改的是main庫中的mysql_replication_hostgroups表,該表有3個字段:writer_hostgroup,reader_hostgroup,comment, 指定寫組的id為10,讀組的id為20

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

讀組proxysql會自動根據my.cnf的read_only來判斷你是否是讀組自動更改
將mysql_replication_hostgroups表的修改加載到RUNTIME生效

MySQL> load mysql servers to runtime;
MySQL> save mysql servers to disk;

技術分享圖片
Monitor模塊監控後端的read_only值,按照read_only的值將節點自動移動到讀/寫組

MySQL> select hostgroup_id,hostname,port,status,weight from mysql_servers;

技術分享圖片
在master節點上創建訪問用戶

MariaDB [(none)]> grant all on *.* to [email protected]‘192.168.0.%‘ identified by ‘123‘;

MariaDB [(none)]> flush privileges;
技術分享圖片
在slave節點上創建訪問用戶

MariaDB [(none)]> grant all on *.* to [email protected]‘192.168.0.%‘ identified by ‘123‘;
MariaDB [(none)]> flush privileges;

技術分享圖片
在ProxySQL配置,將用戶sqluser添加到mysql_users表中, default_hostgroup默認組設置為寫組10,當讀寫分離的路由規則不符合時,會訪問默認組的數據庫

MySQL> insert into mysql_users(username,password,default_hostgroup) values(‘sqluser‘,‘123‘,10);
MySQL> load mysql users to runtime;
MySQL> save mysql users to disk;

技術分享圖片
使用sqluser用戶測試是否能路由到默認的10寫組實現讀、寫數據

mysql -usqluser –p123 -P6033 -h127.0.0.1 -e ‘select @@server_id‘
mysql -usqluser –p123 -P6033 -h127.0.0.1 -e ‘create database testdb‘
mysql -usqluser –p123 testdb -P6033 -h127.0.0.1 -e ‘create table t(id int)‘

技術分享圖片
在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> save mysql query rules to disk;

註意:因ProxySQL根據rule_id順序進行規則匹配,select ... for update規則的rule_id必須要小於普通的select規則的rule_id
技術分享圖片
測試讀操作是否路由給20的讀組

mysql -usqluser -pmagedu -P6033 -h127.0.0.1 -e ‘select @@server_id‘

技術分享圖片
測試寫操作,以事務方式進行測試

mysql -usqluser -pmagedu -P6033 -h127.0.0.1 -e ‘start transaction;select @@server_id;commit;select @@server_id‘

路由的信息:查詢stats庫中的stats_mysql_query_digest表

MySQL > SELECT hostgroup hg,sum_time, count_star, digest_text FROM stats_mysql_query_digest ORDER BY sum_time DESC;

技術分享圖片

Mysql中間件Proxysql實現mysql主從架構讀寫分離