DRDS分布式关系型数据库 学习总结

  |   0 评论   |   0 浏览

DRDS介绍

  • DRDS 在全表扫描时支持聚合函数进行统计汇总,目前全表扫描默认是关闭的,需要您显示的通过配置打开。
  • 如果目标表没有分库分表,那么 DRDS 可以支持任何聚合函数,因为实际上 DRDS 是直接把原 SQL传递到

后端 MySQL 执行。

  • 非全表扫描:SQL语句在经过 DRDS 路由后,直接发送到后端单个 MySQL 库上执行。如果拆分键在

WHERE 条件中都是 = 关系,常会出现这种情况。在非全表扫描的情形下,同样可以支持任何聚合函数。

  • 全表扫描:目前支持的聚合函数有 COUNT, MAX, MIN, SUM, 另外在全表扫描时同样支持 LIKE, ORDER

BY 与 LIMIT 语法, 但是不支持 GROUP BY 语法。

分库分表相关概念

拆分键:

即分库/分表字段。 DRDS 根据拆分键的值将数据表水平拆分到后端的每一个 RDS 分库里。换句话说,键值相

同的数据,一定会位于同一个 RDS 数据库里。DRDS 里的每一张分表都可以定义自己的拆分键,拆分键可以是

单个字段,也可以是多个字段的组合。

全表扫描:

复杂的SQL语句会分发到所有库上执行,并且在 DRDS 中进行比较和合并。全表扫描相当消耗性能,应该在业

务中尽量避免。

单个字段分库分表

  1. 在 INSERT / REPLACE 语句中必须包含分库分表的字段(拆分键)。例如:

拆分字段是id

INSERT INTO table VALUES (‘name1’, ‘value2’)

报错

INSERT INTO table (id, name, value) VALUES (1, ‘name1’, ‘value2’)

允许执行

  1. SELECT / UPDATE/ DELETE语句如果 WHERE 条件中没有包含拆分键,会进行全表扫描。

多个字段分库分表

  1. SELECT / UPDATE / DELETE 语句如果 WHERE条件中没有包含拆分字段,或者带的拆分字段不全,会进行

全表扫描;SQL 必须包含全部拆分键,才会进行路由计算。

举例:拆分键是id + date.

SELECT * FROM table WHERE id = 1 AND date > 3;

进行路由计算

SELECT * FROM table WHERE id = 1;

需要进行全表扫描

  1. SELECT / UPDATE / DELETE 语句如果在 WHERE 条件中带有全部拆分字段,——则拆分字段之间的逻辑关

系一定是AND, 不支持OR; 对于同一个拆分字段的条件组合,用 AND 或者 OR 都是支持的。

举例:拆分键是id + date.

INSERT INTO table VALUES (‘name1’, ‘value2’)

报错

INSERT INTO table (id, name, value) VALUES (1, ‘name1’, ‘value2’)

允许执行

SELECT * FROM table WHERE id = 1 AND date > 3;

进行路由计算

SELECT * FROM table WHERE id = 1;

需要进行全表扫描

DRDS层面的SQL调优原则

1.尽量带上拆分字段,减少数据的查询范围,等值、in、有限范围都比不带的要好。

2.尽可能带上过滤条件或者有效的过滤条件将返回的数据量降低。

3.如果两表join或者多表join, 尝试对join的表进行位置互换(保持语义的情况下)。

理解DRDS的SQL主要会消耗在什么地方以及调优

a.DRDS层面除了需要做比较重的heap sort或者heap computer的时候会比较费时(从trace中能够看到,并且绝

大部分sql DRDS会避免此种计算),其他大部分对sql的处理操作都不会占用太多资源和时间损耗,需要注意的

时候,无论从RDS到DRDS返回大量数据进行merge还是从DRDS返回大量结果给客户端,都会带来比较大延迟

和资源损耗,所以建议控制返回结果的大小。

b.如果从trace sql里面获得的时间在RDS上消耗比较大,请首先观察RDS的状态,包括几个大的指标

iops,cpu,内存,以及mysql自身指标:连接数、锁、buffer消耗等,然后请务必看RDS的诊断报告,大部分

