zoukankan      html  css  js  c++  java
  • 阿里云-DRDS(转)

    分库分表

    DRDS 在后端将数据量较大的数据表水平拆分到后端的每个 RDS 数据库中,这些拆分到RDS中的数据库被称为分库,分库中的表称为分表。DRDS 由每个分库负责每一份数据的读写操作,从而有效的分散了整体访问压力。

    拆分键

    即分库/分表字段。 DRDS 根据拆分键的值将数据表水平拆分到后端的每一个 RDS 分库里。DRDS 里除了可以定义分库键以外,每一张逻辑表都可以定义自己的拆分键。拆分键暂时只能是单个字段。如果分库键与分表键相同,那么在插入时只需要指定该分库/分表键。如果分库键与分表键不同则在插入时需要同时指定分库键和分表键。

    全表扫描

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

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

    2) SELECT / UPDATE / DELETE 语句如果 WHERE条件中没有包含拆分字段,则会进行全表扫描。

    3) 同一个拆分字段,AND 连接的条件个数只能为2,OR 连接的条件个数不限。

    4) 同一个拆分字段的条件可以包含多个值,但每个值只能对应一种比较关系。

     

    建表

    您在手工建表的时候需要指定几个关键参数:

    1) DBPARTITION BY hash(partition_key): 指定分库键和分库算法

    2) TBPARTITION BY(可选): 默认与DBPARTITION相同 指定数据与物理表使用什么方式进行映射(指定分表键)

    3) TBPARTITIONS(可选): 每个库上的物理表数目(默认为1),如您无需分表,则无需指定该字段

    4) BROADCAST(与DBPARTITION BY互斥): 指定建广播表

    示例

    如果您希望建一个分表,每个库含有3张物理表,切分方式为库按照id列进行哈希,物理表按照id2列进行哈希(会根据id列的值进行hash运算后的结果将表中数据分布在多个子库中,每个子库中的数据再根据id2列值的hash运算结果分布在3个物理表中)

    CREATE TABLE multi_db_multi_tbl
        (id int auto_increment, id2 int, name varchar(30), primary key(id))
        dbpartition by hash(id) tbpartition by hash(id2) tbpartitions 3;

    除了可以使用哈希来做映射策略,还可以使用日期类策略MM/DD/WEEK/MMDD来进行映射,但只限于对物理表的映射时可用,这种方式大部分用于将不同的日期的数据进行物理表集中,如业务员操作日志。

     公司A的日志系统记录营业员进行的所有操作,按照营业员id以及按照一周七天来切分

    CREATE TABLE user_log
        (userId int, name varchar(30), operation varchar(30), actionDate DATE)
        dbpartition by hash(userId) tbpartition by WEEK(actionDate) tbpartitions 7;

    SQL大类的限制与约束

    • 暂不支持用户自定义数据类型、自定义函数
    • 暂不支持视图、存储过程、触发器、游标
    • 暂不支持类似 BEGIN…END,LOOP...END LOOP,REPEAT...UNTIL...END REPEAT,WHILE...DO...END WHILE 等的复合语句
    • 暂不支类似 IF,WHILE 等流程控制类语句
    • 全面的DML支持,有限的DDL支持,有限的控制指令支持

    不支持的语法:

    • 受限于分布式事务
      • 跨分片操作, UPDATE/DELETE [ORDER BY] LIMIT
      • 跨分片操作, UPDATE A,B set A.s = B.s+1 WHERE A.ID = B.NAME , 非拆分字段之间的跨库JOIN
      • 拆分键变更, UPDATE A SET A.ID = 1 WHERE XXX, ID为拆分字段
      • 跨分片操作, INSERT A SELECT B WHERE B.ID > XX , 跨库导入导出数据
      • 跨库事物, 比如两次UPDATE不在一个分片上
    • 子查询限制
      • 暂不支持非where条件的correlate subquery
      • 暂不支持sql中带聚合条件和correlate subquery
     

    DRDS自定义指令

    • SHOW SEQUENCES / CREATE SEQUENCE / ALTER SEQUENCE / DROP SEQUENCE 【全局sequence管理】
    • SHOW PARTITIONS FROM TABLE 【查询表的拆分字段】
    • SHOW TOPOLOGY FROM TABLE 【查询表的物理拓扑】
    • SHOW BRAODCASTS 【查询所有广播表】
    • SHOW RULE [FROM TABLE] 【查询表拆分定义】
    • SHOW DATASOURCES 【查询后端DB链接池定义】
    • SHOW DBLOCK / RELEASE DBLOCK 【分布式LOCK定义】
    • SHOW NODE 【查询读写库流量】
    • SHOW SLOW 【查询慢SQL列表】
    • SHOW PHYSICAL_SLOW 【查询物理DB执行慢SQL列表】
    • TRACE SQL_STATEMENT / SHOW TRACE 【跟踪SQL执行,profile整个执行过程】
    • EXPLAIN [DETAIL/EXECUTE] SQL_STATEMENT 【分析DRDS执行计划和物理DB上的执行计划】
    • RELOAD USERS 【同步DRDS控制台用户信息到DRDS SERVER】
    • RELOAD SCHEMA 【清理DRDS对应DB库数据缓存,比如SQL解析/语法树/表结构缓存】
    • RELOAD DATASOURCES 【重建后端与所有DB的链接池】

    读写分离

    DRDS的读写分离功能是一种对应用透明的读写分离实现,应用在不需要修改任何代码的情况下,只需要在DRDS控制台中调整读权重,即可将流量按照需要的比例在主实例与多达5个只读实例之间调整。写权重则统一走主实例,不分流。

    落到只读实例上读所操作的数据都是从主实例上异步同步的,延迟在毫秒级别,所以个别要求实时性的SQL请通过DRDS hint 指定主库执行。

    DRDS的读写分离指的是对事务外的查询请求做读写分离, 事务中出现写请求后, 当次事务中所有读请求会走到主库,而不会按照设置的读写分离权重

  • 相关阅读:
    extjs grid renderer用法
    EventListenerList举例
    SQL语句的执行原理
    WPF操作邮箱,发送邮件
    wpf中DataGrid行色变换
    JS获取浏览器和荧屏分辨率
    将数据库的二进制字节转换成图片
    字符串操作类
    ios推送基于YII第三方组件的类库
    数组操作类
  • 原文地址:https://www.cnblogs.com/sandea/p/6809794.html
Copyright © 2011-2022 走看看