RDS MySQL 8.0 语句级并发控制

背景

为了应对突发的数据库请求流量,资源消耗过载的语句访问,SQL 访问模型的变化, 并保持 MySQL 实例持续稳定运行,AliSQL 版本设计了基于语句规则的并发控制,Statement Concurrency Control,以下简称 CCL,有效控制匹配某种规则的并发度,并提供了一组工具包(DBMS_CCL package) 方便快捷使用。

规则设计

CCL 规则一共定义了三个维度的特征:
1)SQL command
根据 statement 的类型,例如 ‘SELECT', 'UPDATE', 'INSERT', 'DELETE';
2)  Object
根据 statement 操作的对象进行控制, 例如 TABLE,VIEW;
3)keywords
根据 statement 语句的关键字进行控制;

CCL 根据规则的定义,设计了一个系统表,mysql.concurrency_control 持久化保存 CCL rule:

Concurrency_control

CREATE TABLE `concurrency_control` (
`Id` bigint(20) NOT NULL AUTO_INCREMENT,
`Type` enum('SELECT','UPDATE','INSERT','DELETE') NOT NULL DEFAULT 'SELECT',
`Schema_name` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`Table_name` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`Concurrency_count` bigint(20) DEFAULT NULL,
`Keywords` text COLLATE utf8_bin,
`State` enum('N','Y') NOT NULL DEFAULT 'Y',
`Ordered` enum('N','Y') NOT NULL DEFAULT 'N',
PRIMARY KEY (`Id`)
) /*!50100 TABLESPACE `mysql` */ ENGINE=InnoDB
DEFAULT CHARSET=utf8 COLLATE=utf8_bin
STATS_PERSISTENT=0 COMMENT='Concurrency control'

COLUMNS

  • "Type"

    • 用来定义 SQL command
  • "Schema_name" && "Table_name"

    • 用来定义 Object
  • "Keywords"

    • 用来定义关键字,可使用 ';' 分隔符多个关键字
  • "Concurrency_count"

    • 用来定义并发度
  • "State"

    • 表示这条规则是否 active
  • "Ordered"

    • 表示keywords中多个关键字是否按顺序匹配

用户可以直接操作这个表来定义规则,也可以使用 DBMS_CCL 工具包来操作 CCL rule。

管理接口

为了便捷的管理 CCL rule,AliSQL 在 DBMS_CCL package 中定义了四个 native procedure 来管理;

1)Add CCL rule
dbms_ccl.add_ccl_rule(type=>, schema=>, table=>, Concurrency_count=>, keywords=>);

增加规则(包括表和内存)例如:

1. 增加 SELECT 语句的并发度为 10;
mysql> call dbms_ccl.add_ccl_rule('SELECT', '', '', 10, '');
Query OK, 0 rows affected (0.00 sec) 2. 增加 SELECT 语句,并在语句中出现关键字 key1 的并发度为 20
mysql> call dbms_ccl.add_ccl_rule('SELECT', '', '', 20, 'key1');
Query OK, 0 rows affected (0.00 sec) 3. 增加 test.t 表的 SELECT 语句的并发读为 20;
mysql> call dbms_ccl.add_ccl_rule('SELECT', 'test', 't', 30, '');
Query OK, 0 rows affected (0.00 sec)

规则的匹配按照 3 > 2 > 1 的优先级顺序进行匹配。

2)Delete CCL rule
dbms_ccl.del_ccl_rule(rule_id=> );

删除规则(包括内存和表中)例如:

1. 删除 rule id = 15 的 CCL rule
mysql> call dbms_ccl.del_ccl_rule(15);
Query OK, 0 rows affected (0.01 sec) 2. 如果删除的rule 不存在,语句报相应的 warning
mysql> call dbms_ccl.del_ccl_rule(100);
Query OK, 0 rows affected, 2 warnings (0.00 sec) mysql> show warnings;
+---------+------+----------------------------------------------------+
| Level | Code | Message |
+---------+------+----------------------------------------------------+
| Warning | 7514 | Concurrency control rule 100 is not found in table |
| Warning | 7514 | Concurrency control rule 100 is not found in cache |
+---------+------+----------------------------------------------------+

3) Show CCL rule
dbms_ccl.show_ccl_rule();

展示在内存中 active  rule 的情况,例如:

mysql> call dbms_ccl.show_ccl_rule();
+------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+
| ID | TYPE | SCHEMA | TABLE | STATE | ORDER | CONCURRENCY_COUNT | MATCHED | RUNNING | WAITTING | KEYWORDS |
+------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+
| 17 | SELECT | test | t | Y | N | 30 | 0 | 0 | 0 | |
| 16 | SELECT | | | Y | N | 20 | 0 | 0 | 0 | key1 |
| 18 | SELECT | | | Y | N | 10 | 0 | 0 | 0 | |
+------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+

除了 rule 本身的属性之外,增加了三个数字统计:

1)MATCHED
规则匹配成功次数
2)RUNNING
在此规则下,正在 run 的线程数
3)WAITING
在此规则下,正在 wait的线程数

 4)Flush CCL rule
dbms_ccl.flush_ccl_rule();

如果直接操作了concurrency_control table 修改规则, 不能立即生效,可以调用 flush,重新生效。例如:

mysql> update mysql.concurrency_control set CONCURRENCY_COUNT = 15 where id = 18;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0 mysql> call dbms_ccl.flush_ccl_rule();
Query OK, 0 rows affected (0.00 sec)

压力测试

测试场景

1)设计三条规则
 Rule 1:对 sbtest1 表 应用 Object rule 控制

call dbms_ccl.add_ccl_rule('SELECT', 'test', 'sbtest1', 3, '');

Rule 2: 对sbtest2 表 应用 keyword rule 控制

call dbms_ccl.add_ccl_rule('SELECT', '', '', 2, 'sbtest2');

Rule 3: 对sbtest3 表 应用 SQL command 控制

call dbms_ccl.add_ccl_rule('SELECT', '', '', 2, '');

2)使用 sysbench 进行测试

  • 64 threads
  • 4 tables
  • select.lua

查看规则并发使用情况,可以到到 running 和 waiting 的数量:

mysql> call dbms_ccl.show_ccl_rule();
+------+--------+--------+---------+-------+-------+-------------------+---------+---------+----------+----------+
| ID | TYPE | SCHEMA | TABLE | STATE | ORDER | CONCURRENCY_COUNT | MATCHED | RUNNING | WAITTING | KEYWORDS |
+------+--------+--------+---------+-------+-------+-------------------+---------+---------+----------+----------+
| 20 | SELECT | test | sbtest1 | Y | N | 3 | 389 | 3 | 9 | |
| 21 | SELECT | | | Y | N | 2 | 375 | 2 | 14 | sbtest2 |
| 22 | SELECT | | | Y | N | 2 | 519 | 2 | 34 | |
+------+--------+--------+---------+-------+-------+-------------------+---------+---------+----------+----------+
3 rows in set (0.00 sec)

查看线程运行情况: 大部分处在 Concurrency control waitting 状态。

mysql> show processlist;
+-----+-----------------+-----------------+------+---------+------+------------------------------+--------------------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+-----+-----------------+-----------------+------+---------+------+------------------------------+--------------------------------------+
| 72 | root | localhost:33601 | NULL | Query | 0 | starting | show processlist |
| 171 | u1 | localhost:60120 | test | Query | 2 | Concurrency control waitting | SELECT pad FROM sbtest3 WHERE id=51 |
| 172 | u1 | localhost:60128 | test | Query | 5 | Concurrency control waitting | SELECT pad FROM sbtest4 WHERE id=35 |
| 174 | u1 | localhost:60385 | test | Query | 4 | Concurrency control waitting | SELECT pad FROM sbtest3 WHERE id=54 |
| 178 | u1 | localhost:60136 | test | Query | 12 | Concurrency control waitting | SELECT pad FROM sbtest4 WHERE id=51 |
| 179 | u1 | localhost:60149 | test | Query | 5 | Concurrency control waitting | SELECT pad FROM sbtest2 WHERE id=51 |
| 182 | u1 | localhost:60124 | test | Query | 1 | Concurrency control waitting | SELECT pad FROM sbtest4 WHERE id=51 |
| 183 | u1 | localhost:60371 | test | Query | 5 | User sleep | SELECT pad FROM sbtest2 WHERE id=51 |
| 184 | u1 | localhost:60133 | test | Query | 4 | Concurrency control waitting | SELECT pad FROM sbtest3 WHERE id=51 |
| 190 | u1 | localhost:60406 | test | Query | 5 | Concurrency control waitting | SELECT pad FROM sbtest3 WHERE id=51 |
| 191 | u1 | localhost:60402 | test | Query | 1 | Concurrency control waitting | SELECT pad FROM sbtest4 WHERE id=51 |
| 192 | u1 | localhost:60131 | test | Query | 2 | User sleep | SELECT pad FROM sbtest1 WHERE id=51 | ......

使用规则和风险

  1. Concurrency_control 被设计成不产生 BINLOG,所以对于 CCL 的操作只影响当前实例。
  2. 对于 DML 的并发控制,可能存在事务锁死锁的情况, 除了 CCL 提供了超时机制,
    同时等待中的线程也会响应事务超时和线程 KILL 操作,以应对死锁可能。

本文作者:Ali_冷香

原文链接

本文为云栖社区原创内容,未经允许不得转载。

