Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > ProxySql mysql读写分离

MySQL中使用ProxySql实现读写分离

作者:会飞的灰大狼

ProxySQL是一款高性能、开源的MySQL数据库中间件,通过安装ProxySQL并配置主从服务器、用户及路由规则,实现MySQL读写分离,提升负载均衡与高可用性,本文给大家介绍MySQL中使用ProxySql实现读写分离,感兴趣的朋友一起看看吧

使用ProxySql实现MySQL的读写分离

前言

ProxySQL 是一款高性能、开源的 MySQL 数据库中间件,主要作用是在应用程序与 MySQL 数据库之间搭建一层代理,实现数据库的负载均衡、读写分离、连接池管理、查询路由、故障转移等功能,从而提升数据库集群的可用性、稳定性和性能。

核心功能与作用

  1. 读写分离
    自动将 SQL 查询请求分发到不同的数据库节点:
    • 写操作(如 INSERTUPDATE)路由到主库(Master)。
    • 读操作(如 SELECT)分发到从库(Slave),减轻主库压力,提高查询效率。
      支持自定义规则(如基于 SQL 语句、用户、表名等)灵活分配请求。
  2. 负载均衡
    对于多个从库(或主库集群),ProxySQL 可通过轮询、权重分配等策略,将读请求均匀分发到各节点,避免单节点过载,提升集群整体吞吐量。
  3. 连接池管理
    数据库连接的创建和销毁成本较高,ProxySQL 维护一个连接池,复用已建立的连接,减少连接开销,同时限制连接总数,防止数据库被过多连接压垮。
  4. 故障检测与自动切换
    持续监控数据库节点的健康状态(如通过心跳检测),当主库或从库故障时,自动将请求切换到正常节点,减少人工干预,提高系统可用性。
  5. 查询缓存与过滤
    缓存高频查询结果,减少重复计算;同时可过滤危险 SQL(如 DROPTRUNCATE),增强数据库安全性。
  6. 动态配置与无感知重启
    支持在线修改配置(如路由规则、节点权重),无需重启服务,避免业务中断,适合高可用场景。

适用场景

与同类工具对比

ProxySQL 凭借轻量、高性能、灵活的特性,成为 MySQL 中间件的主流选择之一。

安装配置

安装MySQL

懒得安装 随便写了个脚本

mysql.sh

下载Proxysql包

https://github.com/sysown/proxysql/releases
#我使用的是Centos7系统 并且架构是x86虚拟机 可以通过uname -u 查看自己的系统架构根据自己的系统和版本适配下载

安装Proxysql

安装依赖环境

yum install perl-DBD-mysql perl-DBI mysql-community-libs-compat bzip2 -y

安装Proxysql

rpm -ivh proxysql-2.6.3-1-centos7.x86_64.rpm

查看是否启动

netstat -anput | grep proxysql
tcp        0      0 0.0.0.0:6032            0.0.0.0:*               LISTEN      7698/proxysql       
tcp        0      0 0.0.0.0:6033            0.0.0.0:*               LISTEN      7698/proxysql       

启动proxysql服务并加入开机自启

systemctl start proxysql
systemctl enable proxysql

二、连接 ProxySQL 管理界面

mysql -uadmin -padmin -h127.0.0.1 -P6032

三、ProxySQL 管理员账户配置

1. 查看当前管理员账户

Admin> select @@admin-admin_credentials;
2. 添加新管理员账户
Admin> set admin-admin_credentials='admin:admin;root:root123';

3. 生效并保存管理员账户配置

Admin> load admin variables to runtime;  # 让配置立即生效(临时生效)
Admin> save admin variables to disk;   # 保存到磁盘(永久生效,重启不丢失)

四、配置监控账号

1. 在 MySQL 主库创建监控用户

CREATE USER 'monitor'@'%' IDENTIFIED BY 'monitor';
GRANT USAGE, REPLICATION CLIENT ON *.* TO 'monitor'@'%';

2. 在 ProxySQL 中配置监控用户

UPDATE global_variables SET variable_value='monitor' WHERE variable_name='mysql-monitor_username';
UPDATE global_variables SET variable_value='monitor' WHERE variable_name='mysql-monitor_password';

