当前位置: 首页 > news >正文

ProxySQL实现mysql8主从同步读写分离

实验环境:

机器名称IP配置服务角色备注
proxy192.168.93.20proxysql控制器用于监控管理
master192.168.93.10数据库主服务器
slave1192.168.93.11数据库从服务器
slave2192.168.93.12数据库从服务器

软件的获取:

https://repo.proxysql.com/ProxySQL/proxysql-2.7.x/centos/8/proxysql-2.7.0-1-centos8.x86_64.rpm

软件安装:

[root@Rocky-1 ~]# dnf install proxysql-2.7.0-1-centos8.x86_64.rpm

启动ProxySQL:

[root@Rocky-1 ~]# systemctl enable --now proxysql

下载mariadb,方便本地登录

[root@Rocky-1 ~]# yum install mariadb.x86_64


#管理员用户登录

[root@Rocky-1 ~]# mysql -uadmin -padmin -h 127.0.0.1 -P 6032

可见有五个库: main、disk、stats 、monitor 和 stats_history
main: 内存配置数据库,即 MEMORY,表里存放后端 db 实例、用户验证、路由规则等信息。main 库中有如下信息:


main库下的主要表:
mysql_servers: 后端可以连接 MySQL 服务器的列表
mysql_users: 配置后端数据库的账号和监控的账号。
mysql_query_rules: 指定 Query 路由到后端不同服务器的规则列表。


 

注: 表名以 runtime_开头的表示 ProxySQL 当前运行的配置内容,不能通过 DML 语句修改。

只能修改对应的不以 runtime 开头的表,然后 “LOAD” 使其生效,“SAVE” 使其存到硬盘以供下次重启加载。
disk :持久化的磁盘的配置
stats: 统计信息的汇总
monitor:一些监控的收集信息,比如数据库的健康状态等
stats_history: 这个库是 ProxySQL 收集的有关其内部功能的历史指标

配置步骤:

1、配置ProxySQL所需要的账户:

在 Master (192.168.93.19) 的MySQL 上创建 ProxySQL 的监控账户和对外访问账户

#proxysql的监控账户

create user 'monitor'@'192.168.93.%' identified with mysql_native_password by 'Monitor@123.com';
grant all privileges on *.* to 'monitor'@'192.168.93.%' with grant option;

#proxysql 的对外访问账户
create user 'proxysql'@'172.16.%.%' identified with mysql_native_password by '123456';
grant all privileges on *.* to 'proxysql'@'192.168.93.%' with grant option;

2、创建组,定义写为1,读为0:

MySQL [(none)]> insert into mysql_replication_hostgroups (writer_hostgroup,reader_hostgroup,comment) values (1,0,'proxy');
Query OK, 1 row affected (0.001 sec)

MySQL [(none)]> load mysql servers to runtime;
Query OK, 0 rows affected (0.006 sec)

MySQL [(none)]> save mysql servers to disk;
Query OK, 0 rows affected (0.016 sec)

3、添加主从服务器节点:

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

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

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

#加载到当前运行时

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

#保存到磁盘
MySQL [(none)]> save mysql servers to disk;
 


status状态显示ONLINE在线状态,注意这里的ip地址不要写错,博主就是当时把“.”写成“,”,找了半天才发现

4、为ProxySQL监控mysql后端节点

MySQL [(none)]> use monitor

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

MySQL [monitor]> set mysql-monitor_password='Monitor@123.com';

上面这两句是修改变量的方式还可以在main库下面用sql语句方式修改
在main下修改:
MySQL [main]> UPDATE global_variables SET variable_value='monitor' WHERE variable_name='mysql-monitor_username';

MySQL [main]> UPDATE global_variables SET variable_value='Monitor@123.com' WHERE variable_name='mysql-monitor_password';

修改后,保存到runtime和disk
MySQL [monitor]> load mysql variables to runtime;
MySQL [monitor]> save mysql variables to disk;

查看监控账号【ProxySQL】
SELECT * FROM global_variables WHERE variable_name LIKE 'mysql-monitor_%';

也可以这样快速定位:


MySQL [(none)]> select @@mysql-monitor_username;
+--------------------------+
| @@mysql-monitor_username |
+--------------------------+
| monitor                  |
+--------------------------+
1 row in set (0.00 sec)


MySQL [(none)]> select @@mysql-monitor_password;
+--------------------------+
| @@mysql-monitor_password |
+--------------------------+
| Monitor@123.com          |
+--------------------------+
1 row in set (0.00 sec)

验证监控信息,ProxySQL 监控模块的指标都保存在monitor库的log表中 
以下是连接是否正常的监控,对connect指标的监控 ,在前面可能会有很多connect_error,这是因为没有配置监控信息时的错误,配置后如果connect_error的结果为NULL则表示正常

