MySQL-第十一章-读写分离(ProxySQL)

目录

1. ProxySQL介绍

2. ProxySQL结构

3. 安装配置

4. ProxySQL中管理结构自带系统库

5. ProxySQL管理接口的多层配置关系

6. 在不同层次间移动配置

6.1 user相关配置

6.2 server 相关配置

6.3 mysql query rules配置

6.4 MySQL variables配置

6.5 总结

7.  ProxySQL应用—基于SQL的读写分离

7.0 从库设定read_only参数

7.1 在mysql_replication_hostgroup表中,配置读写组编号

7.2 添加主机到ProxySQL

7.3 创建监控用户,并开启监控

7.4 配置应用用户

7.5 实用的读写规则

7.6 测试读写分离

8. ProxySQL应用扩展——花式路由规则

8.1 基于端口的路由

8.2 基于用户的路由


1. ProxySQL介绍

ProxySQL是基于MySQL的一款开源的中间件的产品,是一个灵活的MySQL代理层,可以实现读写分离,支持 Query路由功能,支持动态指定某个SQL进行缓存,

支持动态加载配置信息(无需重启 ProxySQL 服务),支持故障切换和SQL的过滤功能。

相关 ProxySQL 的网站:

https://www.proxysql.com/

https://github.com/sysown/proxysql/wiki

2. ProxySQL结构

3. 安装配置

# 下载proxySQL

https://proxysql.com/
https://github.com/sysown/proxysql/releases

# 安装proxySQL

[root@db03 ~]# rpm -ivh proxysql-2.0.10-1-centos7.x86_64.rpm
[root@db03 ~]# systemctl start proxysql
[root@db03 ~]# netstat -tulnp
tcp        0      0 0.0.0.0:6032            0.0.0.0:*               LISTEN      2115/proxysql
tcp        0      0 0.0.0.0:6033            0.0.0.0:*               LISTEN      2115/proxysql

# 登录测试

[root@db03 ~]# mysql -uadmin -padmin -h127.0.0.1 -P6032

4. ProxySQL中管理结构自带系统库

在ProxySQL,6032端口共五个库: main、disk、stats 、monitor、stats_history

main: 

    main 库中有如下信息:

         mysql_servers: 后端可以连接 MySQL 服务器的列表

         mysql_users:   配置后端数据库的账号和监控的账号。

         mysql_query_rules: 指定 Query 路由到后端不同服务器的规则列表。

         mysql_replication_hostgroups : 节点分组配置信息

注: 表名以 runtime_开头的表示ProxySQL 当前运行的配置内容,不能直接修改。不带runtime_是下文图中Mem相关的配置。

disk :

    持久化的磁盘的配置

stats: 

    统计信息的汇总

monitor:

    监控的收集信息,比如数据库的健康状态等

stats_history:

    ProxySQL 收集的有关其内部功能的历史指标

5. ProxySQL管理接口的多层配置关系

整套配置系统分为三层:

顶层   RUNTIME

中间层 MEMORY  (主要修改的配置表)

持久层 DISK 和 CFG FILE

--------------------------------------------------------------------

RUNTIME:

         代表 ProxySQL 当前正在使用的配置,无法直接修改此配置,必须要从下一层 (MEM层)“load” 进来。

MEMORY:

MEMORY 层上面连接 RUNTIME 层,下面disk持久层。这层可以在线操作 ProxySQL

配置,随便修改,不会影响生产环境。确认正常之后在加载达到RUNTIME 和持久化的磁盘上。修改方法: insert、update、delete、select。

DISK和CONFIG FILE:

         持久化配置信息。重启时,可以从磁盘快速加载回来

6. 在不同层次间移动配置

LOAD xxxx  TO RUNTIME;
SAVE xxxx  TO DISK;

为了将配置持久化到磁盘或者应用到 runtime,在管理接口下有一系列管理命令来实现它们。

6.1 user相关配置

##  MEM 加载到runtime
LOAD MYSQL USERS TO RUNTIME;
##  runtime 保存至 MEM
SAVE MYSQL USERS TO MEMORY;
## disk 加载到 MEM
LOAD MYSQL USERS FROM DISK;
## MEM  到 disk 
SAVE MYSQL USERS TO DISK;
## CFG 到 MEM
LOAD MYSQL USERS FROM CONFIG

6.2 server 相关配置

##  MEM 加载到runtime
LOAD MYSQL SERVERS TO RUNTIME;
##  runtime 保存至 MEM
SAVE MYSQL SERVERS TO MEMORY;
## disk 加载到 MEM
LOAD MYSQL SERVERS FROM DISK;
## MEM  到 disk 
SAVE MYSQL SERVERS TO DISK;
## CFG 到 MEM
LOAD MYSQL SERVERS FROM CONFIG

