基于ProxySQL中间件实现MySQL的读写分离

news2024/11/15 19:54:35

目录

ProxySQL简介

ProxySQL安装

配置YUM仓库

YUM安装

关于读写分离的实现 

集群信息

测试读写分离

 测试总结

ProxySQL Configuration CLI


ProxySQL简介

ProxySQL是一个高性能的MySQL协议代理,它支持多种数据库后端,包括Amazon Aurora、RDS、ClickHouse、Galera、Group Replication、MariaDB Server、NDB、Percona Server等。它的设计目标是为了提高数据库访问的灵活性、性能和安全性。

ProxySQL的核心功能包括:

  • 读写分离:能够智能地将读请求路由到从库(Slave),而写请求则发送到主库(Master),以此来优化负载均衡和提高读取性能。

  • 负载均衡:可以根据不同的策略(如连接数、响应时间、服务器权重等)在多个后端数据库之间分配查询,以优化资源利用。

  • 高可用性:ProxySQL能够监控后端数据库的状态,如果某个数据库实例变得不可用,它会自动重新路由流量到其他健康的实例,从而提高系统的整体可用性。

  • 查询缓存:对于重复的查询,ProxyQL可以缓存结果,减少对数据库的访问,显著提升响应速度。

  • 安全控制:提供了白名单、黑名单以及查询过滤功能,帮助防止SQL注入攻击,增强数据库的安全性。

  • 动态配置与监控:允许管理员通过管理接口实时调整配置,同时提供详细的监控和日志记录功能,便于故障排查和性能调优。

ProxySQL作为一个中间件,位于应用程序和数据库之间,它理解MySQL协议,能够根据协议内容做出智能决策,而不仅仅是盲目地转发流量。这使得ProxySQL成为处理复杂数据库架构和提升数据库访问性能的强大工具。

ProxySQL安装

下面的安装教程是基于RedHat / CentOS的,其他的操作系统可以去官网查看proxysql官网

 我们都知道在RedHat / CentOS安装一个服务,一般有三种方法,RPM包安装,源码编译安装,YUM安装,相比于RPM需要依赖的安装和源码编译复杂的安装方式YUM安装是最简单的,下面介绍到的就是YUM安装。

配置YUM仓库

下面的仓库是2.6的版本,你可以选择需要的版本来配置,目前官方维护的版本有:

cat <<EOF | tee /etc/yum.repos.d/proxysql.repo
[proxysql_repo]
name=ProxySQL repository
baseurl=https://repo.proxysql.com/ProxySQL/proxysql-2.6.x/centos/\$releasever
gpgcheck=1
gpgkey=https://repo.proxysql.com/ProxySQL/proxysql-2.6.x/repo_pub_key
EOF

YUM安装

安装,查看版本,设置开机启动立即生效

yum -y install proxysql
proxysql --version
systemctl enable --now proxysql

关于读写分离的实现 

集群信息

proxysql192.168.0.114
master192.168.0.104
slave1192.168.0.103
slave2192.168.0.102

使用mysql客户端工具登录proxysql,用户名和密码都是admin,端口为6032,默认不允许localhost登录,所以要用127.0.0.1IP地址登录

mysql -P 6032 -h 127.0.0.1 -uadmin -padmin

在mysql_servers表中配置后端数据库信息

insert into mysql_servers (hostgroup_id,hostname,port,weight,comment) values (10,'192.168.0.104',3306,1,'只写'),(20,'192.168.0.103',3306,50,'只读'),(20,'192.168.0.102',3306,100,'只读');
load mysql servers to runtime;
save mysql servers to disk;
  • 设置的master的hostgroup_id为10(写组);
  • 设置的slave的hostgroup_id为20(读组);
  • 每次在proxysql执行完操作之后,需要手动加载至内存上,然后手动保存至磁盘上。

然后在搭建了MySQL主从复制的架构中的master上创建一个用户并授权

(注意:是master的mysql,不是Proxysql)

CREATE USER 'monitor'@'%' IDENTIFIED WITH caching_sha2_password BY 'new_password';
grant replication client,replication slave on *.* to 'monitor'@'%';

在proxysql上添加该用户

set mysql-monitor_username='monitor';
set mysql-monitor_password='password';
load mysql variables to runtime;
save mysql variables to disk;

 通过查看表mysql_server_ping_log了解后端云服务器状态信息

select * from mysql_server_ping_log limit 3;

对后端定义的云服务器的分组进行读组和写组的设定

insert into mysql_replication_hostgroups (writer_hostgroup,reader_hostgroup) values (10,20);
load mysql servers to runtime;
save mysql servers to disk;

查看后端节点是否具有read_only权限

select * from monitor.mysql_server_read_only_log limit 3;

我们在后端的master上创建两个用户账户

(注意:是master的mysql,不是Proxysql)

