proxySQL with SemiSync

配置读写分离

  • 先查看一下规则表的表结构
https://github.com/sysown/proxysql/wiki/Main-(runtime)#mysql_query_rules
mysql> show create table mysql_query_rules\G
*************************** 1. row ***************************
    table: mysql_query_rules
Create Table: CREATE TABLE mysql_query_rules (
    rule_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,    --规则id
    active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 0,  --查询处理模块将仅考虑active = 1的规则,并且仅将active规则加载到运行时。
    username VARCHAR,                                       --匹配用户名的过滤条件。 如果为非NULL,则仅当使用正确的用户名建立连接时,查询才会匹配。
    schemaname VARCHAR,                                     --符合标准名称的过滤条件。 如果为非NULL,则仅当连接使用schemaname作为默认架构时查询才匹配
    flagIN INT CHECK (flagIN >= 0) NOT NULL DEFAULT 0,      --flagIN,flagOUT,应用-这些使我们能够创建一个"规则链",一个接一个地应用。 输入标志值设置为0,并且仅在开始时考虑flagIN = 0的规则。 当为特定查询找到匹配规则时,将评估flagOUT,如果NOT NULL,则将在flagOUT中使用指定的标志来标记查询。 如果flagOUT与flagIN不同,则查询将退出当前链,并输入具有flagIN作为新输入标志的新规则链。 如果flagOUT与flagIN匹配,则将针对带有该flagIN的第一条规则再次重新评估查询。 直到不再有匹配的规则,或者将apply设置为1时,这才发生(这意味着这是最后一个要应用的规则)
    client_addr VARCHAR,                                    --match traffic from a specific source,匹配特定来源。
    proxy_addr VARCHAR,                                     --match incoming traffic on a specific local IP,匹配特定本地IP的入口。
    proxy_port INT CHECK (proxy_port >= 0 AND proxy_port = 0), replace_pattern VARCHAR CHECK(CASE WHEN replace_pattern IS NULL THEN 1 WHEN replace_pattern IS NOT NULL AND match_pattern IS NOT NULL THEN 1 ELSE 0 END),
    destination_hostgroup INT DEFAULT NULL,                 --将匹配的查询路由到该主机组。 除非存在已启动的事务,并且已登录的用户将transaction_persistent标志设置为1(请参见mysql_users表),否则将发生这种情况。
    cache_ttl INT CHECK(cache_ttl > 0),                     --the number of milliseconds for which to cache the result of the query. Note: in ProxySQL 1.1 cache_ttl was in seconds
    cache_empty_result INT CHECK (cache_empty_result IN (0,1)) DEFAULT NULL,
    cache_timeout INT CHECK(cache_timeout >= 0),            --
    reconnect INT CHECK (reconnect IN (0,1)) DEFAULT NULL,
    timeout INT UNSIGNED CHECK (timeout >= 0),              --执行匹配或重写查询的最大超时(以毫秒为单位)。 如果查询的运行时间超过特定阈值,则会自动终止该查询。 如果未指定超时,则应用全局变量mysql-default_query_timeout。
    retries INT CHECK (retries>=0 AND retries =0),                   --延迟查询执行的毫秒数。是一种限制机制和QoS,允许优先处理某些查询而不是其他查询。 该值被添加到适用于所有查询的mysql-default_query_delay全局变量中。 未来版本的ProxySQL将提供更高级的限制机制。
    next_query_flagIN INT UNSIGNED,
    mirror_flagOUT INT UNSIGNED,
    mirror_hostgroup INT UNSIGNED,
    error_msg VARCHAR,
    OK_msg VARCHAR,
    sticky_conn INT CHECK (sticky_conn IN (0,1)),
    multiplex INT CHECK (multiplex IN (0,1,2)),             --如果为0,将禁用多路复用。 如果为1,则在没有其他条件阻止这种情况(例如用户变量或事务)的情况下,可以重新启用Multiplex。 如果为2,则仅对当前查询不禁用多路复用。 请参见Wiki。默认为NULL,因此不修改多路复用策略。
    gtid_from_hostgroup INT UNSIGNED,
    log INT CHECK (log IN (0,1)),
    apply INT CHECK(apply IN (0,1)) NOT NULL DEFAULT 0,  --当设置为1时,在匹配并处理此规则后将不再评估其他查询(注意:此后将不再评估mysql_query_rules_fast_routing规则)
    comment VARCHAR)
