广告
返回顶部
首页 > 资讯 > 数据库 >ProxySQL读写分离
  • 249
分享到

ProxySQL读写分离

2024-04-02 19:04:59 249人浏览 泡泡鱼
摘要

Proxysql读写分离查询路由是proxysql的核心特性之一。读/写分离可能是最常用的查询路由之一,而另一种最常用的查询路由是分片。一、使用不同的端口进行读写分离如果使用像HAProxy这样的代理,可以

Proxysql读写分离

查询路由是proxysql的核心特性之一。

读/写分离可能是最常用的查询路由之一,而另一种最常用的查询路由是分片。


一、使用不同的端口进行读写分离

如果使用像HAProxy这样的代理,可以将其配置为侦听两个端口:一个端口作为写入端,而第二个端口作为读取端。人们经常询问如何使用相同的方法配置proxysql,以及基于传入端口查询路由。

下面是一个关于如何实现基于传入端口的查询路由的示例,在proxysql的Admin上运行以下命令。

假设已经在正确的主机组中配置了主服务器和从服务器:

主机组10中的Mysql写入

主机组20中的mysql读取

如果使用Galera或组复制,也可以使用类似的方法。步骤如下


1. 配置proxysql侦听两个端口并重新启动: mysql-interfaces是少数几个在runtime不能更改且需要重新启动的变量之一

SET mysql-interfaces='0.0.0.0:6401;0.0.0.0:6402';

## save it on disk and restart proxysql

SAVE MYSQL VARIABLES TO DISK;

PROXYSQL RESTART;


2. 添加基于传入端口的路由

INSERT INTO mysql_query_rules (rule_id,active,proxy_port,destination_hostgroup,apply)

VALUES (1,1,6401,10,1), (2,1,6402,20,1);

LOAD MYSQL QUERY RULES TO RUNTIME;

SAVE MYSQL QUERY RULES TO DISK; # if you want this change to be permanent

完成了!现在,所有到端口6401的查询将发送到主机组10中的MySQL服务器,而所有到端口6402的查询将发送到主机组20中的MySQL服务器中的一个。


基于传入端口的读/写分离限制

在前一段中,我写到,人们经常询问如何配置proxysql来使用基于传入端口的路由。

虽然有时这是一种有效的方法,但在我看来,它有一个很大的缺点:应用程序需要内置读/写分离功能,以便区分读和写。


(以下是介绍使用ProxySQL的好处 balabala....)

但实际生产环境中并非如此。通常,应用程序连接串只配置一个链接(不区分读写),而这个链接就是MySQL主机。如果使用了proxysql,则可以接受单个端口中的所有流量,并可以分析流量,以便根据查询类型执行读/写分离。

这非常方便,因为它不需要任何应用程序更改。

尽管如此,它的主要优势并不在于能够在不更改应用程序的情况下路由流量。主要优点是DBA现在拥有了控制发送到数据库的流量的工具。DBA在半夜被叫醒由于DB服务器超载,在没有开发人员的情况下,不会选择更改应用程序配置,他现在拥有控制流量的选项(即DBA可以通过ProxySQL控制语句发送至哪些MySQL服务器,非常好)。


二、基于正则表达式的读/写分离

在这一段中,将展示一个关于如何使用正则表达式执行读/写分离的例子。

首先,应该删除之前创建的查询规则:

DELETE FROM mysql_query_rules;


然后,为读/写创建基本规则:

UPDATE mysql_users SET default_hostgroup=10; # by default, all Goes to HG10

LOAD MYSQL USERS TO RUNTIME;

SAVE MYSQL USERS TO DISK; # if you want this change to be permanent

INSERT INTO mysql_query_rules (rule_id,active,match_digest,destination_hostgroup,apply)

VALUES

(1,1,'^SELECT.*FOR UPDATE$',10,1),

(2,1,'^SELECT',20,1);

LOAD MYSQL QUERY RULES TO RUNTIME;

SAVE MYSQL QUERY RULES TO DISK; # if you want this change to be permanent


现在路由将工作如下:

1. 所有SELECT FOR UPDATE将会发送到 HG10

2. 所有其他的SELECT将会发送到HG20

3. 其他所有内容都将发送到HG10(默认值)


注意,我(作者)认为上面的方法不是一个好的读写分离方法。

我(作者)经常用这个例子来描述如何配置规则,但它经常被误解为配置读/写分离的方法(貌似看网上博客也是这样)。


