mysql进阶2——prosysql实现mysql读写分离

news2024/12/22 20:00:03

文章目录

  • 一、读写分离方案类型
    • 1.1 最简单的读写分离
    • 1.2 多个读组或写组的分离模式
  • 二、案例
    • 2.1 初始化操作
    • 2.2 mysql主添加proxysql连接用户
    • 2.3 Proxysql添加连接mysql集群参数
    • 2.4 添加健康检测用户
    • 2.5 添加读写分离的路由规则
    • 2.6 验证

一、读写分离方案类型

基本了解:

  1. 实现数据库读写分离的中间件很多,比如Mycat、Cobar、Atlas、TDDL、Proxysql等等。
  2. ProxySQL 可以灵活配置路由规则,不仅可以实现最简单的读写分离,还可以将读/写都分散到多个不同的组,以及实现分库 sharding (分表sharding的规则比较难写,但也能实现)。

1.1 最简单的读写分离

  • 这种模式的读写分离,严格区分后端的master和slave节点,且slave节点必须设置选项read_only=1。
  • 在ProxySQL上,分两个组,自定义组名,比如定义一个写组HG=10,一个读组HG=20。同时在ProxySQL上开启monitor模块的read_only监控功能,让ProxySQL根据监控到的read_only值来自动调整节点放在HG=10(master会放进这个组)还是HG=20(slave会放进这个组)。
  • 这种模式的读写分离是最简单的,只需在mysql_users表中设置用户的默认路由组为写组HG=10,并在mysql_query_rules中加上两条简单的规则(一个select for update,一个select)即可。
  • 这种读写分离模式,在环境较小时能满足绝大多数需求。但是需求复杂、环境较大时,这种模式就太过死板,因为一切都是monitor模块控制的。
    在这里插入图片描述

1.2 多个读组或写组的分离模式

  • 后端做了分库,对某库的查询要路由到特定的主机组。
  • 至于各个主机组是同一个主从集群(下图左边),还是互相独立的主从集群环境(下图右边),要看具体的需求,不过这种读写分离模式都能应付。
  • 在实现这种模式时,前提是不能开启monitor模块的read_only监控功能,也不要设置mysql_replication_hostgroup 表。
    在这里插入图片描述

1.如下配置实现的是上图左边的结构:写请求路由给HG=10,对test1库的select语句路由给HG=20,其它select路由给HG=30

mysql_servers: 
+--------------+----------+------+--------+--------+
| hostgroup_id | hostname | port | status | weight |
+--------------+----------+------+--------+--------+
| 10           | host1    | 3306 | ONLINE | 1      |
| 20           | host2    | 3306 | ONLINE | 1      |
| 30           | host3    | 3306 | ONLINE | 1      |
+--------------+----------+------+--------+--------+

mysql_users: 
+----------+-------------------+
| username | default_hostgroup |
+----------+-------------------+
| root     | 10                |
+----------+-------------------+

mysql_query_rules: 
+---------+-----------------------+----------------------+
| rule_id | destination_hostgroup | match_digest         |
+---------+-----------------------+----------------------+
| 1       | 10                    | ^SELECT.*FOR UPDATE$ |
| 2       | 20                    | ^SELECT.*test1\..*   |
| 3       | 30                    | ^SELECT              |
+---------+-----------------------+----------------------+

二、案例

IP角色应用系统平台
192.168.161.129读写分离解析主机proxysql、mariadb客户端CentOS7
192.168.161.130mastermariadb服务端CentOS7
192.168.161.131slavemariadb服务端CentOS7

2.1 初始化操作

1.配置mysql主从,参考文章。

在这里插入图片描述

2.安装proxysql服务,参考文章,并添加连接mysql显示信息参数。

export MYSQL_PS1="(\u@\h:\p) [\d]> " 

在这里插入图片描述

2.2 mysql主添加proxysql连接用户

1.在mysql主上进行添加,让proxysql服务器能连接到后端mysql集群。

grant all on *.* to 'proadmin'@'192.168.161.129' identified by 'proadmin';
flush privileges;

2.peoxysql服务器上验证。

mysql -uproadmin -pproadmin -h192.168.161.130

在这里插入图片描述