6.3 mysql query rules配置

##  MEM 加载到runtime
LOAD MYSQL QUERY RULES TO RUNTIME;
##  runtime 保存至 MEM
SAVE MYSQL QUERY RULES TO MEMORY;
## disk 加载到 MEM
LOAD MYSQL QUERY RULES FROM DISK;
## MEM  到 disk 
SAVE MYSQL QUERY RULES TO DISK;
## CFG 到 MEM
LOAD MYSQL QUERY RULES FROM CONFIG

6.4 MySQL variables配置

##  MEM 加载到runtime
LOAD MYSQL VARIABLES TO RUNTIME;
##  runtime 保存至 MEM
SAVE MYSQL VARIABLES TO MEMORY;
## disk 加载到 MEM
LOAD MYSQL VARIABLES FROM DISK;
## MEM  到 disk 
SAVE MYSQL VARIABLES TO DISK;
## CFG 到 MEM
LOAD MYSQL VARIABLES FROM CONFIG

6.5 总结

总结:

    日常配置其实大部分时间在MEM配置,然后load到RUNTIME,然后SAVE到DIsk。cfg很少使用。

    例如 :

    load xxx to runtime;

    save xxx to disk;

    

注意:

    只有load到 runtime 状态时才会验证配置。在保MEM或disk时,都不会发生任何警告或错误。当load到 runtime 时,如果出现错误,将恢复为之前保存得状态,这时可以去检查错误日志。 

7.  ProxySQL应用—基于SQL的读写分离

7.0 从库设定read_only参数

set global read_only=1;
set global super_read_only=1;

7.1 在mysql_replication_hostgroup表中,配置读写组编号

[root@db03 ~]# mysql -uadmin -padmin -h127.0.0.1 -P6032
insert into 
mysql_replication_hostgroups 
(writer_hostgroup, reader_hostgroup, comment) 
values (10,20,'proxy');
    
load mysql servers to runtime;
save mysql servers to disk;

db03 [main]>select * from mysql_replication_hostgroups\G
    *************************** 1. row ***************************
    writer_hostgroup: 10
    reader_hostgroup: 20
          check_type: read_only
             comment: proxy
    1 row in set (0.00 sec)

说明:

    ProxySQL 会根据server 的read_only 的取值将服务器进行分组。 read_only=0 的server,master被分到编号为10的写组,read_only=1 的server,slave则被分到编号20的读组。所以需要将从库设置:set global read_only=1;

7.2 添加主机到ProxySQL

insert into mysql_servers(hostgroup_id,hostname,port) values (10,'10.0.0.51',3306);
insert into mysql_servers(hostgroup_id,hostname,port) values (20,'10.0.0.52',3306);
insert into mysql_servers(hostgroup_id,hostname,port) values (20,'10.0.0.53',3306);

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

7.3 创建监控用户,并开启监控

# 主库创建监控用户
    create user monitor@'%' identified with mysql_native_password  by '123';
    grant replication client on *.* to monitor@'%';
    
# proxySQL修改variables表
    set mysql-monitor_username='monitor';
    set mysql-monitor_password='123';
    
    或者 : 
    UPDATE global_variables SET variable_value='monitor'
    WHERE variable_name='mysql-monitor_username';
    UPDATE global_variables SET variable_value='123'
    WHERE variable_name='mysql-monitor_password';
     
     
load mysql variables to runtime;
save mysql variables to disk;
    
# 查询监控日志
    db03 [(none)]>select * from mysql_server_connect_log;
    db03 [(none)]>select * from mysql_server_ping_log; 
    db03 [(none)]>select * from mysql_server_read_only_log;
    db03 [(none)]>select * from mysql_server_replication_lag_log;

7.4 配置应用用户

# 主库
    create user root@'%' identified with mysql_native_password  by '123';
    grant all on *.* to root@'%';
    
# proxysql 
    insert into mysql_users(username,password,default_hostgroup) values('root','123',10);
    
    load mysql users to runtime;
    save mysql users to disk;
    
早期版本,需要开启事务持续化。
    update mysql_users set transaction_persistent=1 where username='root';
    load mysql users to runtime;
    save mysql users to disk;

7.5 实用的读写规则

insert into mysql_query_rules(rule_id,active,match_pattern,destination_hostgroup,apply) values (1,1,'^select.*for update$',10,1);
insert into mysql_query_rules(rule_id,active,match_pattern,destination_hostgroup,apply) values (2,1,'^select',20,1);
load mysql query rules to runtime;
save mysql query rules to disk;
    