1 row in set (0.00 sec)
  • 根据sql匹配正则表达式,并加载到runtime
mysql> insert into mysql_query_rules(rule_id,active,match_pattern,destination_hostgroup,apply) values(1,1,'^SELECT.*FOR UPDATE$',100,1);
Query OK, 1 row affected (0.00 sec)

mysql> insert into mysql_query_rules(rule_id,active,match_pattern,destination_hostgroup,apply) values(2,1,'^SELECT',101,1);
Query OK, 1 row affected (0.00 sec)

mysql> select rule_id,active,match_pattern,destination_hostgroup,apply from mysql_query_rules;
+---------+--------+----------------------+-----------------------+-------+
| rule_id | active | match_pattern        | destination_hostgroup | apply |
+---------+--------+----------------------+-----------------------+-------+
| 1       | 1      | ^SELECT.*FOR UPDATE$ | 100                   | 1     |
| 2       | 1      | ^SELECT              | 101                   | 1     |
+---------+--------+----------------------+-----------------------+-------+
2 rows in set (0.00 sec)

mysql> load mysql query rules to run;
Query OK, 0 rows affected (0.00 sec)

mysql> save mysql query rules to disk;
Query OK, 0 rows affected (0.04 sec)
  • 使用sysbench运行事务,并查看stats.mysql_query_digest
[14:31:03] root@ms84:~ # sysbench /usr/share/sysbench/oltp_read_write.lua --mysql-host=192.168.188.84 --mysql-port=6033 --mysql-user=proxy --mysql-password=proxy --db-driver=mysql --mysql-db=kk --table-size=5000  run
sysbench 1.0.17 (using system LuaJIT 2.0.4)

mysql> select * from stats.stats_mysql_query_digest_reset;
Empty set (0.00 sec)

mysql> select hostgroup, digest, digest_text, count_star, first_seen, last_seen from stats.stats_mysql_query_digest;
+-----------+--------------------+--------------------------------------------------------------------+------------+------------+------------+
| hostgroup | digest             | digest_text                                                        | count_star | first_seen | last_seen  |
+-----------+--------------------+--------------------------------------------------------------------+------------+------------+------------+
| 100       | 0xE52A0A0210634DAC | INSERT INTO sbtest1 (id, k, c, pad) VALUES (?, ?, ?, ?)            | 409        | 1589870243 | 1589870250 |
| 100       | 0xFB239BC95A23CA36 | UPDATE sbtest1 SET c=? WHERE id=?                                  | 409        | 1589870243 | 1589870250 |
| 100       | 0xC198E52BCCB481C7 | UPDATE sbtest1 SET k=k+? WHERE id=?                                | 409        | 1589870243 | 1589870250 |
| 101       | 0xC19480748AE79B4B | SELECT DISTINCT c FROM sbtest1 WHERE id BETWEEN ? AND ? ORDER BY c | 409        | 1589870243 | 1589870250 |
| 100       | 0xE365BEB555319B9E | DELETE FROM sbtest1 WHERE id=?                                     | 409        | 1589870243 | 1589870250 |
| 101       | 0xAC80A5EA0101522E | SELECT c FROM sbtest1 WHERE id BETWEEN ? AND ? ORDER BY c          | 409        | 1589870243 | 1589870250 |
| 101       | 0xDBF868B2AA296BC5 | SELECT SUM(k) FROM sbtest1 WHERE id BETWEEN ? AND ?                | 409        | 1589870243 | 1589870250 |
| 101       | 0x290B92FD743826DA | SELECT c FROM sbtest1 WHERE id BETWEEN ? AND ?                     | 409        | 1589870243 | 1589870250 |
| 101       | 0xBF001A0C13781C1D | SELECT c FROM sbtest1 WHERE id=?                                   | 4087       | 1589870243 | 1589870250 |
| 100       | 0x695FBF255DBEB0DD | COMMIT                                                             | 409        | 1589870243 | 1589870250 |
| 100       | 0xFAD1519E4760CBDE | BEGIN                                                              | 410        | 1589870243 | 1589870250 |
+-----------+--------------------+--------------------------------------------------------------------+------------+------------+------------+
11 rows in set (0.01 sec)

  • 针对特定SQL进行读写分离规则(生产环境强烈建议使用此模式)
    因为生产环境业务情况较为固定,SQL类别总体上有一个固定范围。根据业务情况,并不是将所有读写进行分离就是最佳方案,很多时候只许将特定的一些SQL集路由到slave上进行读,而大部分业务还保留在主库。
    这时便用上了基于digest进行读写分离的规则。一般将特别大事务量的查询,或特别频繁的查询路由到slave上。
    不过digest是完全正则匹配, 如果出现大小写、多空格等情况,生成的digest是不同的,无法利用上规则 比如,上一个实验里,0xBF001A0C13781C1D 这个sql运行了4087次,其它sql都远低于该值。那么我们就为这个sql指定规则。