不要在生产中使用上面的例子(来自作者的强调,也就是不要单纯的使用上面两个规则就作为生产环境的读写分离配置,应该是有什么坑的...反正在这里说了,谁爱这样用就这样用(网上很多博客也是这样写的,单用^SELECT.*FOR UPDATE$、^SELECT实现读写分离),死道友不死贫道...)


在下一段中,我(作者)将展示一种更好的方法(使用ProxySQL做读写分离的正确方式)。

现在,让我们删除所有规则:

DELETE FROM mysql_query_rules;

LOAD MYSQL QUERY RULES TO RUNTIME;

SAVE MYSQL QUERY RULES TO DISK; # if you want this change to be permanent


三、使用正则表达式和摘要进行读/写分离

一个有效地设置读/写分离的配置过程如下:

1. 配置proxysql将所有流量只发送到一个MySQL节点,即主节点(包括写和读)

2. 在stats_mysql_query_digest中查出哪些SELECT最消耗性能

3. 确定哪些最消耗性能的语句应该移动到读节点

4. 配置mysql_query_rules(创建规则),只向读节点发送最消耗性能的SELECT语句


因此,这个想法非常简单:只发送您想发送的SELECT语句给从库或读节点,而不是任何SELECT语句。(这才是ProxySQL的正确使用方式...)


使用stats_mysql_query_digest查找最消耗性能的查询语句

下面是一些示例,说明如何识别可以发送给读者的潜在查询。

因为proxysql导出表中的所有指标,所以可以创建复杂的查询来收集信息。

这些结果基于一个运行了几个月的非常繁忙的proxysql实例,到目前为止,该实例已经处理了大约千亿次查询。


1. 根据总执行时间查找前5个查询:

Admin> SELECT digest,SUBSTR(digest_text,0,25),count_star,sum_time FROM stats_mysql_query_digest WHERE digest_text LIKE 'SELECT%' ORDER BY sum_time DESC LIMIT 5;

+--------------------+--------------------------+------------+---------------+

| digest             | SUBSTR(digest_text,0,25) | count_star | sum_time      |

+--------------------+--------------------------+------------+---------------+

| 0x037C3E6D996DAFE2 | SELECT a.ip_id as ip_id, | 2030026798 | 1479082636017 |

| 0xB081A85245DEA5B7 | SELECT a.ip_id as ip_id, | 2025902778 | 1206116187539 |

| 0x38BE36BDFFDBE638 | SELECT instance.name as  | 59343662   | 1096236803754 |

| 0xB4233552504E43B8 | SELECT ir.type as type,  | 1362897166 | 488971769571  |

| 0x4A131A16DCFFD6C6 | SELECT i.id as id, i.sta | 934402293  | 475253770301  |

+--------------------+--------------------------+------------+---------------+

5 rows in set (0.01 sec)


2. 根据count查找前5个查询:

Admin> SELECT digest,SUBSTR(digest_text,0,25),count_star,sum_time FROM stats_mysql_query_digest WHERE digest_text LIKE 'SELECT%' ORDER BY count_star DESC LIMIT 5;

+--------------------+--------------------------+------------+---------------+

| digest             | SUBSTR(digest_text,0,25) | count_star | sum_time      |

+--------------------+--------------------------+------------+---------------+

| 0x037C3E6D996DAFE2 | SELECT a.ip_id as ip_id, | 2030040688 | 1479092529369 |

| 0xB081A85245DEA5B7 | SELECT a.ip_id as ip_id, | 2025916528 | 1206123010791 |

| 0x22E0A5C585C53EAD | SELECT id as instanceid, | 1551361254 | 426419508609  |

| 0x3DB4B9FA4B2CB36F | SELECT i.id as instancei | 1465274289 | 415565419867  |

| 0xB4233552504E43B8 | SELECT ir.type as type,  | 1362906755 | 488974931108  |

+--------------------+--------------------------+------------+---------------+

5 rows in set (0.00 sec)


3. 根据最大执行时间查找前5个查询:

Admin> SELECT digest,SUBSTR(digest_text,0,25),count_star,sum_time,sum_time/count_star avg_time, min_time, max_time FROM stats_mysql_query_digest WHERE digest_text LIKE 'SELECT%' ORDER BY max_time DESC LIMIT 5;

+--------------------+--------------------------+------------+--------------+----------+----------+-----------+

| digest             | SUBSTR(digest_text,0,25) | count_star | sum_time     | avg_time | min_time | max_time  |