注: select … for update规则的rule_id必须要小于普通的select规则的rule_id,ProxySQL是根据rule_id的顺序进行规则匹配。

7.6 测试读写分离

[root@db03 ~]#  mysql -uroot -p123  -P 6033 -h 127.0.0.1 -e "begin;select @@server_id;commit"

[root@db03 ~]#  mysql -uroot -p123  -P 6033 -h 127.0.0.1 -e "select @@server_id;"
db03 [(none)]>select * from stats_mysql_query_digest\G

8. ProxySQL应用扩展——花式路由规则

8.1 基于端口的路由

## 修改ProxySQL监听SQL流量的端口号,监听多端口上。
set mysql-interfaces='0.0.0.0:6033;0.0.0.0:6034';
save mysql variables to disk;
## 重启生效
systemctl restart proxysql

## 设定路由规则
delete from mysql_query_rules;      # 为了测试,先清空已有规则

insert into mysql_query_rules(rule_id,active,proxy_port,destination_hostgroup,apply) 
values(1,1,6033,10,1), (2,1,6034,20,1);

load mysql query rules to runtime;
save mysql query rules to disk;

说明:除了基于端口进行分离,还可以基于监听地址(修改字段proxy_addr即可),也可以基于客户端地址(修改字段client_addr字段即可)。

8.2 基于用户的路由

Insert into mysql_users(username,password,default_hostgroup) 
values('writer','123',10),('reader','123',20);
load mysql users to runtime;
save mysql users to disk;

delete from mysql_query_rules;      # 为了测试,先清空已有规则

insert into mysql_query_rules(rule_id,active,username,destination_hostgroup,apply) 
values(1,1,'writer',10,1),(2,1,'reader',20,1);

load mysql query rules to runtime;
save mysql query rules to disk;
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要使用 ProxySQL 配置 MySQL读写分离,可以按照以下步骤进行操作: 1. 安装 ProxySQL:首先,你需要安装 ProxySQL 的软件。你可以从 ProxySQL 的官方网站下载适用于你的操作系统的安装程序,并按照官方文档中的说明进行安装。 2. 配置主服务器和从服务器:在主服务器和从服务器上进行以下配置: - 确保主服务器和从服务器都已正确配置和运行,并且数据库实例正常工作。 - 确保主服务器和从服务器都可以通过网络连接到 ProxySQL。 3. 连接到 ProxySQL:使用以下命令连接到 ProxySQL 的命令行界面: ``` mysql -u admin -p -h proxy_server_ip -P proxy_server_port --prompt='ProxySQLAdmin>' ``` 将 "admin" 替换为 ProxySQL 的管理员用户名,将 "proxy_server_ip" 替换为 ProxySQL 服务器的 IP 地址,将 "proxy_server_port" 替换为 ProxySQL 服务器的端口号。 4. 添加主服务器和从服务器:在 ProxySQL 的命令行界面中,使用以下命令添加主服务器和从服务器: ``` INSERT INTO mysql_servers (hostgroup_id, hostname, port) VALUES (1, 'master_server_ip', 3306); INSERT INTO mysql_servers (hostgroup_id, hostname, port) VALUES (2, 'slave_server_ip', 3306); ``` 将 "master_server_ip" 替换为主服务器的 IP 地址,将 "slave_server_ip" 替换为从服务器的 IP 地址。 5. 添加主从关系:在 ProxySQL 的命令行界面中,使用以下命令添加主从关系: ``` INSERT INTO mysql_replication_hostgroups (writer_hostgroup, reader_hostgroup) VALUES (1, 2); ``` 这将指定主服务器和从服务器的关系,其中 "writer_hostgroup" 是主服务器的组 ID,"reader_hostgroup" 是从服务器的组 ID。 6. 保存更改并重新加载配置:在 ProxySQL 的命令行界面中,使用以下命令保存更改并重新加载配置: ``` LOAD MYSQL SERVERS TO RUNTIME; SAVE MYSQL SERVERS TO DISK; LOAD MYSQL SERVERS TO RUNTIME; SAVE MYSQL SERVERS TO DISK; ``` 7. 配置应用程序:在应用程序的数据库连接配置中,将读操作的请求连接到 ProxySQL 服务器的 IP 地址和端口号。 请注意,上述步骤仅提供了一个基本的配置示例,你可能需要根据你的环境和需求进行调整。此外,ProxySQL 还提供了许多其他的功能和配置选项,如负载均衡、故障转移等。你可以参考 ProxySQL 的官方文档以了解更多详细信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CN-FuWei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值