drds基础笔记

版权声明:学习是一种信仰。喜欢就拿去,送人玫瑰手有余香。 https://blog.csdn.net/huoyuanshen/article/details/79956589

帮助文档URL: https://help.aliyun.com/document_detail/29659.html?spm=a2c4g.11186623.6.539.6c5jsL

drds知识总结:

bug1,分库分表的时候,在表对象中查不到.
bug2,分库分表无法进行数据导入,提示表结构找不到.
note1,分区键起作用后,可能导致查询出结果主键冲突.主键要提前设定为全局唯一.
note2,分区键键值不可修改.
note3,如果是雪花生成的,都是16的整数倍,取模后都为0,落在0分库.对于历史数据,统一修改为自增,或者采用其他分区函数.
哈希算法是简单取模,要求拆分列的值的自身分布均衡才能保证哈希均衡。

note4,right_shift是先转换成2进制,然后向右移动位数进行计算,如果原来是16整数倍的数据,如右移位数不够,数据仍不均,导致right_shift处理后的数据还是分布不均匀.


(Distributed Relational Database Service)
特点:
分库分表,透明读写分离,分布式事务(结合分布式事务套件 GTS),平滑扩容.
目的:单机数据库遇到的容量(200+mysql实例)和性能瓶颈,最主要是性能问题.


其他技巧:
权限,查看子库,自生成主键
分布式运维指令集
DRDS 提供独有分布式数据库运维指令集,如 SHOW SLOW、TRACE、SHOW NODE 等指令,帮助您快速发现和定位问题。
全局唯一数字序列
DRDS 支持分布式全局唯一且有序递增的数字序列。满足业务在使用分布式数据库下对主键或者唯一键以及特定场景的需求。
数据库账号权限体系
DRDS 支持类单机 MySQL 账号和权限体系,确保不同角色使用的账号操作安全。


名词理解:
DRDS 服务节点(DRDS Server) DRDS Server 是 DRDS 核心组件,提供 SQL 的解析、优化、路由和结果归并。
DRDS 实例 DRDS 实例是由一组 DRDS Server 节点组成的分布式数据库服务集群。各服务节点无状态,同时处理 SQL 请求。
分库 DRDS 水平拆分后,逻辑数据库数据存储在多个物理存储实例上,每个存储实例上的物理库称为分库。
分表 DRDS 水平拆分后,每一个分库上的物理数据表称为分表。
小表广播
全表扫描 数据库拆分模式下,如果 SQL 语句中没有指定拆分键.
DRDS 自定义注释(DRDS Hint)


SQL 大类限制
暂不支持用户自定义数据类型、自定义函数。
暂不支持视图、存储过程、触发器、游标。
暂不支持 BEGIN…END、LOOP…END LOOP、REPEAT…UNTIL…END REPEAT、WHILE…DO…END WHILE 等复合语句。
暂不支类似 IF ,WHILE 等流程控制类语句。


DML
暂不支持 SELECT INTO OUTFILE/INTO DUMPFILE/INTO var_name。
暂不支持非 WHERE 条件的 Correlate Subquery。 #只支持where条件的关联子查询
暂不支持 SQL 中带聚合条件的 Correlate Subquery。 #且关联子查询不能有聚合函数.
5.3.1 版本 SQL 兼容性
不支持 BIT_AND
不支持 BIT_XOR
不支持 BIT_OR


拆分键(分库分表)暂时只支持单个字段
注意:在执行带有 WHERE 条件的 UPDATE、DELETE、SELECT 语句时,如果 SQL 语句中没有使用拆分键,或者虽然指定了拆分键但是范围太广,会导致 SQL 语句被分发到所有分库上执行(即全表扫描),且执行结果会在 DRDS 中进行合并。全表扫描响应较慢,在高并发业务场景中应尽量避免使用。


磁盘余量接近30%,那么可以通过平滑扩容来改善
平滑扩容资源消耗高,执行扩容前请提工单寻求 DRDS 团队协助。


监控:
网络流入:rds->drds
网络流出:drds->rds(主要是sql); drds->应用




权限级别支持情况
全局层级(暂不支持)
数据库层级(支持)*****
表层级(支持)*****
列层级(暂不支持)
子程序层级(暂不支持)
注意:DRDS 里通过 CREATE USER 创建出来的账号只存在于 DRDS,跟 RDS 没有任何关系,也不会同步到后端的 RDS 中去。


只有管理员账号具有创建账号和授权功能;其它账号只能由管理员账号创建,其权限只能由管理员账号授予;
管理员账号是跟数据库绑定的,没有其它数据库的权限,连接的时候只能连接自己对应的那个数据库,不能授予其它数据库的权限给某个账号。例如 easydb 这个管理员账号只能连接 easydb 数据库,只能授予 easydb 数据库权限或者 easydb 数据库中表的权限给某个账号;
创建权限只能通过cmd方式:https://help.aliyun.com/document_detail/50890.html?spm=a2c4g.11186623.6.570.XK5yf9