+--------------------+--------------------------+------------+--------------+----------+----------+-----------+

| 0x36CE5295726DB5B4 | SELECT COUNT(*) as total | 146390     | 185951894994 | 1270249  | 445      | 237344243 |

| 0xDA8C56B5644C0822 | SELECT COUNT(*) as total | 44130      | 24842335265  | 562935   | 494      | 231395575 |

| 0x8C1B0405E1AAB9DB | SELECT COUNT(*) as total | 1194       | 1356742749   | 1136300  | 624      | 216677507 |

| 0x6C03197B4A2C34BE | Select *, DateDiff(Date_ | 4796       | 748804483    | 156131   | 607      | 197881845 |

| 0x1DEFCE9DEF3BDF87 | SELECT DISTINCT i.extid  | 592196     | 40209254260  | 67898    | 416      | 118055372 |

+--------------------+--------------------------+------------+--------------+----------+----------+-----------+

5 rows in set (0.01 sec)


这个特定的结果表明,有些查询的最大执行时间非常高,而最小执行时间非常小,平均速度也相当慢。

例如,使用摘要0x36CE5295726DB5B4查询的平均执行时间为1.27秒,最小执行时间为0.4ms,最大执行时间为237.34秒。也许有必要研究一下为什么执行时间不均匀。


4. 查找按总执行时间排序的前5个查询,最小执行时间至少为1毫秒:

Admin> SELECT digest,SUBSTR(digest_text,0,20),count_star,sum_time,sum_time/count_star avg_time, min_time, max_time FROM stats_mysql_query_digest WHERE digest_text LIKE 'SELECT%' AND min_time > 1000 ORDER BY sum_time DESC LIMIT 5;

+--------------------+--------------------------+------------+-------------+----------+----------+----------+

| digest             | SUBSTR(digest_text,0,20) | count_star | sum_time    | avg_time | min_time | max_time |

+--------------------+--------------------------+------------+-------------+----------+----------+----------+

| 0x9EED412C6E63E477 | SELECT a.id as acco      | 961733     | 24115349801 | 25074    | 10994    | 7046628  |

| 0x8DDD43A9EA37750D | Select ( Coalesce((      | 107069     | 3156179256  | 29477    | 1069     | 24600674 |

| 0x9EED412C6E63E477 | SELECT a.id as acco      | 91996      | 1883354396  | 20472    | 10095    | 497877   |

| 0x08B23A268C35C08E | SELECT id as reward      | 49401      | 244088592   | 4940     | 1237     | 1483791  |

| 0x437C846F935344F8 | SELECT Distinct i.e      | 164        | 163873101   | ×××26   | 1383     | 7905811  |

+--------------------+--------------------------+------------+-------------+----------+----------+----------+

5 rows in set (0.01 sec)


5. 查找按总执行时间排序的前5个查询,平均执行时间至少为1秒。还显示总执行时间的百分比:

Admin> SELECT digest,SUBSTR(digest_text,0,25),count_star,sum_time,sum_time/count_star avg_time, ROUND(sum_time*100.00/(SELECT SUM(sum_time) FROM stats_mysql_query_digest),3) pct FROM stats_mysql_query_digest WHERE digest_text LIKE 'SELECT%' AND sum_time/count_star > 1000000 ORDER BY sum_time DESC LIMIT 5;

+--------------------+--------------------------+------------+--------------+----------+-------+

| digest             | SUBSTR(digest_text,0,25) | count_star | sum_time     | avg_time | pct   |

+--------------------+--------------------------+------------+--------------+----------+-------+

| 0x36CE5295726DB5B4 | SELECT COUNT(*) as total | 146390     | 185951894994 | 1270249  | 2.11  |

| 0xD38895B4F4D2A4B3 | SELECT instance.name as  | 9783       | 12409642528  | 1268490  | 0.141 |

| 0x8C1B0405E1AAB9DB | SELECT COUNT(*) as total | 1194       | 1356742749   | 1136300  | 0.015 |

+--------------------+--------------------------+------------+--------------+----------+-------+

3 rows in set (0.00 sec)


6. 查找按总执行时间排序的前5个查询,平均执行时间至少为15毫秒。还显示总执行时间的百分比:

Admin> SELECT digest,SUBSTR(digest_text,0,25),count_star,sum_time,sum_time/count_star avg_time, ROUND(sum_time*100.00/(SELECT SUM(sum_time) FROM stats_mysql_query_digest WHERE digest_text LIKE 'SELECT%'),3) pct FROM stats_mysql_query_digest WHERE digest_text LIKE 'SELECT%' AND sum_time/count_star > 15000 ORDER BY sum_time DESC LIMIT 5;

+--------------------+--------------------------+------------+---------------+----------+--------+

| digest             | SUBSTR(digest_text,0,25) | count_star | sum_time      | avg_time | pct    |

+--------------------+--------------------------+------------+---------------+----------+--------+

| 0x38BE36BDFFDBE638 | SELECT instance.name as  | 59360371   | 1096562204931 | 18472    | 13.006 |

| 0x36CE5295726DB5B4 | SELECT COUNT(*) as total | 146390     | 185951894994  | 1270249  | 2.205  |

| 0x1DEFCE9DEF3BDF87 | SELECT DISTINCT i.extid  | 592281     | 40215136635   | 67898    | 0.477  |

| 0xDA8C56B5644C0822 | SELECT COUNT(*) as total | 44130      | 24842335265   | 562935   | 0.295  |

| 0x9EED412C6E63E477 | SELECT a.id as accountid | 961768     | 24116011513   | 25074    | 0.286  |

+--------------------+--------------------------+------------+---------------+----------+--------+

5 rows in set (0.00 sec)


所有这些查询都需要在master上执行吗?如果一个查询的平均执行时间超过1秒,那么答案很可能是否定的。

对于某些应用程序,甚至平均执行时间为15ms的查询也可能变为从属查询。

例如,在与应用程序所有者进行检查后,我们可以决定将使用摘要0x38BE36BDFFDBE638查询可以发送到从库:

INSERT INTO mysql_query_rules (rule_id,active,digest,destination_hostgroup,apply)

VALUES

(1,1,'0x38BE36BDFFDBE638',20,1);


同样,在检查这个输出后:

SELECT digest,digest_text,count_star,sum_time,sum_time/count_star avg_time, ROUND(sum_time*100.00/(SELECT SUM(sum_time) FROM stats_mysql_query_digest WHERE digest_text LIKE 'SELECT%'),3) pct FROM stats_mysql_query_digest WHERE digest_text LIKE 'SELECT COUNT%' ORDER BY sum_time DESC;


我们同意所有以SELECT COUNT(*)开头的查询都可以发送到从库:

INSERT INTO mysql_query_rules (rule_id,active,match_digest,destination_hostgroup,apply)

VALUES

(1,1,'^SELECT COUNT\(\*\)',20,1);


最后,将每个规则加载到runtime:

LOAD MYSQL QUERY RULES TO RUNTIME;

SAVE MYSQL QUERY RULES TO DISK; # if you want this change to be permanent


proxysql对有选择性的查询路由是非常有效的。

虽然对于某些应用程序,将所有SELECT发送给读库/从库是可以接受的,而将其他所有发送给写库/主库是可以接受的,但是对于许多其他应用程序/工作负载,情况就不那么简单了。

DBA应该能够使用复杂的规则配置proxysql,只将不需要在主服务器上执行的查询发送给从服务器,而不需要对应用程序进行任何更改。


您可能感兴趣的文档:

--结束END--

本文标题: ProxySQL读写分离

本文链接: https://www.lsjlt.com/news/36975.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • ProxySQL读写分离
    ProxySQL读写分离查询路由是proxysql的核心特性之一。读/写分离可能是最常用的查询路由之一,而另一种最常用的查询路由是分片。一、使用不同的端口进行读写分离如果使用像HAProxy这样的代理,可以...
    99+
    2022-10-18
  • ProxySQL实现读写分离
    环境: 192.168.205.37: as ProxySQL server 192.168.205.47: as Master server 192.168.205.57: as Slave ser...
    99+
    2022-10-18
  • MySQL使用ProxySQL实现读写分离
    1 ProxySQL简介: ProxySQL是一个高性能的MySQL中间件,拥有强大的规则引擎。官方文档:https://github.com/sysown/proxysql/wiki/下载地址:https...
    99+
    2022-10-18
  • ProxySQL怎么实现读写自动分离
    简介ProxySQL 是基于 MySQL 的一款开源的中间件的产品,是一个灵活的 MySQL 代理层,可以实现读写分离,支持 Query 路由功能,支持动态指定某个 SQL 进行缓存,支持动态加载(无需重启...
    99+
    2022-10-18
  • MySQL中间件proxysql实现MySQL读写分离
    1. Mysql实现读写分离的方式 mysql 实现读写分离的方式有以下几种: 程序修改mysql操作,直接和数据库通信,简单快捷的读写分离和随机的方式实现的负载均衡,权限独立分配,需要开发人员协助。 amoeba,直接实现读写分离和负载...
    99+
    2021-12-16
    MySQL中间件proxysql实现MySQL读写分离 数据库入门 数据库基础教程 数据库 mysql
  • MySQL中通过ProxySQL的使用来实现读写分离
    本文主要给大家介绍MySQL中通过ProxySQL的使用来实现读写分离,文章内容都是笔者用心摘选和编辑的,具有一定的针对性,对大家的参考意义还是比较大的,下面跟笔者一起了解下MySQL中通过ProxySQL...
    99+
    2022-10-18
  • proxysql 主从复制读写分离配置过程记录
    1、环境信息 软件GitHub地址: https://github.com/sysown/proxysql/ 软件官网:https://proxysql.com/ 系统版本: [root@12c proxy...
    99+
    2022-10-18
  • MySQL Group Replication mgr 单主 proxysql 读写分离配置过程
    1、前期准备,mgr安装见上一篇文章 2、创建用户和导入脚本 GRANT ALL ON *.* TO 'rootuser'@'%' IDENTIFIED BY '123456'; /mgr/mysq...
    99+
    2022-10-18
  • 数据库中间件ProxySQL读写自动分离实践
    参考文档 https://github.com/sysown/proxysql http://www.fordba.com/mysql_proxysql_rw_split.html https://www....
    99+
    2022-10-18
  • proxysql配置读写分离策略和权重调整一例
    操作系统:CentOS release 6.9  主库: 192.168.140.51 从库1: 192.168.140.52   read_only=on 从库2: 19...
    99+
    2022-10-18
  • ProxySQL中怎么利用MySQL实现数据库读写分离
    ProxySQL中怎么利用MySQL实现数据库读写分离,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。ProxySQL介绍1、连接池,而且是mu...
    99+
    2022-10-18
  • MySQL高可用实现:主从结构下ProxySQL中的读写分离
    原文: http://www.enmotech.com/web/detail/1/714/1.html ( 复制链接,打开浏览器即可查看原文 )  墨墨导读:Pro...
    99+
    2022-10-18
  • maxscale读写分离
    maxscale安装 官网配置文件详解地址: https://mariadb.com/kb/en/mariadb-enterprise/mariadb-maxscale/maxscale-configu...
    99+
    2022-10-18
  • 如何使用proxysql 1.4.14中间件实现mysql 5.7.26主从的读写分离
    这篇文章将为大家详细讲解有关如何使用proxysql 1.4.14中间件实现mysql 5.7.26主从的读写分离,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。准备条件操...
    99+
    2022-10-18
  • mycat-3:读写分离
    利用mycat读写分离主库192.168.56.101,备库192.168.56.25.3个数据库db1,db2,db3.主从同步见之前数据库目录。 修改schema.xml balance="0"0:不开启读写分离机制,所有读操作都发送到...
    99+
    2023-01-31
    mycat
  • MySQL-mycat读写分离
    Mycat 需要安装JDK 1.7 或者以上版本第一步:下载jdk-8u131-linux-x64.tar.gz文件 http://haixi.sfkcn.com:8080/201704/tools/jdk-linux-x64.tar.gz...
    99+
    2021-04-03
    MySQL-mycat读写分离 数据库入门 数据库基础教程 数据库 mysql
  • mysql+amoeba读写分离
    mysql+amoeba读写分离一 简介:Amoeba是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy。它集中地响应应用的请求,依据用户事先设置的规则,将SQL请求发送到特定的数...
    99+
    2022-10-18
  • Mongodb Replica Set 读写分离
    环境:mongodb版本:2.4.6,Replica Set需求:primary压力过大,期望secondary分担读压力前言    从应用程序角度来看,使用Replica Set 和使...
    99+
    2022-10-18
  • Atlas实现读写分离
    该Atlas方案的实现需要基于MHA架构(而MHA架构需要 实现mysql主从复制且开启GTID特性) 常见方案介绍: Mysql-proxy(oracle)Mysql-router(oracle)Atla...
    99+
    2022-10-18
  • MyCat读写分离配置
        读写分离在我们配置数据库集群时是必然会考虑的一个点,因为这可以有效的降低主库的负载,并且在读多余写的情况下,绝大部分的读请求都可以分发到各个不同的从库上。即使从库负载不够,也可以通过增加从库的方式来...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作