DRDS认识
接触
接触到DRDS是因为公司在去年入手了全国性的大型项目,刚毕业对于数据库的认知也仅仅停留在了RDBMS,就认识了一些mysql以及oracle的基础了解。
后来随着步入公司,普通的数据库早已不能满足公司项目的需求,这时候就认识RDS和DRDS
初认识
RDS(Relational Database Service,简称 RDS)可以理解为是一种数据库服务,可以完成一系列的服务操作,比如性能监控、防护措施、数据备份等等服务。而公司所采用的就是阿里云的RDS。
DRDS(Distributed Relational Database Service,简称 DRDS),可以理解为也是一种服务,只不过这个服务依赖于RDS。而于RDS不同则是它是分布式的一种中间件,其作用就是处理数据库容量、连接数、事务数以及性能瓶颈等。
使用DRDS
这是阿里官网的使用说明。
DRDS库的使用上于普通数据库上还是存在一些差别
使用流程
- 创建DRDS数据库:
- 拆分模式 :水平拆分和垂直拆分
- 存储类型 :POLARDB for MySQL 和 RDS for MySQL
- 字符集 :uft8、gbk、latin1或uft8mb4
- 创建DRDS表:
- 单库表
- 全局表(广播表)
- 分库表
- 分库分表
- 连接DRDS库(这里的里连接和正常的数据库一样,如果服务器安装了Mysql可以直接通过服务器连接DRDS库,也可以通过第三方客户端进行连接,例如Navicat)
- DRDS支持通过如下符合MySQL官方交互协议的第三方程序代码进行连接:
- JDBC Driver for MySQL (Connector/J)
- Python Driver for MySQL (Connector/Python)
- C++ Driver for MySQL (Connector/C++)
- C Driver for MySQL (Connector/C)
- ADO.NET Driver for MySQL (Connector/NET)
- ODBC Driver for MySQL (Connector/ODBC)
- PHP Drivers for MySQL (mysqli, ext/mysqli, PDO_MYSQL,PHP_MYSQLND)
- Perl Driver for MySQL (DBD::mysql)
- Ruby Driver for MySQL (ruby-mysql)
DRDS设计
-
拆分函数 描述 是否支持用于分库 是否支持用于分表 HASH 简单取模 是 是 UNI_HASH 简单取模 是 是 RIGHT_SHIFT 数值向右移 是 是 RANGE_HASH 双拆分列哈希 是 是 MM 按月份哈希 否 是 DD 按日期哈希 否 是 WEEK 按周哈希 否 是 MMDD 按月日哈希 否 是 YYYYMM 按年月哈希 是 是 YYYYWEEK 按年周哈希 是 是 YYYYDD 按年日哈希 是 是 YYYYMM_OPT 按年月哈希,改进型 是 是 YYYYWEEK_OPT 按年周哈希,改进型 是 是 YYYYDD_OPT 按年日哈希,改进型 是 是 建表语句示例:
##分库分表键会自动创建出对应列索引,不用再手动添加 create table `aaa` ( `id` bigint not null auto_increment, `dd` datetime not null default current_timestamp, `id2` bigint not null, `pp` varchar(32), primary key (`id`), key `idx_pp`(`pp`) ) engine=innodb dbpartition by hash(`id2`) tbpartition by mm(`dd`) tbpartitions 12;
-
广播表设计
广播表是在分库表与非分库表进行连接join的情况下,直接推到底层的RDS(Mysql),来避JOIN。
广播表就是复制一个0号库的这张非分库表到各个分库上去。dml操作都只能操作0库的表。类似于0号库的表创建了一个触发器,将0库主表的任何dml都会同步到各个分库这张数据相同的表中,达到一致,但有秒级延迟。建表语句示例:
##子句BROADCAST用来指定创建广播表 create table `brd_tbl`( `id` bigint auto_increment, `name` varchar(30), primary key(`id`) ) engine=innodb default charset=utf8 broadcast; ##广播表主要解决的分库表与非分库表垮库JOIN问题,但强制不要将频繁变更的表用做广播表,不然会造成大量的广播数据,导致性能下降和延迟。
-
DRDS的sql注意事项
- 在写查询语句的时候需带入分库分表键,不然查询会出现跨库。
- DRDS下应减少表连接,能适当添加冗余的就不用表连接关联,如果非要强制关联则不要超过2个表。
- 强制不要用子查询,将子查询转化成join连接。
- 强制少用左连接,右连接。
- 强制连接列应发生在分库列上,或每个表where条件后都明确分库的条件。
- 强制分库表与未分库的表连接要发生在广播表上。
- 强制关联列要有索引,小表与大表连接走NL连接。
-
分库分表其他注意事项
- 分库分表的分表键按日期的话要datetime类型。
- pk和uk在DRDS里只能保证局部唯一,比如只能保证单个表内唯一,不能保证全局。
- 更新最好一条一条的更新,不要大面积更新,尤其是在DRDS环境,可能存在跨库失败的问题,减少事务的使用。
- union在DRDS等于union all不具有去重功能。且5.6的union all也会产生临时表,所以建议不用。
- 跨月的分表查询会被转化成union all在5.6会引起临时表问题,所以不要跨月查询,跨月应分成两条SQL来编写。
总结
这里只说了DRDS建库以及在使用的部分,在阿里的DRDS控制台还有一堆的功能服务模块。
参考文档
PolarDB-X 云原生分布式数据库
阿里云RDS&DRDS初探 —— bluexiii