CREATE USER 'reader'@'%' IDENTIFIED WITH caching_sha2_password BY 'new_password';
CREATE USER 'writer'@'%' IDENTIFIED WITH caching_sha2_password BY 'new_password';
grant all on *.* to 'reader'@'%' identified by  'new_password';
grant all on *.* to 'writer'@'%' identified by  'new_password';

在proxysql节点上添加刚才创建的用户

insert into mysql_users(username,password,default_hostgroup,attributes,comment) values('writer','password',10,'{"address":"%"}','读写用户');
insert into mysql_users(username,password,default_hostgroup,attributes,comment) values('reader','password',20,'{"address":"%"}','只读用户');
load mysql users to runtime;
save mysql users to disk;

至此,基本配置完毕

测试读写分离

我们在client端测试基于用户的读写分离

最后可以在stats库的stats_mysql_connection_pool 表中查看mysql后端链接和整体流量

 可以看到在102的节点上的 Queries 是15,而103节点上的 Queries 是6

这是因为我们配置的权重不同 

当我们在client在执行一次查询,可以看到102节点上的 Queries增加了一次

测试总结

当我们用reader只读账号登陆和进行DML操作(这里也有个疑问,就是你可以在client上用只读用户登陆实例后可以进行DML,但是例如你执行了一个insert,你在cliet中可以查到你插入的值,但是你在登陆后端的server实例后会发现并没有这个插入的值),会发现也是可行的,(这里在slave节点上的实例中已经配置了read only)为什么呢?