RDS MySQL 8.0 语句级并发控制的更多相关文章

  1. 再也不怕数据丢失!阿里云RDS MySQL 8.0上线回收站功能

    背景 MySQL 在生产环境使用过程中,会伴随着开发和运维人员的误操作,比如 DROP TABLE / DATABASE,这类 DDL 语句不具有可操作的回滚特性,而导致数据丢失,AliSQL 8.0 ...

  2. MySQL 8.0 技术详解

    MySQL 8.0 简介 MySQL 5.7 到 8.0,Oracle 官方跳跃了 Major Version 版本号,随之而来的就是在 MySQL 8.0 上做了许多重大更新,在往企业级数据库的路上 ...

  3. 云数据库 MySQL 8.0 重磅发布,更适合企业使用场景的RDS数据库

    点击订阅新品发布会! 新产品.新版本.新技术.新功能.价格调整,评论在下方,下期更新!关注更多内容,了解更多 最新发布 云数据库MySQL 8.0 升级发布会 2019年5月29日15时,阿里云云数据 ...

  4. MySQL workbench8.0 CE基本用法(创建数据库、创建表、创建用户、设置用户权限、创建SQL语句脚本)

    原文地址:https://blog.csdn.net/zgcr654321/article/details/82156277 安装完成MySQL后,打开MySQL workbench8.0. 可以看到 ...

  5. 为更强大而生的开源关系型数据库来了!阿里云RDS for MySQL 8.0 正式上线!

    2019年5月29日15时,阿里云RDS for MySQL 8.0正式上线,使得阿里云成为紧跟社区步伐,发布MySQL最新版本的云厂商.RDS for MySQL 8.0 产品是阿里云推出的 MyS ...

  6. mysql执行update语句受影响行数是0

    mybatis连接mysql数据库,发现同一个update执行多次,返回的int值都是1. 我记得同样的update再次执行时 受影响行数是0. 后来发现,我之前一直用的SQLyog是这样子的. 原来 ...

  7. 深入理解 MySQL ——锁、事务与并发控制

    本文首发于vivo互联网技术微信公众号 mp.weixin.qq.com/s/JFSDqI5ya… 作者:张硕 本文对 MySQL 数据库中有关锁.事务及并发控制的知识及其原理做了系统化的介绍和总结, ...

  8. MySQL与MariaDB核心特性比较详细版v1.0(覆盖mysql 8.0/mariadb 10.3,包括优化、功能及维护)

    注:本文严禁任何形式的转载,原文使用word编写,为了大家阅读方便,提供pdf版下载. MySQL与MariaDB主要特性比较详细版v1.0(不含HA).pdf 链接:https://pan.baid ...

  9. [转帖]2019-03-26 发布 深入理解 MySQL ——锁、事务与并发控制

    深入理解 MySQL ——锁.事务与并发控制 https://segmentfault.com/a/1190000018658828 太长了 没看完.. 数据库 并发  mysql 639 次阅读   ...

随机推荐

  1. CF549G Happy Line

    传送门 解题思路 题意大概就是给你个数列,你可以随意交换i,i+1,交换后位于第i+1位的数字+1,位于第i位的数字-1,问最终能否形成一个不下降序列并输出.设初始数列中两个位置x,y最终交换后的位置 ...

  2. SSH 框架controller向jsp传递List jsp中使用el表达式获取

    mvc可以使用ModelAndViev传递数据选择跳转的视图 controller中的代码, 把一个模拟的表单studentListSimulate传给ModelAndView @RequestMap ...

  3. Redis分布式锁的实现及注意事项

    一.前言 分布式锁一般有三种实现方式: 1. 数据库乐观锁: 2. 基于Redis的分布式锁: 3. 基于ZooKeeper的分布式锁. 本篇博客将介绍第二种方式,基于Redis实现分布式锁.虽然网上 ...

  4. Java中用JXL导出Excel代码详解

    jxl是一个韩国人写的java操作excel的工具, 在开源世界中,有两套比较有影响的API可供使用,一个是POI,一个是jExcelAPI.其中功能相对POI比较弱一点.但jExcelAPI对中文支 ...

  5. BZOJ1452 [JSOI2009]Count [2017年4月计划 树状数组02]

    1452: [JSOI2009]Count Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 2419  Solved: 1403[Submit][Stat ...

  6. Django快速创建新项目

    Python免费视频含配套文件QQ124111294 https://pan.baidu.com/s/1bL5ml4 python.exe manage.py startapp app01 pytho ...

  7. 书写更加高效的CSS,走出误区

    根据一些CSS写作经验,如何提高渲染效率及所占用消耗的资源,我们来浅谈一下CSS的渲染效率,书写高效的CSS. 1.十六进制的颜色值对位数与大小写 编写十六进制颜色值时你可能会用小写字母或省略成3位数 ...

  8. Codeforces Round #395 (Div. 2) A. Taymyr is calling you【数论/最小公倍数】

    A. Taymyr is calling you time limit per test 1 second memory limit per test 256 megabytes input stan ...

  9. C++之正则表示,字符串是否为全字母或者全数字

    bool isLetter(std::string& inputtext){ tr1::regex reg("^[A-Za-z]+$"); bool bValid = tr ...

  10. Hibernate QBC 简单收集

    Hibernate QBC 介绍: QBC(Query By Criteria)通过 API 来检索对象 主要由 Criteria 接口.Criterion 接口和 Exception 类组成,支持在 ...