9. proxy sql实现读写分离

proxy sql实现读写分离

  • 一、proxysql介绍
  • 二、proxysql实现读写分离
    • 1、环境描述
    • 2、两台数据库配置读写分离,从库添加read_only参数
    • 3、安装proxysql
      • 3.1 proxysql内置库说明
      • 3.2 main库中主要的表说明
    • 4、在后端主库创建允许proxysql连接的用户
    • 5、在proxysql上添加后端服务器信息、并指定读、写组
    • 6、在Proxysql上添加连接后端数据库的用户
    • 7、在proxysql添加健康状态检查的用户
      • 7.1 在后端主库创建健康状态检查用户
      • 7.2 proxysql上添加该用户
    • 8、添加读写分离的路由规则
    • 9、测试读写分离
      • 9.1 登录Proxysql业务端,任意执行读写操作
      • 9.2 登录proxysql管理端,通过hostgroup_id查看读写分离效果

一、proxysql介绍

  • 读写分离
  • 基于用户、schema、语句对SQL进行路由
  • 缓存结果,减轻后端数据库服务器压力
  • 健康状态检测

二、proxysql实现读写分离

1、环境描述

192.168.140.10 主库 MySQL 8.0
192.168.140.11 从库 MySQL 8.0
192.168.140.12 proxysql

2、两台数据库配置读写分离,从库添加read_only参数

3、安装proxysql

cat > /etc/yum.repos.d/proxysql.repo << EOF
[proxysql]
name=ProxySQL YUM 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
[root@proxysql ~]# yum install -y proxysql mariadb[root@proxysql ~]# systemctl enable --now proxysql
[root@proxysql ~]# netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:6032            0.0.0.0:*               LISTEN      16544/proxysql      
tcp        0      0 0.0.0.0:6033            0.0.0.0:*               LISTEN      16544/proxysql 6032端口: proxysql管理端口,用于对Proxysql进行配置、状态查看
6033端口: proxysql业务连接端口

3.1 proxysql内置库说明

mysql> show databases;
+-----+---------------+-------------------------------------+
| seq | name          | file                                |
+-----+---------------+-------------------------------------+
| 0   | main          |                                     |
| 2   | disk          | /var/lib/proxysql/proxysql.db       |
| 3   | stats         |                                     |
| 4   | monitor       |                                     |
| 5   | stats_history | /var/lib/proxysql/proxysql_stats.db |
+-----+---------------+-------------------------------------+
5 rows in set (0.00 sec)说明:
1、main库,最主要的库,对proxysql进行配置大多数要修改main库中的表,为内存数据库,需要持久化保存
2、disk库, 和main库一致,是main库的持久化
3、stats库,统计信息库
4、monitor库,对后端服务器做健康状态检查的信息库
5、stats_history库,历史状态信息

3.2 main库中主要的表说明

mysql> show tables from main;
+----------------------------------------------------+
| tables                                             |
+----------------------------------------------------+
| coredump_filters                                   |
| global_variables                                   |
| mysql_aws_aurora_hostgroups                        |
| mysql_collations                                   |
| mysql_firewall_whitelist_rules                     |
| mysql_firewall_whitelist_sqli_fingerprints         |
| mysql_firewall_whitelist_users                     |
| mysql_galera_hostgroups                            |
| mysql_group_replication_hostgroups                 |
| mysql_hostgroup_attributes                         |
| mysql_query_rules                                  |     // 路由SQL语句的表
| mysql_query_rules_fast_routing                     |
| mysql_replication_hostgroups                       |
| mysql_servers                                      |	  // 存储后端数据库服务器连接信息的表
| mysql_servers_ssl_params                           |    
| mysql_users                                        |    // 存储连接后端数据库用户的表
| proxysql_servers                                   |
| restapi_routes                                     |
| runtime_checksums_values                           |
| runtime_coredump_filters                           |
| runtime_global_variables                           |
| runtime_mysql_aws_aurora_hostgroups                |
| runtime_mysql_firewall_whitelist_rules             |
| runtime_mysql_firewall_whitelist_sqli_fingerprints |
| runtime_mysql_firewall_whitelist_users             |
| runtime_mysql_galera_hostgroups                    |
| runtime_mysql_group_replication_hostgroups         |
| runtime_mysql_hostgroup_attributes                 |
| runtime_mysql_query_rules                          |
| runtime_mysql_query_rules_fast_routing             |
| runtime_mysql_replication_hostgroups               |
| runtime_mysql_servers                              |
| runtime_mysql_servers_ssl_params                   |
| runtime_mysql_users                                |
| runtime_proxysql_servers                           |
| runtime_restapi_routes                             |
| runtime_scheduler                                  |
| scheduler                                          |
+----------------------------------------------------+
38 rows in set (0.01 sec)