DRDS 默认会在 1 个 RDS 上创建 8 个物理库,总的物理库数量为选择的 RDS 数量乘以 8。


由于使用 MySQL 客户端,在使用 HINT 时,在命令行上务必添加 -c 参数,否则失效.通过注释实现(类似/*…*/)。


RDS 只读实例过期或者需要释放时,需要在 DRDS 控制台中把读权重置为0,否则流量会继续走到原有只读实例,导致执行失败。


全表扫描功能默认是关闭的,需要配置后才能使用.
通过 DTS 数据迁移到 DRDS,不支持结构导入,请先在 DRDS 库上建表。


在全表扫描时,通过聚合函数,DRDS 支持对全表的统计汇总。目前支持的聚合函数有 COUNT、MAX、MIN、SUM, 另外还支持 LIKE、ORDER BY 与 LIMIT 语法。




扩容期间请勿在控制台提交 DDL 任务或通过直接连接 DRDS 执行 DDL 语句,否则会导致扩容任务失败。
扩容需要保证源库中所有表具有主键,如果没有需要事先添加好。


拆分变更:以单表转分表为例,在建立转换任务前,需要先准备好新表,除拆分方式和表名称外,新表需要与旧表结构相同.新表与旧表需在同一个数据库内,转换任务运行期间需避免对旧表或新表做结构变更。


DDL语句特有的参数:
DBPARTITION BY、TBPARTITION BY、TBPARTITIONS、BROADCAST。方式:mysql client,navicate,DMS.