五、添加 MySQL 服务器到 ProxySQL

1. 注册主从服务器

-- 添加主服务器(写操作专用)
INSERT INTO mysql_servers(hostgroup_id,hostname,port,weight,comment) VALUES (1,'192.168.8.100',3306,1,'Write group');

-- 添加从服务器(读操作专用)
INSERT INTO mysql_servers(hostgroup_id,hostname,port,weight,comment) VALUES (2,'192.168.8.101',3306,1,'Read group');

2. 生效并保存服务器配置

LOAD MYSQL SERVERS TO RUNTIME;  # 临时生效
SAVE MYSQL SERVERS TO DISK;    # 永久保存

六、配置数据库访问用户

1. 在 MySQL 主从库创建访问用户

-- 创建管理员用户(有写权限)
CREATE USER 'adm'@'%' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON *.* TO 'adm'@'%';
-- 创建只读用户(只有读权限)
CREATE USER 'read'@'%' IDENTIFIED BY '123456';
GRANT SELECT ON *.* TO 'read'@'%';
FLUSH PRIVILEGES;  # 刷新权限使配置生效

2. 在 ProxySQL 中注册用户

INSERT INTO mysql_users(username,password,default_hostgroup) VALUES ('adm','123456',1);  -- adm用户默认用写组(1)
INSERT INTO mysql_users(username,password,default_hostgroup) VALUES ('read','123456',2);  -- read用户默认用读组(2)

3. 生效并保存用户配置

LOAD MYSQL USERS TO RUNTIME;  # 临时生效
SAVE MYSQL USERS TO DISK;    # 永久保存

七、配置读写分离规则

1. 添加路由规则

-- 规则1:特殊SELECT语句走主库(例如包含UPDATE的查询)
INSERT INTO mysql_query_rules (rule_id,active,match_digest,destination_hostgroup,apply) VALUES (1,1,'^SELECT.*FROM UPDATE$',1,1);
-- 规则2:普通SELECT语句走从库
INSERT INTO mysql_query_rules (rule_id,active,match_digest,destination_hostgroup,apply) VALUES (2,1,'^SELECT',2,1);
-- 规则3:SHOW语句走从库
INSERT INTO mysql_query_rules (rule_id,active,match_digest,destination_hostgroup,apply) VALUES (3,1,'^SHOW',2,1);

2. 生效并保存规则

LOAD MYSQL QUERY RULES TO RUNTIME;  # 临时生效
SAVE MYSQL QUERY RULES TO DISK;    # 永久保存

八、测试读写分离

1. 测试读操作(通过 read 用户)

mysql -uread -p123456 -h 127.0.0.1 -P6033 -e "SELECT @@hostname,@@port"

2. 测试写操作(通过 adm 用户)

mysql -uadm -p123456 -h 127.0.0.1 -P6033 -e "create database test2;"

3. 查看 ProxySQL 的路由记录

mysql -uadmin -padmin -h127.0.0.1 -P6032  # 登录管理界面
select hostgroup,digest_text from stats_mysql_query_digest\G;  # 查看SQL语句的路由记录

九、保存所有配置(防止丢失)

-- 服务器配置
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;
-- 查询规则配置
LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL QUERY RULES TO DISK;
-- 用户配置
LOAD MYSQL USERS TO RUNTIME;
SAVE MYSQL USERS TO DISK;
-- 变量配置
LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;

总结

整个流程的核心是:

  1. 安装 ProxySQL 并启动
  2. 告诉 ProxySQL“有哪些 MySQL 服务器(主从)”
  3. 告诉 ProxySQL “用什么用户监控这些服务器”
  4. 告诉 ProxySQL “允许哪些用户通过你访问 MySQL”
  5. 告诉 ProxySQL“哪些 SQL 语句走主库,哪些走从库”
  6. 测试并保存配置

通过这些步骤,ProxySQL 就能自动实现 “写操作走主库,读操作走从库” 的读写分离,减轻单台数据库的压力。

到此这篇关于MySQL中使用ProxySql实现读写分离的文章就介绍到这了,更多相关ProxySql mysql读写分离内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文