4、在后端主库创建允许proxysql连接的用户

mysql> CREATE USER 'proxyuser'@"192.168.183.12" identified by 'WWW.1.com';
Query OK, 0 rows affected (0.02 sec)mysql> GRANT all ON *.* TO 'proxyuser'@'192.168.183.12';
Query OK, 0 rows affected (0.00 sec)mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

5、在proxysql上添加后端服务器信息、并指定读、写组

[root@proxysql ~]# mysql -uadmin -padmin -h 127.0.0.1 -P 6032mysql> show databases;
+-----+---------------+-------------------------------------+
| seq | name          | file                                |
+-----+---------------+-------------------------------------+
| 0   | main          |                                     |
| 2   | disk          | /var/lib/proxysql/proxysql.db       |
| 3   | stats         |                                     |
| 4   | monitor       |                                     |
| 5   | stats_history | /var/lib/proxysql/proxysql_stats.db |
+-----+---------------+-------------------------------------+
5 rows in set (0.00 sec)mysql> insert into mysql_servers(hostgroup_id,hostname,port,weight,comment) values(1, "192.168.183.10",3306,1,"write group");
Query OK, 1 row affected (0.00 sec)mysql> insert into mysql_servers(hostgroup_id,hostname,port,weight,comment) values(2, "192.168.183.11",3306,1,"read group");
Query OK, 1 row affected (0.00 sec)mysql> select * from mysql_servers;
+--------------+----------------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+-------------+
| hostgroup_id | hostname       | port | gtid_port | status | weight | compression | max_connections | max_replication_lag | use_ssl | max_latency_ms | comment     |
+--------------+----------------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+-------------+
| 1            | 192.168.183.10 | 3306 | 0         | ONLINE | 1      | 0           | 1000            | 0                   | 0       | 0              | write group |
| 2            | 192.168.183.11 | 3306 | 0         | ONLINE | 1      | 0           | 1000            | 0                   | 0       | 0              | read group  |
+--------------+----------------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+-------------+
2 rows in set (0.00 sec)说明:
数字1代表写组
数字2代表读组mysql> load mysql servers to runtime;
Query OK, 0 rows affected (0.00 sec)mysql> save mysql servers to disk;
Query OK, 0 rows affected (0.02 sec)

6、在Proxysql上添加连接后端数据库的用户

mysql> insert into mysql_users(username,password,default_hostgroup,transaction_persistent) values("proxyuser","WWW.1.com",1,1);
Query OK, 1 row affected (0.00 sec)mysql> select * from mysql_users;
+-----------+-----------+--------+---------+-------------------+----------------+---------------+------------------------+--------------+---------+----------+-----------------+------------+---------+
| username  | password  | active | use_ssl | default_hostgroup | default_schema | schema_locked | transaction_persistent | fast_forward | backend | frontend | max_connections | attributes | comment |
+-----------+-----------+--------+---------+-------------------+----------------+---------------+------------------------+--------------+---------+----------+-----------------+------------+---------+
| proxyuser | WWW.1.com | 1      | 0       | 1                 | NULL           | 0             | 1                      | 0            | 1       | 1        | 10000           |            |         |
+-----------+-----------+--------+---------+-------------------+----------------+---------------+------------------------+--------------+---------+----------+-----------------+------------+---------+
1 row in set (0.00 sec)mysql> load mysql users to runtime;
Query OK, 0 rows affected (0.00 sec)mysql> save mysql users to disk;
Query OK, 0 rows affected (0.01 sec)

7、在proxysql添加健康状态检查的用户

7.1 在后端主库创建健康状态检查用户

mysql> CREATE USER 'healthuser'@"%" IDENTIFIED BY 'WWW.1.com';
Query OK, 0 rows affected (0.00 sec)mysql> GRANT select ON *.* TO 'healthuser'@"%";
Query OK, 0 rows affected (0.00 sec)mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