2.3 Proxysql添加连接mysql集群参数

  • 以下所有操作,在proxysql服务器上操作。

1.添加mysql集群信息到proxysql自己的mysql_servers表中,包括mysql分组、ip端口、权重。

//连接proxysql自己。
mysql -uadmin -padmin -P6032 -h127.0.0.1

//添加mysql主机信息到mysql_servers 表中。hostgroup_id 10表示写组,20表示读组。
insert into mysql_servers(hostgroup_id,hostname,port,weight,comment) values(10,'192.168.161.130',3306,1,'Write Group');
insert into mysql_servers(hostgroup_id,hostname,port,weight,comment) values(20,'192.168.161.131',3306,1,'Read Group');

//保存配置。
load mysql servers to run;
save mysql servers to disk;

//查看配置
select hostgroup_id,hostname,port,weight,comment from mysql_servers;

在这里插入图片描述
2.添加mysql上已创建的连接mysql用户信息添加到proxysql自己的mysql_users表中。这里添加的用户就是之前在mysql主上添加的那个用户。

//default_hostgroup表示默认组设置为写组。当读写分离的路由规则不符合时,会访问默认组的数据库。
insert into mysql_users(username,password,default_hostgroup,transaction_persistent)values('proadmin','proadmin',10,1);

//保存配置。
load mysql users to run;
save mysql users to disk;

//查看。
select username,password,default_hostgroup,transaction_persistent from mysql_users;

在这里插入图片描述

(admin@127.0.0.1:6032) [(none)]> select * from mysql_users \G
*************************** 1. row ***************************
              username: proadmin       # 后端mysql实例的用户名
              password: proadmin       # 后端mysql实例的密码
                active: 1              # active=1表示用户生效,0表示不生效
               use_ssl: 0
     default_hostgroup: 10             # 用户默认登录到哪个hostgroup_id下的实例
        default_schema: NULL           # 用户默认登录后端mysql实例时连接的数据库,这个地方为NULL的话,则由全局变量mysql-default_schema决定,默认是information_schema
         schema_locked: 0
transaction_persistent: 1              # 如果设置为1,连接上ProxySQL的会话后,如果在一个hostgroup上开启了事务,那么后续的sql都继续维持在这个hostgroup上,不论是否会匹配上其它路由规则,直到事务结束。虽然默认是0
          fast_forward: 0              # 忽略查询重写/缓存层,直接把这个用户的请求透传到后端DB。相当于只用它的连接池功能,一般不用,路由规则 .* 就行了
               backend: 1
              frontend: 1
       max_connections: 10000          # 该用户允许的最大连接数
               comment: 

2.4 添加健康检测用户

1.在mysql主上操作,给proxysql服务器添加一个只读用户,可自定义。

grant select on *.* to 'qingjun'@'192.168.161.129' identified by 'citms';
flush privileges;

2.在proxysql上操作,修改变量,设置健康检测的账号。

//连接proxysql自己。
mysql -uadmin -padmin -P6032 -h127.0.0.1

set mysql-monitor_username='qingjun';
set mysql-monitor_password='citms';
load mysql variables to runtime;
save mysql variables to disk;

2.5 添加读写分离的路由规则

注意事项:

  1. 规则id不能是1、2、3开头,因为规则匹配是根据id以小到大的优先级匹配,id越小的规则应该越是精确匹配。
//规则id由小到大,必须是精准匹配——>模糊匹配。
insert into mysql_query_rules(rule_id,active,match_digest,destination_hostgroup,apply) values(9,1,'^SELECT.*FOR DROP$',10,1);
insert into mysql_query_rules(rule_id,active,match_digest,destination_hostgroup,apply) values(10,1,'^SELECT.*FOR UPDATE$',10,1);
insert into mysql_query_rules(rule_id,active,match_digest,destination_hostgroup,apply)values(20,1,'^SELECT.*school\..*',20,1);
insert into mysql_query_rules(rule_id,active,match_digest,destination_hostgroup,apply)values(29,1,'^DESC.*',20,1);
insert into mysql_query_rules(rule_id,active,match_digest,destination_hostgroup,apply)values(30,1,'^SHOW.*',20,1);

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

select rule_id,active,match_digest,destination_hostgroup,apply  from mysql_query_rules;