分库分表的子句和参数:
DBPARTITION BY hash(partition_key):指定分库键和分库算法,不支持按照时间分库;
TBPARTITION BY { HASH(column) | {MM|DD|WEEK|MMDD}(column)(可选):默认与 DBPARTITION BY 相同,指定物理表使用什么方式映射数据;
TBPARTITIONS num(可选):每个库上的物理表数目(默认为1),如不分表,就不需要指定该字段。


1,创建单库单表,会在一个rds实力创建,8个物理分库每个只有一个同名的该表.
2,创建分表,会在一个rds实例上创建,8个物理分库,每个包含一个该表,但序号是递增的.
3,创建分表,且指定tbpartitions num,则8个物理分库,每个包含num个该表,序号是递增的.


单库单表:
建一张单库单表,不做任何拆分。
CREATE TABLE single_tbl(
  id int, 
  name varchar(30), 
  primary key(id)
);
只在 0 库创建了一张单库单表的逻辑表。
mysql> show topology from single_tbl;


分库不分表:
假设已经建好的分库数为 8,建一张表,只分库不分表,分库方式为根据 id 列哈希。
CREATE TABLE multi_db_single_tbl(
  id int, 
  name varchar(30), 
  primary key(id)
) dbpartition by hash(id);
查看该逻辑表的节点拓扑,可以看出在每个分库都创建了 1 张分表,既只做了分库。
mysql> show topology from multi_db_single_tbl;


分库分表:
建一张表,既分库又分表,每个库含有 3 张物理表,分库拆分方式为按照 id 列进行哈希,分表拆分方式为按照 bid 列进行哈希(先根据 id 列的值进行哈希运算,将表中数据分布在多个子库中,每个子库中的数据再根据 bid 列值的哈希运算结果分布在3个物理表中)。
CREATE TABLE multi_db_multi_tbl(
  id int auto_increment, 
  bid int, 
  name varchar(30), 
  primary key(id)
) dbpartition by hash(id) tbpartition by hash(bid) tbpartitions 3;
查看该逻辑表的节点拓扑,可以看出在每个分库都创建了 3 张分表。
mysql> show topology from multi_db_multi_tbl;
查看该逻辑表的拆分规则,可以看出分库分表的拆分拆分方式均为哈希,分库的拆分键为 id,分表的拆分键为 bid。
mysql> show rule from multi_db_multi_tbl;




使用双字段哈希函数做拆分
适合于需要有两个拆分键,并且仅使用其中一个拆分键值进行查询时的场景。
注意事项
两个拆分键皆不能修改。
插入数据时如果发现两个拆分键指向不同的分库或分表时,插入会失败。


使用日期做拆分,按星期存储
按照一年 12 个月进行拆分
按照一个月 31 天进行拆分
按照一年 365 天进行拆分
按照一年 365 天进行拆分,路由到 10 张物理表


系统默认使用主键作为拆分字段。
CREATE TABLE prmkey_multi_tbl(
id int, 
name varchar(30), 
primary key(id)
) dbpartition by hash() tbpartition by hash() tbpartitions 3;


创建广播表:
CREATE TABLE brd_tbl(
  id int, 
  name varchar(30), 
  primary key(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 BROADCAST;
将 JOIN 操作下推到底层的 RDS(MySQL),来避免跨库 JOIN。


注意:如果修改的是拆分表,则不允许修改拆分字段。
增加列:
ALTER TABLE user_log
  ADD COLUMN idcard varchar(30);
增加索引:
ALTER TABLE user_log
  ADD INDEX idcard_idx (idcard);
删除索引:
ALTER TABLE user_log
  DROP INDEX idcard_idx;
修改字段:
ALTER TABLE user_log
  MODIFY COLUMN idcard varchar(40);


DRDS DDL 的执行是一个分布式处理过程,出错可能导致各个分片表结构不一致,所以需要进行手动清理。
步骤如下:https://help.aliyun.com/document_detail/51893.html?spm=a2c4g.11186623.6.596.a3dHbO
1,DRDS 会提供基本的错误描述信息,比如语法错误等。如果错误信息太长,则会提示用户调用 SHOW WARNINGS 的 SQL 命令来查看每个分库执行失败的原因。
2,可以通过 SHOW TOPOLOGY 命令来查看物理表的拓扑结构。SHOW TOPOLOGY的具体用法请参考 DRDS 控制指令。
3,使用 CHECK TABLE tablename指令来查看逻辑表是否创建成功。比如下面的例子展示了 multi_db_multi_tbl 的某个物理分表没有创建成功。
4,使用幂等的方式继续执行建表操作或删表操作,会创建或删除剩余的物理表。


拆分函数 描述 是否支持用于分库 是否支持用于分表
HASH 简单取模 ********
UNI_HASH 简单取模 ********
RIGHT_SHIFT 数值向右移 ********
RANGE_HASH 双拆分列哈希 ********
MM 按月份哈希
DD 按日期哈希
WEEK 按周哈希
MMDD 按月日哈希
YYYYMM 按年月哈希
YYYYWEEK 按年周哈希
YYYYDD 按年日哈希
YYYYMM_OPT 按年月哈希,改进型
YYYYWEEK_OPT 按年周哈希,改进型
YYYYDD_OPT 按年日哈希,改进型


当一张逻辑表的分库拆分方式与分表拆分方式不一致时,若 SQL 查询没有同时带上分库条件与分表条件,则 DRDS 在查询过程会产生全分库扫描或全分表扫描的操作。


DRDS 的拆分函数对各数据类型对支持情况有所不同,时间拆分函数只支持时间类型,其他类型支持非时间字段.https://help.aliyun.com/document_detail/57193.html?spm=a2c4g.11186623.6.598.2qjDGt




HASH  
使用要求
拆分键的数据类型必须是整数类型或字符串类型。
分库和分表都使用同一个拆分键进行 HASH 时,根据拆分键的键值按总的分表数取余。例如,有 2 个分库,每个分库 4 张分表,那么 0 库上保存分表 0~3,1 库上保存分表 4~7。某个键值为 15,15 % (2 * 4) = 7,所以 15 被分到 1 库的表 7 上。


UNI_HASH
分库和分表都使用同一个拆分键进行 UNI_HASH 时,仍然保证先根据分库键键值按分库数取余( HASH不是 ),再均匀散布到该分库的各个分表上
适用场景:两张逻辑表需要根据同一个拆分键进行分库,两张表的分表数不同,又经常会按该拆分键进行 JOIN 的场景。


SHOW RULE [FROM tablename] 语句
SHOW FULL RULE [FROM tablename] 语句 查看数据库下逻辑表的拆分规则,比 SHOW RULE 指令展示的信息更加详细。
SHOW TOPOLOGY FROM tablename 语句 查看指定逻辑表的拓扑分布,展示该逻辑表保存在哪些分库中,每个分库下包含哪些分表。
SHOW BROADCASTS 语句 查看广播表列表。
SHOW DATASOURCES 语句 查看底层存储信息,包含数据库名、数据库分组名、连接信息、用户名、底层存储类型、读写权重、连接池信息等。
SHOW NODE 语句 查看物理库的读写次数(历史累计数据)、读写权重(历史累计数据)。


show rule:查看数据库下每一个逻辑表的拆分情况;
show rule from tablename:查看数据库下指定逻辑表的拆分情况。


注意:仅拆分表和广播表指定了 AUTO_INCREMENT 后,DRDS 才会创建隐式的 Sequence。非拆分表并不会,非拆分表的 AUTO_INCREMENT 的值由底层 RDS(MySQL)自己生成。


由于拆分键的值的修改会涉及到数据在分片之间的移动,属于分布式事务(DRDS 默认不支持分布式事务),所以目前 DRDS 不允许修改拆分键的值。如果业务有此需求,可以尝试重新插入数据,再删除老数据。
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页