7.2 proxysql上添加该用户

mysql> set mysql-monitor_username="healthuser";
Query OK, 1 row affected (0.00 sec)mysql> set mysql-monitor_password="WWW.1.com";
Query OK, 1 row affected (0.01 sec)mysql> load mysql variables to runtime;
Query OK, 0 rows affected (0.01 sec)mysql> save mysql variables to disk;
Query OK, 162 rows affected (0.00 sec)

8、添加读写分离的路由规则

mysql> insert into mysql_query_rules(rule_id,active,match_digest,destination_hostgroup,apply) values(1,1,"^SELECT.*FOR UPDATE$
",1,1);
Query OK, 1 row affected (0.00 sec)mysql> insert into mysql_query_rules(rule_id,active,match_digest,destination_hostgroup,apply) values(2,1,"^SELECT",2,1);
Query OK, 1 row affected (0.00 sec)mysql> select rule_id, active, match_digest, destination_hostgroup, apply from mysql_query_rules;
+---------+--------+----------------------+-----------------------+-------+
| rule_id | active | match_digest         | destination_hostgroup | apply |
+---------+--------+----------------------+-----------------------+-------+
| 1       | 1      | ^SELECT.*FOR UPDATE$ | 1                     | 1     |
| 2       | 1      | ^SELECT              | 2                     | 1     |
+---------+--------+----------------------+-----------------------+-------+
2 rows in set (0.00 sec)mysql> load mysql query rules to runtime;
Query OK, 0 rows affected (0.00 sec)mysql> load admin variables to runtime;
Query OK, 0 rows affected (0.00 sec)mysql> save mysql query rules to disk;
Query OK, 0 rows affected (0.01 sec)mysql> save admin variables to disk;
Query OK, 49 rows affected (0.01 sec)

9、测试读写分离

9.1 登录Proxysql业务端,任意执行读写操作

[root@proxysql ~]# mysql -uproxyuser -pWWW.1.com -h 127.0.0.1 -P6033
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.5.30 (ProxySQL)Copyright (c) 2000, 2024, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> 
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.01 sec)mysql> create database test1;
Query OK, 1 row affected (0.01 sec)mysql> create database test2;
Query OK, 1 row affected (0.01 sec)mysql> select user,host from mysql.user;
+------------------+----------------+
| user             | host           |
+------------------+----------------+
| healthuser       | %              |
| repluser         | %              |
| proxyuser        | 192.168.183.12 |
| mysql.infoschema | localhost      |
| mysql.session    | localhost      |
| mysql.sys        | localhost      |
| root             | localhost      |
+------------------+----------------+
7 rows in set (0.00 sec)mysql> 

9.2 登录proxysql管理端,通过hostgroup_id查看读写分离效果

mysql> select * from stats_mysql_query_digest;
+-----------+--------------------+-----------+----------------+--------------------+----------------------------------+------------+------------+------------+----------+----------+----------+-------------------+---------------+
| hostgroup | schemaname         | username  | client_address | digest             | digest_text                      | count_star | first_seen | last_seen  | sum_time | min_time | max_time | sum_rows_affected | sum_rows_sent |
+-----------+--------------------+-----------+----------------+--------------------+----------------------------------+------------+------------+------------+----------+----------+----------+-------------------+---------------+
| 2         | information_schema | proxyuser |                | 0xf02b330c823d739  | select user,host from mysql.user | 1          | 1719230970 | 1719230970 | 5030     | 5030     | 5030     | 0                 | 7             |
| 1         | information_schema | proxyuser |                | 0x5b29ed96765bad6c | create database test2            | 1          | 1719230951 | 1719230951 | 7884     | 7884     | 7884     | 1                 | 0             |
| 1         | information_schema | proxyuser |                | 0xec77b5d4dcabfb9f | create database test1            | 1          | 1719230948 | 1719230948 | 4983     | 4983     | 4983     | 1                 | 0             |
| 1         | information_schema | proxyuser |                | 0x2033e45904d3df0  | show databases                   | 1          | 1719230934 | 1719230934 | 12909    | 12909    | 12909    | 0                 | 4             |
| 1         | information_schema | proxyuser |                | 0x226cd90d52a2ba0b | select @@version_comment limit ? | 1          | 1719230929 | 1719230929 | 0        | 0        | 0        | 0                 | 0             |
+-----------+--------------------+-----------+----------------+--------------------+----------------------------------+------------+------------+------------+----------+----------+----------+-------------------+---------------+
5 rows in set (0.02 sec)

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

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