sql慢都是索引创建不合理导致,另外就是针对特别的sql进行参数调优,这个需要专业DBA介入,RDS有部分参数

的修改界面。

c.对于一些类分析的sql操作,建议能够做结果或者中间结果缓存,mysql的存储特性决定如果纯粹在MySQL做

所有业务操作,可能会导致连锁反应,甚至原本很快的一个insert操作都会变得非常缓慢,所以尝试减轻数据库

的负担----减小比较重的sql操作的qps或者执行复杂度。

什么是小表广播?

由于在 DRDS 的数据记录会按照分布键的一定算法实现分库、分表,而一些属性表、参数表等小表,无法做到与大表具有相同的分布键。因而进行关联查询的时候就会出现跨库的问题,严重地影响效率。

因此,在 drds 中可设置对小表进行广播,所谓的广播就是属性表、参数表以单表的形式在一个数据库中建立,然后,将数据同步复制到所有的分布式数据库中。这样就可以实现在每个单库中进行大表与小表之间的本地关联查询了。

但对小表的要求是,数据记录数不能太大,另外,读多写少的情况,才可做复制。如果小表的数据变更频繁,会产生广播风暴,极大地降低 drds 的整体性能。

DRDS 的切分原则是什么?

切分有一些基本的原则,不过更多地时间里,我们会在多种不同的方案中做出权衡:首要原则就是尽可能保证原来的所有 SQL 都物理上的在单机执行,这样可以保证效率,又不需要对结构做大的调整。

要做到这点,那么就意味着针对 ER 中的一对多关系,一对一关系,全部按照“一”进行切分。例如一个用户有多个订单,那么将订单表和商品表,都按照用户 ID 切分,就可以做到原有 SQL 都可以直接运行了,事务,Join 也能做到最大可能的保留,然而,使用这种方式也有自己的代价,当一个用户成长为非常大的用户,以至于单机无法承载的时候,就会发生热点问题。

为了解决这个问题,我们一般而言有如下解决方案:

  1. 增加切分维度,比如除了用户 ID,额外的增加时间这个切分维度,代价是 SQL 中都需要加上这个维度。
  2. 购买更高端的机器来承载单个用户 ID 的数据,或针对这组 ID 进行单独的处理,代价是特殊化处理,并且最终也会有天花板。
  3. 更换切分维度,比如,订单表,按照订单 ID 切分,代价是原有的很多能够方便运行的 SQL 不能够直接运行了,需要采取最终一致的方式进行分布式事务,也有可能需要处理缓慢的分布式 join 等情况。

什么是全局唯一 ID?

在分布式环境下,原有的 mysql sequence 生成机制无法高效的生成全局唯一的 sequence.我们借鉴了 oracle 的 sequence 生成样例,实现了一个在 mysql 基础上的高效 sequence 生成器,能做到没有单点性能瓶颈,具备大并发获取和低延迟特性。DRDS sequence 功能的目标只是为了保证数据的全局唯一,虽然基本上是按时间序列获取的,但并不全局有序。

什么是数据水平切分?

DRDS 帮助您实现分库分表,能够将原来只能在单节点执行的 SQL,转变为多节点执行的 SQL,如同单个数据库体验。通过支持系统实现数据存储的动态水平扩展,目前 DRDS 在公司内已经有超过几百个应用系统使用超过 5 年,高效安全且稳定。但是分布式数据库和单机数据库本身必然会存在一定的使用习惯上的不同,例如低效的分布式事务、分布式 join 等,针对这些问题,DRDS 的选择是:优先考虑性能和稳定性,兼顾软件的兼容性。与市面上的一些开源的数据库切分工具相比,DRDS 能够更智能的分析您的 SQL,在结果集合并和分布式 join 优化等关键领域,我们都有成熟解决方案,能够帮您解决在分布式数据库场景中面临的大部分问题。


标题:DRDS分布式关系型数据库 学习总结
作者:gao1feng
地址:http://gao1feng.top/articles/2020/06/29/1593419693341.html