5.对心跳信息的监控:

select * from monitor.mysql_server_ping_log limit 10;
 

6.查看read_only日志监控:

select * from mysql_server_read_only_log limit 5;

7.ProxySQL配置对外访问账号:(要在MySQL节点上创建)

查看mysql_users表结构:


将对外访问账号添加到mysql_users表中,我们前面已经创建
用户:proxysql        密码:123456


insert into mysql_users (username,password,default_hostgroup,transaction_persistent) values ('proxysql','123456',1,1);
 
load mysql users to runtime;


save mysql users to disk;


注:
transaction_persistent 如果为1,则一个完整的SQL只可能路由到一个节点;这点非常重要,主要解决这种情况:一个事务有混合的读操作和写操作组成,事务未提交前,如果事务中的读操作和写操作路由到不同节点,那么读取到的结果必然是脏数据。所以一般情况下,该值应该设置为1,尤其是业务中使用到事务机制的情况(默认为0)


mysql_users 表有不少字段,最主要的三个字段username,password,default_hostgroup 

  • username: 前端链接ProxySQL ,以及ProxySQL 将SQL 语句路由给MySQL所使用的的用户名
  • password:用户名对应的密码,。可以是明文密码,也可以是hash密码。如果想使用hash密码,可以先在某个MySQL节点上执行select password(PASSWORD),然后将加密结果复制到该字段。 
  • default_hostgroup:该用户名默认的路由目标。例如,指定root用户的该字段值为1时,则使用 proxysql 用户发送的SQL语句默认情况下将路由到hostgroup_id=1 组中的某个
     

在从库端1192.168.93.11上通过对方访问账号proxy连接,测试是否路由能默认到hostgroup_id=1,它是一个写组

#通过proxysql用户,创建一个keme库(192.168.93.11)
mysql> create database proxysql;
Query OK, 1 row affected (0.00 sec)


在192.168.93.12验证是否同步:

8、添加读写分离规则(mysql_query_rules):

proxysql支持正则,这里添加两条匹配规则
1、表示像select * from xxx for update这种语句都会分到到写组,
2、表示像select这种语句都会被分配到读组。
 

通过
[root@Rocky-1 ~]# mysql -uadmin -padmin -h 127.0.0.1 -P 6032
MySQL [(none)]> use main;
插入

insert into mysql_query_rules(rule_id,active,match_pattern,destination_hostgroup,apply) values(1,1,'^select .* for update$',1,1);

insert into mysql_query_rules(rule_id,active,match_pattern,destination_hostgroup,apply) values(2,1,'^select',0,1);

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

9、测试

可以看到不同的sql语句分配到了不同的主机库!

核心配置表

img

img

img

img

img

img

4.命令

img

相关文章:

  • Vue3祖先后代组件数据双向同步实现方法
  • TypeScript-知识点梳理
  • 阿里云 AI 搜索开放平台:RAG智能化工作流助力 AI 搜索
  • 【数据结构和算法】6. 哈希表
  • Hive中Map和Reduce阶段的分工
  • C++笔记-stack_queue(含deque,priority_queue,仿函数的讲解)
  • NHANES指标推荐:CTI
  • NOIP2012提高组.同余方程
  • Java基础复习(JavaSE进阶)第九章 网络编程
  • 考研单词笔记 2025.04.23
  • 脂质体挤出器有哪些知名品牌?
  • 2025深圳中兴通讯安卓开发社招面经
  • 【金仓数据库征文】从Oracle到KingbaseES的语法兼容与迁移
  • Spring Boot 项目:如何在 JAR 运行时读取外部配置文件
  • 【每日八股】复习计算机网络 Day4:TCP 协议的其他相关问题
  • 【Java学习笔记】random的使用
  • 并行RANSAC平面拟合(C++)
  • [特殊字符]‍[特殊字符]Linux驱动开发入门 | 并发与互斥机制详解
  • ActiveMQ 核心概念与消息模型详解(二)
  • centos7 设置EMQX开机自启动(创建init.d脚本来设置emqx的自启动服务)
  • 体坛联播|曼联一只脚迈进欧联杯决赛,赵心童4比4奥沙利文
  • 湖北鄂州通报4所小学学生呕吐腹泻:供餐企业负责人被采取强制措施
  • 司法服务保障西部陆海新通道建设,最高法专门发文
  • 违规行为屡禁不止、责任边界模糊不清,法治日报:洞穴探险,谁为安全事故买单?
  • 浙商银行外部监事高强无法履职:已被查,曾任建行浙江省分行行长
  • 澎湃思想周报丨数字时代的育儿;凛冬已至好莱坞