在这里插入图片描述

2.6 验证

1.使用mysql第一次授权的可读可写账户登录proxysql,进去修改mysql集群数据。

//我这里把连接mysql集群端口改成了3306,默认是6032
mysql -uproadmin -pproadmin -P3306 -h127.0.0.1


//proxysql上的操作命令。
show databases;
create database baimu;
create database school;
select * from school.abc;

2.使用proxysql服务端admin账户登录,查看读写分离效果。

mysql -uadmin -padmin -P6032 -h127.0.0.1 -e 'select * from stats_mysql_query_digest\G' |less

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/788398.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

区分能带图

能带结构是目前采用第一性原理(从头abinitio)计算所得到的常用信息,可用来结合解释金属、半导体和绝缘体的区别。能带可分为价带、禁带和导带三部分,倒带和价带之间的空隙称为能隙。 如果能隙很小或为0 ,则固体为金属…

u-tabs设置默认选中值

uView中u-tabs设置默认选中值: tabs官网连接:https://www.uviewui.com/components/tabs.html 在u-tabs标签中添加 :current 属性值 【注意】:current数值是从0开始的

HMM与CRF模型的使用过程有哪些差异?

在NLP领域, HMM用来解决文本序列标注问题. 如分词, 词性标注, 命名实体识别都可以看作是序列标注问题。同HMM一样, CRF一般也以文本序列数据为输入, 以该序列对应的隐含序列为输出。 HMM模型 HMM模型表示为: lambda HMM(A, B, pi), 其中A, B, pi都是模型的参数, 分别称作: 转…

Mentor Xpedition 过孔的制做以及如何把孔加入PCB板中

Mentor Xpedition 过孔的制做以及如何把孔加入PCB板中 常用的过孔有10/18mil ,10/22mil ,12/24mil。目前国内PCB厂制做工艺孔径比为8:1(板厚与孔径)优秀的PCB板厂的工艺孔径比会更大。 1、下面我们用Mentor建立10/18的孔,打开Se…

P2390 地标访问(二分+结论推导)

来一手结论!:贝西想要经过最多的地标数量,一定不能反复横跳 所以简单了:() 题目问的是最多可以访问多少地标。稍稍分析可知,多访问一个路标,时间必定不会减少,显然这具有…

王道考研数据结构第三章知识点总结

3.1.1 栈的基本概念 注意:卡特兰数结合先序进栈,中序出栈考察,第五章树与二叉树2015年关于不同二叉树的个数的题目 3.1.2 栈的顺序存储实现 3.1.3 栈的链式存储实现 3.2.1 队列的基本概念(详见课件) 3.2.2 队列的顺序实现(详见课件) 3.2.3 队…

WPF基础知识

WPF布局基础原则 1.一个窗口中只能包含一个元素 2. 不应该显示设置元素尺寸 3. 不应使用坐标设置元素的位置 4.可以嵌套布局容器WPF布局容器 StackPanel:水平或垂直排列元素,Orientation属性分别为:Horizontal/VerticalWrapPanel:水平或垂直排列元素、…

ProtoBuf入门概念

目录: 序列化概念ProtoBuf是什么ProtoBuf的使⽤特点安装ProtoBuf如何学习ProtoBuf 1.序列化概念 序列化和反序列化 序列化:把对象转换为字节序列的过程称为对象的序列化。反序列化:把字节序列恢复为对象的过程称为对象的反序列化。 什么…

【DRONECAN】(二)DRONECAN_GUI_TOOL使用

【DRONECAN】(二)DRONECAN_GUI_TOOL使用 前言 DRONECAN_GUI_TOOL是DRONECAN官方开发的一个DRONECAN调试工具,在上一篇文章已经介绍过DRONECAN的背景了,这篇文章主要介绍一下DRONECAN_GUI_TOOL的使用。 DRONECAN_GUI_TOOL在开发…

【从零开始学习JAVA | 第三十一篇】异常体系介绍

前言: 本文我们将为大家介绍一下异常的整个体系,而我们学习异常,不是为了敲代码的时候不出异常,而是为了能够熟练的处理异常,如何解决代码中的异常。 异常的两大分类: 我们就以这张图作为线索来详细介绍一…

