DRDS是aliyun商业版本的TDDL。提供分库分表,读写分离等操作。 类似于Mycat等分库分表中间件。 对应用透明

产品架构

https://help.aliyun.com/document_detail/117771.html

基本操作

  1. 创建DRDS

    实例列表

    实例基本信息

  2. 创建数据库

    建库

  3. 挂载RDS实例(DRDS私有实例或者单独购买RDS挂载)

    新购RDS建库

DRDS 扩展性原理

https://help.aliyun.com/document_detail/118010.html

DRDS全局二级索引

https://help.aliyun.com/document_detail/142733.html

全局二级索引使用

DRDS 对 MySQL DDL 语法进行了扩展,增加定义 GSI 的语法。使用方式与在 MySQL 上创建索引一致:

创建二级索引:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 建表时定义 GSI
CREATE TABLE t_order (
 `id` bigint(11) NOT NULL AUTO_INCREMENT,
 `order_id` varchar(20) DEFAULT NULL,
 `buyer_id` varchar(20) DEFAULT NULL,
 `seller_id` varchar(20) DEFAULT NULL,
 `order_snapshot` longtext DEFAULT NULL,
 `order_detail` longtext DEFAULT NULL,
 PRIMARY KEY (`id`),
 GLOBAL INDEX `g_i_seller`(`seller_id`) COVERING (`id`, `order_id`, `buyer_id`, `order_snapshot`) dbpartition by hash(`seller_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 dbpartition by hash(`order_id`);
1
2
3
4
# 添加 GSI
CREATE UNIQUE GLOBAL INDEX `g_i_buyer` ON `t_order`(`buyer_id`) 
    COVERING(`seller_id`, `order_snapshot`) 
    dbpartition by hash(`buyer_id`) tbpartition by hash(`buyer_id`) tbpartitions 3

DRDS自定义语句

DRDS自定义一些特有的语句,用于 帮助用户方便使用DRDS

https://help.aliyun.com/document_detail/29678.html

Sequence介绍

https://help.aliyun.com/document_detail/71261.html?spm=a2c4g.11186623.6.700.6e221ce8j2oPCj

使用场景

这几种 Sequence 都保证全局唯一,均可以应用在主键列唯一索引列

  • 大部分场景下建议选用 Group Sequence
  • 如果有跨实例或跨库分配全局唯一数字序列的需求,可以选用单元化 Group Sequence
  • 如果业务上能接受整体趋势上的宏观自增,不介意微观上的不保证自增,且不想依赖数据库的分配机制,则 Time-based Sequence 可能是合适的选择;
  • 如果业务强依赖连续的 Sequence 值,此时只能使用 Simple Sequence(注意 Simple Sequence 的性能问题)。

以创建一个起始值是 100000,步长为 1 的 Sequence 为例。

  • 如果采用 Simple Sequence,则会严格产生100000、100001、100002、100003、100004、.....、200000、200001、200002、200003、......这样的序列(全局唯一、连续、单调递增)。Simple Sequence 会保证持久化,即使发生单点问题,服务重启后依然会在断点继续产生 Sequence 值,中间不会产生跳跃段。Simple Sequence 的机理是每产生一个值都要进行一次持久化操作,因此性能并不是很好。
  • 如果采用 Group Sequence单元化 Group Sequence,产生的序列有可能是200001、200002、200003、200004、100001、100002、100003、......这样的序列。

注意:

  • Group Sequence 起始值并不会严格从设定的参数(本例中是100000)开始,但保证比该参数大。本例中是从 200001 开始取值的。
  • Group Sequence 保证全局唯一,但是会有跳跃段。比如 Group Sequence 的某个节点失效,或者某个连接只取了一部分值,然后该连接被关闭了,都会产生跳跃段。该例中 200004 和 100001 之间产生了跳跃段。
  • 单元化 Group Sequence 跨实例或跨库的全局唯一性,必须通过指定相同的单元数量和不同的单元索引来保证。

广播表

子句BROADCAST用来指定创建广播表。广播表是指将这个表复制到每个分库上,在分库上通过同步机制实现数据一致,有秒级延迟。这样做的好处是可以将 JOIN 操作下推到底层的 RDS(MySQL),来避免跨库 JOIN。SQL 优化方法 详细讲述了如何使用广播表来做 SQL 优化。

1
2
3
4
5
CREATE TABLE brd_tbl(
  id int, 
  name varchar(30), 
  primary key(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 BROADCAST;

SQL优化

https://help.aliyun.com/document_detail/144294.html?spm=a2c4g.11186623.6.665.2e196f96JbVRjV

Hint

1
2
3
4
5
6
7
/*+TDDL:CMD_EXTRA(INSERT_SELECT_LIMIT=3000000)*/
/*+TDDL:CMD_EXTRA(MAX_UPDATE_NUM_IN_GSI=100000)*/
/*+TDDL:socket_timeout=xxx*/
不关心对查询性能的影响可以使用hint更改限速
/*+TDDL:cmd_extra(ENABLE_ASYNC_DDL=true, PURE_ASYNC_DDL_MODE=true,GSI_BACKFILL_SPEED_LIMITATION=50000,GSI_CHECK_SPEED_LIMITATION=50000)*/
绕过GSI的主表的主键必须是自增校验
/*+TDDL: cmd_extra(GSI_IGNORE_RESTRICTION=true)*/

https://help.aliyun.com/document_detail/71270.html?spm=a2c4g.11186623.6.735.628d5f76NiqCTU


image-20200326215345433

image-20200326215444189

image-20200326215457961

image-20200326215405849

image-20200326215511136