相关文章

假冒国企现形记:股权变更视角下的甄别分析

启信慧眼-启信宝企业版 假冒国企公告2024-06-07&#xff0c;中粮集团有限公司官网发布《关于冒名中粮企业名单公告》。公告显示&#xff0c;”有不法分子通过伪造相关材料等方式&#xff0c;以我集团子公司名义开展业务&#xff0c;进行虚假宣传。经核实&#xff0c;上述公司假…

伸展树(数据结构篇)

数据结构之伸展树 伸展树 概念&#xff1a; 伸展树是一颗对任意一个节点被访问后&#xff0c;就经过一系列的AVL树的旋转操作将该节点放到根上的特殊二叉查找树。伸展树能保证对树操作M次的时间复杂度为O(MlogN)&#xff0c;而当一个查找树的一个节点刚好处于查找树最坏的情…

物联网系统运维——实验备份与恢复,数据镜像软件DRBD介绍,DRBD的安装和应用,extundelete的安装和应用(重点),环境准备,配置设置

一.数据备份 1.数据备份的重要性 备份是系统中需要考虑的最重要的事项,虽然这在系统的整个规划,开发和测试过程中甚至占不到1%,看似不太重要且默默无闻的工作只有到恢复的时候才能真正体现出其重要性,任何数据的丢失与数据宕机&#xff0c;都是不可以被接收的。 2.数据备份策…

基于Pytorch框架构建LeNet-5模型

Pytorch 一、训练模型1.导入必要的库2.设置超参数3.数据预处理4.读取数据 二、定义卷积神经网络1.定义卷积神经网络2.定义学习率3.实例化模型并且移动到GPU4.选择优化器 三、定义调整学习率的函数1.定义调整学习率的函数 四、训练模型1.设置模型为训练模式2.遍历训练数据加载器…

文本三剑客之awk:

文本三剑客awk&#xff1a; grep 查 sed 增删改查 主要&#xff1a;增改 awk 按行取列 awk awk默认的分隔符&#xff1a;空格&#xff0c;tab键&#xff0c;多个空格自动压缩为一个。 awk的工作原理&#xff1a;根据指令信息&#xff0c;逐行的读取文本内容&#xff0c;然…

【Day02】0基础微信小程序入门-学习笔记

文章目录 模板与配置学习目标WXML 模板语法1.数据绑定&#xff08;类似于 Vue2 &#xff09;2. 事件绑定3. 条件渲染4.列表渲染 WXSS模板样式1. rpx尺寸单位2.样式导入3. 全局样式和局部样式 全局配置1. window2. tabBar 页面配置网络数据请求总结 持续更新~ 模板与配置 学习目…

C语言从头学25—— exit() 函数及 atexit() 函数

我们在 main 程序里通过 "return 0;" 这个语句来结束整个程序的运行&#xff0c;而在函数(也可以叫子程序)中使用 return 语句结束函数运行并带着返回值 (如有的话) 返回到调用者那里&#xff0c;然后继续运行后边的代码。如果在子程序那里就想结束整个程序的运行&am…

纯血国产的应用开发框架,Solon v2.8.4 发布

Solon 框架&#xff01; Java “纯血国产”应用开发框架。开放原子开源基金会&#xff0c;孵化项目。从零开始构建&#xff08;非 java-ee 架构&#xff09;&#xff0c;有灵活的接口规范与开放生态。 追求&#xff1a; 更快、更小、更简单提倡&#xff1a; 克制、简洁、高效…

easy-es Map类型字段序列化问题:Unexpected character (‘n‘ (code 110)):