mysql> insert into mysql_query_rules(rule_id,active,digest,destination_hostgroup,apply) values(3,1,'0xBF001A0C13781C1D',101,1);
Query OK, 1 row affected (0.00 sec)

mysql> update mysql_query_rules set active=0 , apply=0 where rule_id in (1,2);
Query OK, 2 rows affected (0.00 sec)

mysql> select rule_id,active,digest,destination_hostgroup,apply from mysql_query_rules;
+---------+--------+--------------------+-----------------------+-------+
| rule_id | active | digest             | destination_hostgroup | apply |
+---------+--------+--------------------+-----------------------+-------+
| 1       | 0      | NULL               | 100                   | 0     |
| 2       | 0      | NULL               | 101                   | 0     |
| 3       | 1      | 0xBF001A0C13781C1D | 101                   | 1     |
+---------+--------+--------------------+-----------------------+-------+
3 rows in set (0.00 sec)

mysql> select * from stats.stats_mysql_query_digest_reset;
Empty set (0.00 sec)

mysql> load mysql query rules to run;
Query OK, 0 rows affected (0.00 sec)

mysql> save mysql query rules to disk;
Query OK, 0 rows affected (0.04 sec)

  • 使用sysbench运行事务,并查看stats.mysql_query_digest
    可以看到,0xBF001A0C13781C1D已经被路由到slave,其它事务不受影响,依然在master进行。
[14:58:57] root@ms84:~ # sysbench /usr/share/sysbench/oltp_read_write.lua --mysql-host=192.168.188.84 --mysql-port=6033 --mysql-user=proxy --mysql-password=proxy --db-driver=mysql --mysql-db=kk --table-size=5000  run

mysql> select hostgroup, digest, digest_text, count_star, first_seen, last_seen from stats.stats_mysql_query_digest;
+-----------+--------------------+--------------------------------------------------------------------+------------+------------+------------+
| hostgroup | digest             | digest_text                                                        | count_star | first_seen | last_seen  |
+-----------+--------------------+--------------------------------------------------------------------+------------+------------+------------+
| 100       | 0xE52A0A0210634DAC | INSERT INTO sbtest1 (id, k, c, pad) VALUES (?, ?, ?, ?)            | 653        | 1589871539 | 1589871549 |
| 100       | 0xE365BEB555319B9E | DELETE FROM sbtest1 WHERE id=?                                     | 653        | 1589871539 | 1589871549 |
| 100       | 0xFB239BC95A23CA36 | UPDATE sbtest1 SET c=? WHERE id=?                                  | 653        | 1589871539 | 1589871549 |
| 100       | 0xC198E52BCCB481C7 | UPDATE sbtest1 SET k=k+? WHERE id=?                                | 653        | 1589871539 | 1589871549 |
| 100       | 0xC19480748AE79B4B | SELECT DISTINCT c FROM sbtest1 WHERE id BETWEEN ? AND ? ORDER BY c | 653        | 1589871539 | 1589871549 |
| 100       | 0xDBF868B2AA296BC5 | SELECT SUM(k) FROM sbtest1 WHERE id BETWEEN ? AND ?                | 653        | 1589871539 | 1589871549 |
| 100       | 0x290B92FD743826DA | SELECT c FROM sbtest1 WHERE id BETWEEN ? AND ?                     | 653        | 1589871539 | 1589871549 |
| 101       | 0xBF001A0C13781C1D | SELECT c FROM sbtest1 WHERE id=?                                   | 6521       | 1589871539 | 1589871549 |
| 100       | 0x695FBF255DBEB0DD | COMMIT                                                             | 653        | 1589871539 | 1589871549 |
| 100       | 0xAC80A5EA0101522E | SELECT c FROM sbtest1 WHERE id BETWEEN ? AND ? ORDER BY c          | 653        | 1589871539 | 1589871549 |
| 100       | 0xFAD1519E4760CBDE | BEGIN                                                              | 653        | 1589871539 | 1589871549 |
+-----------+--------------------+--------------------------------------------------------------------+------------+------------+------------+
11 rows in set (0.01 sec)

