DRDS初认识

DRDS认识

接触

接触到DRDS是因为公司在去年入手了全国性的大型项目,刚毕业对于数据库的认知也仅仅停留在了RDBMS,就认识了一些mysql以及oracle的基础了解。
后来随着步入公司,普通的数据库早已不能满足公司项目的需求,这时候就认识RDS和DRDS

初认识

RDS(Relational Database Service,简称 RDS)可以理解为是一种数据库服务,可以完成一系列的服务操作,比如性能监控、防护措施、数据备份等等服务。而公司所采用的就是阿里云的RDS
DRDS(Distributed Relational Database Service,简称 DRDS),可以理解为也是一种服务,只不过这个服务依赖于RDS。而于RDS不同则是它是分布式的一种中间件,其作用就是处理数据库容量、连接数、事务数以及性能瓶颈等。

使用DRDS

这是阿里官网的使用说明
DRDS库的使用上于普通数据库上还是存在一些差别

使用流程

  1. 创建DRDS数据库:
    • 拆分模式 :水平拆分和垂直拆分
    • 存储类型 :POLARDB for MySQL 和 RDS for MySQL
    • 字符集 :uft8、gbk、latin1或uft8mb4
  2. 创建DRDS表:
    • 单库表
    • 全局表(广播表)
    • 分库表
    • 分库分表
  3. 连接DRDS库(这里的里连接和正常的数据库一样,如果服务器安装了Mysql可以直接通过服务器连接DRDS库,也可以通过第三方客户端进行连接,例如Navicat)
  4. 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设计

  1. 分库分表键的种类

    拆分函数描述是否支持用于分库是否支持用于分表
    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;
    
  2. 广播表设计
      广播表是在分库表与非分库表进行连接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问题,但强制不要将频繁变更的表用做广播表,不然会造成大量的广播数据,导致性能下降和延迟。
    
  3. DRDS的sql注意事项

    • 在写查询语句的时候需带入分库分表键,不然查询会出现跨库。
    • DRDS下应减少表连接,能适当添加冗余的就不用表连接关联,如果非要强制关联则不要超过2个表。
    • 强制不要用子查询,将子查询转化成join连接。
    • 强制少用左连接,右连接。
    • 强制连接列应发生在分库列上,或每个表where条件后都明确分库的条件。
    • 强制分库表与未分库的表连接要发生在广播表上。
    • 强制关联列要有索引,小表与大表连接走NL连接。
  4. 分库分表其他注意事项

    • 分库分表的分表键按日期的话要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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值