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

文章目录

  • 一、读写分离方案类型
    • 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

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【uniapp】更改富文本编辑器图片大小

代码块 //<view v-html"productDetails"></view><rich-text :nodes"productDetails"></rich-text>// 假设htmlContent字段是后台返回的富文本字段var htmlContent res.result.productDetailsconst regex new RegExp(<img, gi…

STM32MP157驱动开发——按键驱动(休眠与唤醒)

文章目录 “休眠-唤醒”机制&#xff1a;APP执行过程内核函数休眠函数唤醒函数 休眠与唤醒方式的按键驱动程序(stm32mp157)驱动程序框架button_test.cgpio_key_drv.cMakefile修改设备树文件编译测试 “休眠-唤醒”机制&#xff1a; 当应用程序必须等待某个事件发生&#xff0c…

爬虫001_Pip指令使用_包管理工具_pip的使用_和源的切换---python工作笔记019

scrapy是一个爬虫的框架 确认一下pip这个python中的包管理工具是否已经安装好了 python的环境变量配置完了以后,还需要配置一下pip的环境变量 把这个目录配置好,这个pip的环境变量的配置很简单不多说了. 我们用pip安装一下包,我们安装到上面这个路径里面,就是python的安装路…

Qt - .ui 文件的使用

文章目录 目录工具栏Dock Widget代码控制 ui添加资源添加文件 目录 子目录只能输入英文&#xff0c;想要显示中文&#xff0c;可以修改右下方表中的 text 属性&#xff1a; 工具栏 让工具栏共用 菜单栏的 new 和 open&#xff0c;只需将下方列表的控件&#xff0c;拖拽到工具栏…

【RS】基于规则的面向对象分类

ENVI使用最多的工具就是分类&#xff0c;这也是很多卫星影像的用途。在ENVI中有很多分类工具&#xff0c;如最基础的监督分类&#xff08;最大似然法、最小距离、支持向量机、随机森林&#xff09;、非监督分类&#xff08;K-means、IsoData&#xff09;&#xff0c;还有面向对…

安卓开发后台应用周期循环获取位置信息上报服务器

问题背景 最近有需求&#xff0c;在APP启动后&#xff0c;退到后台&#xff0c;还要能实现周期获取位置信息上报服务器&#xff0c;研究了一下实现方案。 问题分析 一、APP退到后台后网络请求实现 APP退到后台后&#xff0c;实现周期循环发送网络请求。目前尝试了两种方案是…

随笔--更改已经启动中的容器的配置文件

文章目录 docker 容器的配置信息地址修改文件映射 docker 容器的配置信息地址 # 一般在 sudo su cd /cd /var/lib/docker/containers/{容器id}/ # 查看容器的id,CONTAINER ID就是容器id的前部分 docker ps修改文件映射 进入容器的配置文件位置一般包含这些文件 # 先stop容器…

Docker--harbor私有仓库部署与管理

目录 一、构建私有库 1.下载 registry 镜像 2.在 daemon.json 文件中添加私有镜像仓库地址 3.运行 registry 容器 4.为镜像打标签 5.上传到私有仓库 6.列出私有仓库的所有镜像 7.列出私有仓库的centos镜像有哪些tag 8.测试私有仓库下载 二、Harbor 简介 1.什么是Harb…

iOS--属性关键字

定义 chat&#xff1a; 在iOS开发中&#xff0c;属性关键字是用于声明类的属性&#xff08;实例变量&#xff09;的修饰符。属性关键字可以影响属性的访问权限、内存管理和生成相关的getter和setter方法。 属性关键字有哪些&#xff1f; 分类属性关键字原子性atomic、nonato…

Spring MVC-基础概念(定义+创建和连接+@RequestMappring的描述)

目录 1.什么是Spring MVC&#xff1f; 2. MVC 和 Spring MVC 的关系 3.Spring MVC 项目创建 4. RequestMappring实现用户和程序的映射 4.1 RequestMappring 注解解释 4.2 方法1: RequestMapping(“/xxx”) 4.4 RequestMapping(method xxxx, value “xxx”) 是POST/GET…

协作实现时序数据高效流转链路 | 7.20 IoTDB X RocketMQ 技术沙龙线上直播回顾