在经过查询官方文档后发现我们没有配置路由测率和属性,也就是路由规则,我们在上面的测试中只是进行了基于用户的读写分离,而路由策略没有配置。(这里也可以理解为基于SQL语句实现读写分离

在mysql_query_rules中配置路由策略

下面的SQL将会限制只读用户的DML语句,关于这个表中的字段含义可以去看官方文档Main (runtime tables definition) - ProxySQL

INSERT INTO mysql_query_rules (rule_id, active, match_pattern, destination_hostgroup,apply) VALUES (1, 1, '^(INSERT|UPDATE|DELETE)', 20, 0);
load mysql query rules to runtime;
save mysql query rules to disk;

配置路由策略后在用只读用户去执行DML发现失败 

ProxySQL Configuration CLI

关于上面proxysql数据库中内置库表的详解请参考官网文档Documentation - ProxySQL 

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

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

相关文章

外卖订餐总后台系统原型

页面数量&#xff1a;共 210 页 源文件格式&#xff1a;rp格式&#xff0c;兼容 Axure RP 9/10 应用领域&#xff1a;O2O领域、网上订餐、外卖行业 文章展示不够全面&#xff0c;如有兴趣请联系作者 该原型作品为外卖订餐总后台管理系统&#xff0c;定位偏向美团外卖与饿了么一…

unapp写微信小程序封装水印相机组件怎么实现?

<template><view><!-- <cu-custom bgColor"bg-gradual-blue" :isBack"true"><block slot"backText">返回</block><block slot"content">编辑资料</block></cu-custom> --><…

让大模型更贴近人类认知水平,上海AI实验室发布首个因果推理评测体系CaLM

近日&#xff0c;上海人工智能实验室&#xff08;上海AI实验室&#xff09;联合同济大学、上海交通大学、北京大学及商汤科技发布首个大模型因果推理开放评测体系及开放平台CaLM&#xff08;Causal Evaluation of Language Models&#xff0c;以下简称“CaLM”&#xff09;。首…

MySQL:MySQL索引结构为什么选用B+树?

一、前言 当我们发现SQL执行很慢的时候&#xff0c;自然而然想到的就是加索引。在MySQL中&#xff0c;无论是Innodb还是MyIsam&#xff0c;都使用了B树作索引结构。我们知道树的分类有很多&#xff0c;MySQL中使用了B树作索引结构&#xff0c;这是为什么呢&#xff1f; 本文将从…

HOJ 修改首页 和后端logo图片 网页收藏标识ico 小白也会的方法

HOJ 是一款优雅知性的在线评测系统&#xff0c;像一位温文尔雅的女性&#xff0c;你会慢慢喜欢上她的。 制作图片素材 用图像编辑软件 比如 **光影魔术手4.0** 制作以下素材 logo.a0924d7d.png 为前台导航栏左边的logo&#xff0c; 600*200 backstage.8bce8c6e.png 为后台侧…

虚拟化技术 在vCenter Server创建数中心、添加主机

一、实验内容 1.安装Flash 2.在vCenter Server创建数中心、添加主机 二、实验主要仪器设备及器材 1.安装有64位Windows操作系统的台式电脑或笔记本电脑&#xff0c;建议4C8G或以上配置 2.在Windows Server 2008 R2已安装vCenter Server 3.Adobe Flash Player 12.0.0.70.e…

数据结构【顺序表】

文章目录 1.顺序表的概念线性表物理结构逻辑结构 2.顺序表的分类2.1静态顺序表2.2动态顺序表 3.顺序表接口的实现头文件(SQList.h)如下源文件初始化顺序表销毁顺序表插入扩容尾插头插 封装扩容函数删除尾删头删 查找元素在指定位置前插入数据情况一(指定的位置不是首元素)情况二…

CMF认证是什么?怎么报名?考试费用多少?有必要参加培训吗?

CMF认证是由国际变革管理学院&#xff08;CMI&#xff09;颁发的一种认证&#xff0c;旨在评估个人在变革管理领域的知识和技能&#xff0c;并确认其在该领域具备专业能力。通过学习和理解变革管理知识体系&#xff08;CMBoK&#xff09;&#xff0c;参与者可以掌握变革管理的理…

4 特征构造

4 特征构造 学习目标 知道未来信息的概念,及处理未来信息的方法掌握从原始数据构造出新特征的方法掌握特征变换的方法掌握缺失值处理的方法1 数据准备 1.1 梳理数据的内在逻辑 关系种类 一对一:一个用户有一个注册手机号 一对多:一个用户多笔借款 多对多:一个用户可以…

第1章 初始Spring Boot【仿牛客网社区论坛项目】

第1章 初始Spring Boot【仿牛客网社区论坛项目】 前言推荐项目总结第1章初识Spring Boot&#xff0c;开发社区首页1.课程介绍2.搭建开发环境3.Spring入门体验IOC容器体验Bean的生命周期体验配置类体验依赖注入体验三层架构 4.SpringMVC入门配置体验响应数据体验响应Get请求体验…

【原创】java+springboot+mysql企业邮件管理系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

jar包安装成Windows服务

一、前言 很多年前写过一篇《使用java service wrapper把windows flume做成服务》的文章&#xff0c;也是把jar包安装成windows服务&#xff0c;今天介绍另外一种更简便的方案。 二、正片 这次使用的工具是 winsw&#xff0c;一个Windows服务包装器。下面看详细介绍 首先从g…

QT状态机8-使用恢复策略自动恢复属性

当状态分配的属性不再活动时,可能希望将其恢复到初始值,通过设置全局的恢复策略可以使状态机进入一个状态而不用明确制定属性的值。 QStateMachine machine; machine.setGlobalRestorePolicy(QStateMachine::RestoreProperties);当设置了恢复策略以后,状态机将自动恢复所有…

神策数据付力力入选福布斯中国 30 Under 30 十周年名人堂

福布斯中国 30 UNDER 30&#xff08;U30&#xff09; 持续关注青年才俊。在 U30 十周年之际&#xff0c;福布斯中国通过跟踪、梳理、比较历年 U30 们入选后的表现、社会影响力事件&#xff0c;以及创业精神诠释&#xff0c;编制了福布斯中国首期 U30 名人堂名单。神策数据联合创…

低代码开发平台在城市数字化转型中的技术实现与案例分析

城市数字化转型需要政策引导、技术创新、基础设施建设、人才培养、多方合作以及安全保障等全方位的支持与助力&#xff0c;共同推动城市的数字化进程&#xff0c;提升其竞争力和可持续发展能力。 其中&#xff0c;技术创新是推动数字化转型的核心动力&#xff0c;需要不断加强…

从零开始详解OpenCV条形码区域分割

前言 在识别二维码之前&#xff0c;首先要划分出二维码的区域&#xff0c;在本篇文章中将从零开始实现二维码分割的功能&#xff0c;并详细介绍用到的方法。 我们需要处理的图像如下&#xff1a; 完整代码 首先我们先放出完整代码&#xff0c;然后根据整个分割流程介绍用到…

英伟达的GDS

英伟达的GDS&#xff0c;即GPUDirect Storage&#xff0c;是英伟达开发的一种技术&#xff0c;它允许GPU直接访问存储设备&#xff0c;从而显著提高数据传输效率和性能。 以下是对英伟达GDS的详细介绍&#xff1a; 一、GDS技术的主要特点和优势 直接内存存取&#xff1a;GDS通…

【设计模式】JAVA Design Patterns——Acyclic Visitor(非循环访问者模式)

&#x1f50d;目的 允许将新功能添加到现有的类层次结构中&#xff0c;而不会影响这些层次结构&#xff0c;也不会有四人帮访客模式中那样循环依赖的问题。 &#x1f50d;解释 真实世界例子 我们有一个调制解调器类的层次结构。 需要使用基于过滤条件的外部算法&#xff08;是…

使用 python 整理 latex 的 bib 文献列表

目录 bib 文献整理脚本前提条件与主要功能原理编程语言与宏包基础完整程序 bib 文献整理脚本 本文主要用于解决 Latex 写作过程中遇到的 bib 文献整理问题&#xff0c;可处理中文文献。 LaTeX是一种基于ΤΕΧ的排版系统&#xff0c;它非常适用于生成高印刷质量的科技和数学类…

八大设计模式:适配器模式实现栈的泛型编程 | 通用数据结构接口的秘诀(文末送书)

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 哈喽各位铁汁们好啊&#xff0c;我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发&#xff0c;不知道各位的…