Data IndexName("demo") public class EasyEsDemo {IndexIdprivate String id;private String name;private int age;// 这个Map字段因为NameFilter过滤器&#xff0c;导致fastjson序列化后为{null:"value"}这种形式&#xff0c;insert报错private Map<…

gateway整合sentinel限流

官方文档&#xff1a;https://github.com/alibaba/Sentinel/wiki/%E7%BD%91%E5%85%B3%E9%99%90%E6%B5%81 从 1.6.0 版本开始&#xff0c;Sentinel 提供了 Spring Cloud Gateway 的适配模块&#xff0c;可以提供两种资源维度的限流&#xff1a; route 维度&#xff1a;即在 Spr…

【第28章】Vue实战篇之用户重置密码

文章目录 前言一、调用接口二、重置密码三、界面展示总结 前言 这里我们来通过调用后端接口来完成密码重置功能并且修改成功清除缓存重新登录。 一、调用接口 export const userResetPasswordService (data)>{return request.patch(/user/updatePwd, data) }二、重置密码…

【数据结构与算法】详解循环队列:基于数组实现高效存储与访问

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《数据结构与算法》 期待您的关注 ​ 目录 一、引言 &#x1f343;队列的概念 &#x1f343;循环队列的概念 &#x1f343;为什…

DIY灯光特效:霓虹灯动画制作教程

下面我们根据这张霓虹灯案例,教大家如何用智能动物霓虹灯闪烁的效果,大家可以根据思路,实现自己想要的动效效果,一起动手来做吧。 即时设计-可实时协作的专业 UI 设计工具 设置背景 新建画板尺寸为:800PX^600PX,设置背景色#120527。 绘制主题 输入自己喜欢文案,轮廓化,具体…

网络基础-协议

一、ARP 通过IP得到Mac 首先会查看缓存的arp表中是否有相应的IP和Mac对应关系&#xff0c;如果有直接进行包封装。如果没有则进行广播当对应的地址就收到广播包后会根据arp中的源地址进行单播返回相应的IP和Mac对应关系。 arp -a 查看现有的arp缓存 二、RARP反向地址解析 通过…

好公司也需要在好的价格买入

在《战胜华尔街》的第七章&#xff0c;林奇先生还进一步支出在合适的价格买入的重要性。他指出“那些股价线上涨幅度超过了收益线的股票&#xff0c;一般要么是横盘整理&#xff0c;要么是股价回调到与其盈利水平比较相当的合理价位。”因此&#xff0c;“在大牛市中&#xff0…

酒店多商户版微信小程序源码

一站式预订新体验 一、引言&#xff1a;打破传统&#xff0c;开启智能预订新时代 在数字化浪潮的推动下&#xff0c;传统的酒店预订方式已经逐渐无法满足现代人的需求。为此&#xff0c;一款集众多酒店商户于一体的“酒店多商户版小程序”应运而生&#xff0c;以其便捷、智能…

江门电子行业实施MES系统前后对比

在江门电子行业实施MES系统之前和之后的对比可以涉及以下几个方面&#xff1a; 生产效率提升&#xff1a;实施MES系统后&#xff0c;江门电子行业可以实现生产过程的实时监控和优化&#xff0c;减少生产中的浪费和停机时间&#xff0c;提高生产效率。 质量控制改善&#xff1a;…

【机器学习】机器学习重要方法——深度学习:理论、算法与实践

文章目录 引言第一章 深度学习的基本概念1.1 什么是深度学习1.2 深度学习的历史发展1.3 深度学习的关键组成部分 第二章 深度学习的核心算法2.1 反向传播算法2.2 卷积神经网络&#xff08;CNN&#xff09;2.3 循环神经网络&#xff08;RNN&#xff09; 第三章 深度学习的应用实…

webworker 入门教程

参考&#xff08;阮一峰的网络日志&#xff09;&#xff1a;https://www.ruanyifeng.com/blog/2018/07/web-worker.html Web Worker 的作用&#xff1a; 就是为 JavaScript 创造多线程环境&#xff0c;允许主线程创建 Worker 子线程&#xff0c;将一些任务分配给后者运行。在主…

解释一下在React中,什么是“渲染Props”模式,以及它与使用Hooks之前的状态管理有何不同?

在React中&#xff0c;"渲染Props"模式是一种组件设计模式&#xff0c;它通过将一个函数作为prop传递给组件&#xff0c;允许父组件定义子组件的渲染逻辑。这种模式使得组件更加灵活和可复用&#xff0c;因为它们可以接受一个渲染函数来决定如何渲染自己。 渲染Prop…