Spring Cloud【SkyWalking日志、SkyWalking告警 、Skywalking自定义告警规则】(十五)

目录 分布式请求链路追踪_SkyWalking日志 分布式请求链路追踪_SkyWalking告警 分布式请求链路追踪_Skywalking自定义告警规则 分布式请求链路追踪_SkyWalking日志 POM中引入相关依赖 Skywalking8.4.0版本开始才支持收集日志功能&#xff0c;同时pom需引用以下依赖。 <…

如何理解教育数字化转型?

一、教育数字化转型 教育数字化转型是指将传统的教育方式和教学方法通过应用数字技术进行改进和创新&#xff0c;实现教育过程的数字化、网络化、智能化。它包括利用数字技术改变教育内容的呈现方式、改变组织方式、改变评估和反馈方式。 教育数字化的目的是为了提高教育的效率…

KubeVela篇06:Kubevela Addon插件安装原理

addon支持从本地、git仓库、helm chart仓库安装,最终原理都相同,因此我们以本地安装为例。 完整流程如下: 从指定目录读取一个完整的addon安装包。 根据metadata.yaml配置文件,校验插件要求的kubevela、k8s的版本,不满足版本要求则终止安装。 根据metadata.yaml配置文件…

MS VC 2022开发Linux应用记录之02篇-开发调试Linux QT应用

MS VC 2022开发Linux应用记录之02篇 1. 安装QT5 apt-get update apt-get install build-essential apt-get install qtcreator apt-get install qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools apt-get install qtcreator apt-get install qt5* apt-get install li…

LeetCode 热题 100(三):普通数组。53. 最大子数组和、 56. 合并区间、189. 轮转数组、238. 除自身以外数组的乘积

一、题目一&#xff1a; 53. 最大子数组和 题目要求&#xff1a; 思路&#xff1a;贪心算法。 求每个区间的和。 局部最优&#xff1a;当前“连续和”为负数的时候立刻放弃&#xff0c;从下一个元素重新计算“连续和”&#xff0c;因为负数加上下一个元素 “连续和”只会越…

硬件系统工程师宝典(33)-----EEPROM电路如何设计?

各位同学大家好&#xff0c;欢迎继续做客电子工程学习圈&#xff0c;今天我们继续来讲这本书&#xff0c;硬件系统工程师宝典。 上篇我们了解了嵌入式应用中应用领域不同&#xff0c;所采用的CPU也不同&#xff0c;不过CPU部分电路的设计过程都较为相似。并且&#xff0c;我们…

抖音seo源码开发技术解析

抖音seo矩阵系统源码开发部署基于PHP语言&#xff0c;结合视频剪辑基础框架逻辑&#xff0c; 一、 抖音SEO源码开发技术解析主要包括以下内容&#xff1a; 抖音SEO的概念&#xff1a;简单介绍抖音SEO的概念、作用和流程。 SEO优化技巧&#xff1a;详细讲解SEO优化的技巧&…

C++ - list介绍 和 list的模拟实现

list介绍 list 是一个支持在常数范围内&#xff0c;任意位置进行插入删除的序列式容器&#xff0c;且这个容器可以前后双向迭代。我们可以把 list 理解为 双向循环链表的结构。 于其他结构的容器相比&#xff0c;list在 任意位置进行插入和函数的效率要高很多&#xff1b;而li…

JavaScript:Promise 组合器

如果可以实现记得点赞分享&#xff0c;谢谢老铁&#xff5e; Promise在 JavaScript 中并不是一个新概念。它们是表示异步操作的最终完成或失败及其结果值的对象。 Promise 有三种可能的状态&#xff1a;pending – 初始状态&#xff08;仍在等待&#xff09;、已完成– Promis…

[NLP]使用Alpaca-Lora基于llama模型进行微调教程

Stanford Alpaca 是在 LLaMA 整个模型上微调&#xff0c;即对预训练模型中的所有参数都进行微调&#xff08;full fine-tuning&#xff09;。但该方法对于硬件成本要求仍然偏高且训练低效。 [NLP]理解大型语言模型高效微调(PEFT) 因此&#xff0c; Alpaca-Lora 则是利用 Lora…