7 月 20 日&#xff0c;IoTDB X RocketMQ 技术沙龙线上直播圆满结束。工业物联网时序数据库研发商天谋科技、云原生事件流平台 Apache RocketMQ 社区的四位技术专家&#xff0c;针对实时数据接入、多样数据处理与系统的高扩展、高可靠特性的数据流转处理平台实现难点&#xff0…

Java日志框架JUL、Log4j、logback、log4j2使用

随着软件系统的发展系统业务越来越多、逻辑越来越复杂、代码量越来越多&#xff0c;伴随着容易出现的bug也会越来越多&#xff0c;不论是开发测试阶段还是生产阶段都需要将这些错误及时的捕捉记录下来&#xff0c;方便解决这些问题&#xff0c;否则针对出现的异常无从下手&…

【三维点云处理】顶点、面片、邻接矩阵、邻接距离矩阵以及稀疏存储概念

文章目录 vts和faces基础知识vertices-节点&#xff08;3是点的三维坐标&#xff09;faces-面片&#xff08;3是构成三角形面片的3个点&#xff09; 邻接矩阵邻接距离矩阵&#xff08;NN500&#xff09;稀疏矩阵 vts和faces基础知识 vertices-节点&#xff08;3是点的三维坐标…

【JavaEE初阶】HTTP协议

文章目录 1. HTTP概述和fiddler的使用1.1 HTTP是什么1.2 抓包工具fiddler的使用1.2.1 注意事项1.2.2 fiddler的使用 2. HTTP协议格式2.1 HTTP请求格式2.1.1 基本格式2.1.2 认识URL2.1.3 方法 2.2 请求报头关键字段2.3 HTTP响应格式2.3.1 基本格式2.3.2状态码 1. HTTP概述和fidd…

【博客682】k8s apiserver bookmarks机制以更高效检测变更

k8s apiserver bookmarks机制以更高效检测变更 list-watch背景&#xff1a; List-Watch 是kubernetes中server和client通信的最核心的机制&#xff0c; 比如说api-server监听etcd&#xff0c; kubelet监听api-server&#xff0c; scheduler监听api-server等等&#xff0c;其实…

任务的创建与删除

Q: 什么是任务&#xff1f; A: 任务可以理解为进程/线程&#xff0c;创建一个任务&#xff0c;就会在内存开辟一个空间。 比如&#xff1a; 玩游戏&#xff0c;打篮球&#xff0c;开车&#xff0c;都可以视为任务。 Windows 系统中的 MarkText 、谷歌浏览器、记事本&#xff0…

SpringBoot2为什么默认使用CGLib不再使用JDK动态代理

SpringBoot2为什么默认使用CGLib不再使用JDK动态代理 CGLib和JDK动态代理对比1. 不需要实现接口2. 性能3. 代理对象的创建4. 调用方法 2. CGLib使用 CGLib和JDK动态代理对比 1. 不需要实现接口 JDK动态代理类要求目标类必须实现接口,而CGLib动态代理可以直接代理普通类(非接口…

C语言中指针(简略复习)

一、指针 1. 指针运算 设p为指针&#xff0c;T为类型&#xff0c;n为整型数字&#xff0c;则pn表示&#xff0c;指针从当前位置向后移动n个数据单位&#xff0c;而不是n个字节。 数据类型不同&#xff0c;移动的数据单位字节数也不同&#xff0c;实际上移动的字节数为n*sizeo…

【windows】连接共享打印机提示:0x0000011B

【问题现象】 添加共享打印机的时候&#xff0c; 提示错误&#xff1a;0x0000011B。 【解决方法】 按winr键&#xff0c;在运行输入regedit 然后在注册表中找到路径&#xff1a; 计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print 打开后&#xff0c;在右侧…

【Nodejs】Puppeteer\爬虫实践

puppeteer 文档:puppeteer.js中文文档|puppeteerjs中文网|puppeteer爬虫教程 Puppeteer本身依赖6.4以上的Node&#xff0c;但是为了异步超级好用的async/await&#xff0c;推荐使用7.6版本以上的Node。另外headless Chrome本身对服务器依赖的库的版本要求比较高&#xff0c;c…