Original: https://www.cnblogs.com/konggg/p/13571598.html
Author: 孔个个
Title: proxySQL with SemiSync

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/621252/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 为Typora配置Gitee图床

    安装Typora 官网下载直接安装:https://www.typora.io/#download 编辑Typora图像设置 说明: 打开:文件–>偏好设置&#8…

    数据库 2023年6月11日
    0148
  • 8 int和Integer的区别

    数据类型 int是基本数据类型,Integer是int的包装类,属于引用类型 初始值 int的初始值为0,Integer的初始值为null 存储位置 int是直接存储在栈中的,In…

    数据库 2023年6月6日
    085
  • Python递归遍历目录并删除文件中的前N行

    1 import os 2 3 # 遍历目录下的所有文件 4 def check_file(file_path): 5 os.chdir(file_path) 6 print(os…

    数据库 2023年6月14日
    072
  • Mybatis-Spring源码分析

    Mybatis-Spring 博主技术有限,本文难免有错误的地方,如果您发现了欢迎评论私信指出,谢谢JAVA技术交流群:737698533 当我们使用mybatis和spring整…

    数据库 2023年6月16日
    084
  • JAVA oa 办公系统模块 设计方案

    1.模型管理 :web在线流程设计器、预览流程xml、导出xml、部署流程 2.流程管理 :导入导出流程资源文件、查看流程图、根据流程实例反射出流程模型、激活挂起 、自由跳转 3….

    数据库 2023年6月6日
    069
  • ArrayList扩容机制

    1.构造函数 有三种 说第一种无参构造,默认初始容量为10 2.add函数 /** * 将指定的元素追加到此列表的末尾。 */ public boolean add(E e) { …

    数据库 2023年6月16日
    075
  • MyBatis + SpringMVC 总结

    创建 MyBatis 的主配置文件(mybatis-config.xml):环境,事务管理,数据源 给类取别名 配置支持懒加载 创建接口以及接口的映射文件(UserMapper,U…

    数据库 2023年6月11日
    082
  • 从学校到公司,2022新的起点!!!

    步入新的阶段 目前仍然是大学生的身份,但也算是打工人了。2021秋招时来到了天津的一个公司做实习生,并签订了三方协议。已经来公司将近一个月了,我在这段时间想了很多关于我的未来发展方…

    数据库 2023年6月6日
    066
  • Java中的数组和集合

    一、List和Map 1、特点 (1)传统的数组结构存储数据会在内存中开辟连续得空间,结合下标从而使得可以快速访问数据,但是删除和添加数据就很浪费资源 (2)链表不需要开辟连续空间…

    数据库 2023年6月6日
    0178
  • Java 多线程学习笔记

    多线程 在单个程序中同时运行多个线程完成不同的工作,称为多线程(提升整体处理性能) 线程是程序的最小单位,相对独立的可调用单元,是 CPU 最小基本单位; 在同一个程序中不同的线程…

    数据库 2023年6月11日
    067
  • volatility3-windows插件

    volatility3和volatility有很大的区别 查看镜像信息,volatility会进行分析 <span class=”ne-text”>python vol…

    数据库 2023年6月11日
    082
  • Mysql的读写分离中间件该怎么写?听我来说。

    网上有很多读写分离的中间件,像proxy,mycat等等,由于本人比较懒,懒得去读各种开源的东西,还是想造轮子来得快。 1、了解mysql通信协议,其中有分4.1之前和4.1版本的…

    数据库 2023年5月24日
    0106
  • MySQL数据类型和表操作

    MySQL数据类型和表修改 整型的定义 //创建有符号整数表 CREATE TABLE t1 (id TINYINT); //创建无符号整数表 CREATE TABLE t2 (i…

    数据库 2023年6月16日
    077
  • javaWeb知识点大集合!!!

    pom文件: 4.0.0 org.example javaweb_maven 1.0-SNAPSHOT war UTF-8 1.7 1.7 com.github.pagehelpe…

    数据库 2023年6月16日
    076
  • NO.6 HTML+CSS 笔记

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    数据库 2023年6月14日
    066
  • 深入浅出分析 HashMap

    作者:炸鸡可乐原文出处:www.pzblog.cn 一、摘要 在集合系列的第一章,咱们了解到,Map的实现类有HashMap、LinkedHashMap、TreeMap、Ident…

    数据库 2023年6月14日
    064
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球