MySQL运维实战之ProxySQL(9.3)使用ProxySQL实现读写分离

俊达2年前技术文章996


proxysql读写分离主要通过mysql_query_rules表中的规则来实现。


下面是具体的配置步骤:

hostgroup配置

insert into mysql_servers (
  hostgroup_id, hostname, port, max_replication_lag)
values ( 100, '172.16.121.236', 3380, 3);

insert into mysql_servers (
  hostgroup_id, hostname, port, max_replication_lag)
values ( 101, '172.16.121.237', 3380, 3);


load mysql servers  to runtime; 
SAVE MYSQL servers  TO DISK;


user配置

后端服务器创建用户

mysql> create user 'user1'@'%' identified by 'user1-backend';
Query OK, 0 rows affected (0.02 sec)

mysql> grant all privileges on *.* to 'user1'@'%';
Query OK, 0 rows affected (0.02 sec)


proxysql上配置用户信息

insert into mysql_users
(username, password, transaction_persistent, backend, frontend, comment)
values ('user1', 'user1-backend', 1, 1, 1, 'backend user for user1');



load mysql users  to runtime; 
SAVE MYSQL users  TO DISK;


用户表字段说明:

字段

描述

username

用户名。

password

账号密码。可以使用明文,或者使用hash。若后端账号使用caching_sha2_password,则需要使用明文密码

use_ssl

是否开启ssl

default_hostgroup

默认hostgroup

default_schema

默认schema

schema_locked

暂时不支持

transaction_persistent

设置为1时,如果连接开启了事务,则该连接后续的SQL转发给同一个hostgroup。读写分离场景下,通常需要将事务中的SELECT查询转发到主库,以保证事务一致性,可以将transaction_persistent设置为1。该字段默认为1

fast_forward

设置为1时,绕过query路由选择,直接将SQL转发到指定hostgroup。

backend

设置为1时,表示该账号是后端账号

frontend

设置为1时,表示该账号是前端账号

max_connections

后端连接池

comment

描述



mysql 8.0 caching_sha2_password

如果后端mysql版本是8.0,并且后端账号使用了caching_sha2_password插件认证,则需要这样配置:

1、admin-hash_passwords设置为false

 set admin-hash_passwords=1;

-- 加载 & 持久化配置项 
 LOAD ADMIN VARIABLES to runtime;
 save ADMIN VARIABLES to disk;

 -- 确认配置生效
 mysql> select * from runtime_global_variables where variable_name = 'admin-hash_passwords';
+----------------------+----------------+
| variable_name        | variable_value |
+----------------------+----------------+
| admin-hash_passwords | false           |
+----------------------+----------------+



2、mysql_users表的password字段写入账号明文

load mysql users to runtime;
save mysql users to disk;


-- 确认runtime_mysql_users表中的密码是明文
mysql> select username, password from runtime_mysql_users where username = 'user1';
+----------+---------------+
| username | password      |
+----------+---------------+
| user1    | user1-backend |


配置读写分离规则

insert into mysql_query_rules
(rule_id, username, match_pattern, destination_hostgroup,active, apply, comment )
values (101, 'user1', '^SELECT.*FOR UPDATE$', 100,1,1, 'user1 route to hostgroup 100');

insert into mysql_query_rules
(rule_id, username, match_pattern, destination_hostgroup, active, apply, comment)
values (102, 'user1', '^SELECT', 101,1,1, 'user1 select query route to hostgroup 101');


-- 生效规则 & 保存规则
load mysql query rules to runtime; 
SAVE MYSQL QUERY RULES TO DISK;


mysql_query_rules表字段说明:

字段

描述

rule_id

规则ID。proxysql 按rule_id的顺序来判断SQL的路由

active

规则是否启用

username

连接用户。如果配置了username,则使用该username连接的会话发送的SQL才能匹配当前规则。

schemaname

如果配置了schemaname,则默认数据库名为该schemaname的会话发送的SQL才能匹配当前规则

match_pattern

正则表达式,匹配SQL文本

negate_match_pattern

如果设置为1,则只有不匹配match_pattern的SQL才匹配当前规则

destination_hostgroup

SQL转发目的hostgroup

apply

如果设置为1,则匹配当前规则后,就直接转发,不再匹配后续规则。

comment

描述



在实际应用过程中,我们可以精细化配置SQL匹配规则,将特定模式的SQL语句路由的只读节点执行。

相关文章

MySQL优化器特性(一)IN和Exists(semijoin)子查询优化策略

这篇文章中的SQL和执行计划在mysql 8.0.31环境下进行测试。测试的表结构和数据:表结构mysql> show create table tp\G...

MySQL运维实战(5.3) MySQL数据乱码的一些情况

MySQL运维实战(5.3) MySQL数据乱码的一些情况

表数据乱码当数据的真实编码和相关参数(常见的包括character_set_client, character_set_result, 字段的编码,终端的编码)不一致时,会产生乱码。测试1 - 表中的...

MySQL优化器特性(八)索引范围扫描成本计算

MySQL优化器特性(八)索引范围扫描成本计算

range执行计划中的range表示索引范围扫描。索引范围扫描的执行过程大致如下:1、根据where条件中索引字段的条件,定位到索引结构中的第一条满足条件的记录。2、根据索引中记录的rowid,到表中...

MySQL运维实战之ProxySQL(9.1)ProxySQL介绍

MySQL运维实战之ProxySQL(9.1)ProxySQL介绍

mysql通过复制技术实现了数据库高层面的可用,但是对于应用来说,当后端MySQL发生高可用切换时,应该怎么处理?我们考虑几种方案:1、使用域名绑定。应用通过dns连接后端实例,当后端发生切换后,将d...

MySQL运维实战之备份和恢复(8.8)恢复单表

xtrabackup支持单表恢复。如果一个表使用了独立表空间(innodb_file_per_table=1),就可以单独恢复这个表。1、Prepareprepare时带上参数--export,xtr...

 MySQL运维实战(1.2)安装部署:使用二进制安装部署

MySQL运维实战(1.2)安装部署:使用二进制安装部署

一般在生产环境,我们会使用二进制安装的方式安装MySQL。使用二进制安装,在处理单机多实例、升级MySQL等场景下更加方便。如果有特殊的需求(比如要打一些patch),我们还可以自己编译二进制。1、下...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。