ACP互联网架构认证笔记-DRDS分布式关系型数据库服务
2018-10-19 本文已影响92人
freesan44
服务架构.png
DRDS的基础原理是Sharding,即数据分片,是典型的水平扩展分布式数据库模型,和传统单机数据库share anything架构不同,DRDS采用的是share nothing架构。
DRDS主要解决单机数据库容量瓶颈,单机数据库扩展困难,传统数据库使用成本高的问题,是高性价比,低运维成本的分布式数据库。主要场景是大规模在线数据操作,如 : 高并发实时交易,海量数据存储和访问,数据库云上备份容灾。DRDS兼容MySQL协议和语法,支持分库分表、平滑扩容、服务升降配、透明读写分离,分布式事务,分布式数据库生命周期管理。
share nothing架构核心思路利用普通的服务器,将单机数据拆分到底层的多个数据库实例上,通过统一的Proxy集群(DRDS 节点)进行SQL解析优化、路由和结果聚合,对外暴露简单唯一的数据库链接。
DRDS不支持Mysql视图、存储过程、跨库外键和级联删除,不支持自定义数据类型、流程控制类语句、自定义函数。
DRDS实例是由一组DRDS Server节点和底层存储组成的分布式集群,分为共享实例(规格只有8Core8G,使用公网地址)和专享实例(最小规格8Core16G,即两个DRDS节点,默认提供内网地址)
DRDS Server,即DRDS节点,主要作用是SQL解析优化、路由和结果归并。
DRDS可以进行购买创建实例,创建克隆实例(DRDS实例必须是专享实例),实例间数据库迁移,实例释放,实例变配,平滑扩容操作。
DRDS实例性能主要由DRDS规格和选择的RDS性能决定。DRDS可进行性能监控,重要监控指标有逻辑QPS和物理QPS,连接数,线程活跃数,CPU 利用率,RT逻辑和物理RT,网络输入和输出流量。
DRDS实例变配(变配实例的规格,主要是增加了处理节点和均摊QPS)实现服务的弹性扩展,解决DRDS性能问题(资源合理利用和解决瓶颈)。衡量DRDS实例规格的重要指标是QPS,QPS和CPU性能是正相关的,CPU利用率超出90%或持续超出80%说明DRDS性能瓶颈,需要实例升配。衡量DRDS数据库性能主要从响应时间(RT)和QPS两个指标进行衡量,RT一般是单个SQL性能,可SQL优化解决,QPS性能请选择实例变配。
SQL优化 : 主要原则让更多的计算可以下推到RDS/MySQL上执行,DRDS可制定执行计划,
DRDS是否需要平滑扩容(即增加RDS的数量)一般观察RDS的三个指标 : IOPS,CPU,磁盘空间。如果IOPS和CPU任何一个指标长期保持在80%以上或频繁收到报警信息,请尝试SQL优化,升高RDS规格或设置只读库,如果仍不能解决请进行扩容。RDS的磁盘容量剩余请尽量保持在30%以上。扩容有风险,扩容时请不要执行SQL,请在RDS低负载时和业务低谷期时进行,扩容不影响原有数据正常访问。
DRDS控制台地址为 https://drds.console.aliyun.com
DRDS控制台提供查看数据库具体信息、删除数据库、重置密码、只读用户管理等功能。
DRDS控制台不支持直接执行带有dbpartition 或 tbpartition 关键字的分布式DDL。
DRDS的数据库只能在控制台上面创建,需要选择至少一个(多个)RDS(类型为MySQL,状态为运行中)作为存储节点。
DRDS 目前不支持使用 DDL 语句直接建库,请登录 DRDS 控制台进行创建。具体操作指南请参考创建 DRDS 数据库。
如果选择的RDS区域和DRDS不相同,即跨区,会带来最高3ms的网络延迟。数据库创建类型分为拆分型(主要类型),非拆分型(将RDS数据库交由DRDS代理访问,实现读写分离)。拆分型的数据库,DRDS默认在1个RDS上创建8个物理库(不能更改),总物理库数量 = 选择RDS数量 * 8。分表数理论上没有限制,但受限于DRDS本身的规格资源。单个物理分表的容量不超过500万行数据。
删除数据库只会删除由DRDS所创建的数据库,不会影响原本在RDS上的数据库。
DRDS选择数据库连接池(提高了应用性能),主要作用是资源复用,提高系统响应效率,避免连接泄漏,DRDS可使用后端连接池数自动调整功能。
DRDS读写分离,对应用透明的设计,无需更改代码。拆分型只需在DRDS控制台中调整读权重比例(设置读策略),就可将读流量在主RDS和只读RDS中进行分流,写流量都在主RDS上,不分流。可通过SHOW NODE指令查看实际读流量分布。主RDS上是强读(强一致性,即强实时性),只读RDS上是弱读(存在毫秒级延迟),个别需要实时性、强一致性读的SQL可通过HINT实现。非拆分型直接选择RDS的数据库引入到DRDS做读写分离。读写分离只对查询有效,写请求和显式事务查询都在主RDS中。
DRDS HINT可指定在主RDS或只读RDS上执行SQL,HINT基于MySQL注释实现的。自定义的HINT作用读写分离(通过将SQL指定发给主RDS或自读RDS实现),切断延迟的只读RDS,自定义SQL超时时间,指定分库执行SQL,扫描全部分库分表。
每个DRDS数据库可以创建一个只读用户,只读用户只能进行SELECT操作。DRDS 里通过 CREATE USER 创建出来的账号只存在于 DRDS,跟 RDS 没有任何关系,也不会同步到后端的 RDS 中去。只读账号的名字是数据库名加上 _RO 后缀,比如数据库名是 easydb,只读账号的名字就叫 easydb_RO。
DRDS数据库的表操作权限有8个,CREATE、DROP、ALTER、INDEX、INSERT、DELETE、UPDATE、SELECT。进行相关操作必须要以上对应的权限,如TRUNCATE需要DROP权限,REPLACE需要INSERT和DELETE权限,INSERT ON DUPLICATE UPDATE需要INSERT和UPDATE权限。
DRDS广播表,(小表广播,主要提升JOIN效率,BROADCAST),DRDS将数据量小(小表),更新频率不高并设置为单表的表叫做广播表。广播表通过同步机制进行数据同步,有秒级延迟,广播表会在每一个分库中都会创建同样的表,但数据只存储在第一个分库上(即分库中数据不是全量复制)。
DRDS数据库水平拆分到每个RDS的数据库中,拆分的库叫分库,分库的表叫分表(也叫分片),拆分分为库级拆分(即进行分库),表级拆分(即进行分表)。通过拆分键实现,拆分键分为分库键(DB_PARTITION_KEY),分表键(TB_PARTITION_KEY)。可通过SHOW RULE查看数据库下每一个逻辑表的拆分情况。 通过SHOW TOPOLOGY查看逻辑表的拓扑分布(保存在哪些分库中,每个分库下包含哪些分表)。
dbpartition by hash(按hash分库),tbpartition by WEEK(支持按时间分表,但不支持按时间分库)。
tbpartitions :每个库上的物理表数目(默认为1),如无需分表,就无需指定该字段
DRDS拆分键是生成拆分规则的数据库字段,只支持单个字段,建好分库分表后拆分键不能变更,值不可修改。选择拆分键请尽量规避热点数据。拆分原则是 : 尽可能找到数据表中的数据在业务逻辑上的主体。
DRDS SQL路由,即按照拆分键和SQL语义把SQL分发到底层各个存储的分表进行执行。拆分键是DRDS中数据分布和SQL路由的凭证,DRDS将返回的数据按照原始SQL语义进行合并返回给用户。
DRDS中的sequence序列的特点是全局唯一,有序递增,分为三种类型 : Group,单元化Group,Simple。DRDS默认使用Group(不会单点,性能好),但序列不连续、可能会有跳跃段,不能循环,不会严格从起始值开始取值(即show sequences命令看到的不一定是最大值)。Simple(性能差),单调递增,有瓶颈,谨慎使用。
DRDS可以进行数据表管理,可查看表结构、设置全表扫描、删除表。DRDS可设置白名单。DRDS支持数据导入导出。DRDS支持分布式JOIN,但对复杂情况,如对大表之间的JOIN,执行代价高,速度过慢容易导致性能或者系统不可用。
全表扫描是SQL语句被分发到所有分库上执行,在执行带有WHERE条件的UPDATE、DELETE、SELECT语句时,SQL语句中没有使用拆分键或者虽指定拆分键但是范围太广会导致全表扫描。全表扫描默认是关闭的,响应较慢,避免在高并发业务场景中使用。
DRDS将执行时间超过1秒的SQL定义为慢SQL,分为逻辑慢SQL(应用发送到DRDS,使用SHOW FULL SLOW查看),物理慢SQL(DRDS发送到RDS,使用SHOW FULL PHYSICAL_SLOW查看)。SHOW SLOW可查看慢SQL,SHOW PROCESSLIST查看数据库实时执行信息。
DRDS支持由经典网络(Classic)切换到VPC(实例必须是共享实例,且地域和VPC的必须相同),切换后Classic类型的ECS无法访问DRDS,VPC环境的ECS才能访问VPC环境的DRDS。DRDS切换到VPC后,不会影响DRDS之下的RDS,RDS实例的域名会自动解析为VPC的IP段地址 ,因此RDS的网络类型不需要切换。
DRDS默认支持只单机事务,不支持跨库事务。分布式事务服务请单独申请开通。
DRDS的基础原理是Sharding,即数据分片,是典型的水平扩展分布式数据库模型,和传统单机数据库share anything架构不同,DRDS采用的是share nothing架构。
DRDS主要解决单机数据库容量瓶颈,单机数据库扩展困难,传统数据库使用成本高的问题,是高性价比,低运维成本的分布式数据库。主要场景是大规模在线数据操作,如 : 高并发实时交易,海量数据存储和访问,数据库云上备份容灾。DRDS兼容MySQL协议和语法,支持分库分表、平滑扩容、服务升降配、透明读写分离,分布式事务,分布式数据库生命周期管理。
share nothing架构核心思路利用普通的服务器,将单机数据拆分到底层的多个数据库实例上,通过统一的Proxy集群(DRDS 节点)进行SQL解析优化、路由和结果聚合,对外暴露简单唯一的数据库链接。
DRDS不支持Mysql视图、存储过程、跨库外键和级联删除,不支持自定义数据类型、流程控制类语句、自定义函数。
DRDS实例是由一组DRDS Server节点和底层存储组成的分布式集群,分为共享实例(规格只有8Core8G,使用公网地址)和专享实例(最小规格8Core16G,即两个DRDS节点,默认提供内网地址)
DRDS Server,即DRDS节点,主要作用是SQL解析优化、路由和结果归并。
DRDS可以进行购买创建实例,创建克隆实例(DRDS实例必须是专享实例),实例间数据库迁移,实例释放,实例变配,平滑扩容操作。
DRDS实例性能主要由DRDS规格和选择的RDS性能决定。DRDS可进行性能监控,重要监控指标有逻辑QPS和物理QPS,连接数,线程活跃数,CPU 利用率,RT逻辑和物理RT,网络输入和输出流量。
DRDS实例变配(变配实例的规格,主要是增加了处理节点和均摊QPS)实现服务的弹性扩展,解决DRDS性能问题(资源合理利用和解决瓶颈)。衡量DRDS实例规格的重要指标是QPS,QPS和CPU性能是正相关的,CPU利用率超出90%或持续超出80%说明DRDS性能瓶颈,需要实例升配。衡量DRDS数据库性能主要从响应时间(RT)和QPS两个指标进行衡量,RT一般是单个SQL性能,可SQL优化解决,QPS性能请选择实例变配。
SQL优化 : 主要原则让更多的计算可以下推到RDS/MySQL上执行,DRDS可制定执行计划,
DRDS是否需要平滑扩容(即增加RDS的数量)一般观察RDS的三个指标 : IOPS,CPU,磁盘空间。如果IOPS和CPU任何一个指标长期保持在80%以上或频繁收到报警信息,请尝试SQL优化,升高RDS规格或设置只读库,如果仍不能解决请进行扩容。RDS的磁盘容量剩余请尽量保持在30%以上。扩容有风险,扩容时请不要执行SQL,请在RDS低负载时和业务低谷期时进行,扩容不影响原有数据正常访问。
DRDS控制台地址为 https://drds.console.aliyun.com
DRDS控制台提供查看数据库具体信息、删除数据库、重置密码、只读用户管理等功能。
DRDS控制台不支持直接执行带有dbpartition 或 tbpartition 关键字的分布式DDL。
DRDS的数据库只能在控制台上面创建,需要选择至少一个(多个)RDS(类型为MySQL,状态为运行中)作为存储节点。
DRDS 目前不支持使用 DDL 语句直接建库,请登录 DRDS 控制台进行创建。具体操作指南请参考创建 DRDS 数据库。
如果选择的RDS区域和DRDS不相同,即跨区,会带来最高3ms的网络延迟。数据库创建类型分为拆分型(主要类型),非拆分型(将RDS数据库交由DRDS代理访问,实现读写分离)。拆分型的数据库,DRDS默认在1个RDS上创建8个物理库(不能更改),总物理库数量 = 选择RDS数量 * 8。分表数理论上没有限制,但受限于DRDS本身的规格资源。单个物理分表的容量不超过500万行数据。
删除数据库只会删除由DRDS所创建的数据库,不会影响原本在RDS上的数据库。
DRDS选择数据库连接池(提高了应用性能),主要作用是资源复用,提高系统响应效率,避免连接泄漏,DRDS可使用后端连接池数自动调整功能。
DRDS读写分离,对应用透明的设计,无需更改代码。拆分型只需在DRDS控制台中调整读权重比例(设置读策略),就可将读流量在主RDS和只读RDS中进行分流,写流量都在主RDS上,不分流。可通过SHOW NODE指令查看实际读流量分布。主RDS上是强读(强一致性,即强实时性),只读RDS上是弱读(存在毫秒级延迟),个别需要实时性、强一致性读的SQL可通过HINT实现。非拆分型直接选择RDS的数据库引入到DRDS做读写分离。读写分离只对查询有效,写请求和显式事务查询都在主RDS中。
DRDS HINT可指定在主RDS或只读RDS上执行SQL,HINT基于MySQL注释实现的。自定义的HINT作用读写分离(通过将SQL指定发给主RDS或自读RDS实现),切断延迟的只读RDS,自定义SQL超时时间,指定分库执行SQL,扫描全部分库分表。
每个DRDS数据库可以创建一个只读用户,只读用户只能进行SELECT操作。DRDS 里通过 CREATE USER 创建出来的账号只存在于 DRDS,跟 RDS 没有任何关系,也不会同步到后端的 RDS 中去。只读账号的名字是数据库名加上 _RO 后缀,比如数据库名是 easydb,只读账号的名字就叫 easydb_RO。
DRDS数据库的表操作权限有8个,CREATE、DROP、ALTER、INDEX、INSERT、DELETE、UPDATE、SELECT。进行相关操作必须要以上对应的权限,如TRUNCATE需要DROP权限,REPLACE需要INSERT和DELETE权限,INSERT ON DUPLICATE UPDATE需要INSERT和UPDATE权限。
DRDS广播表,(小表广播,主要提升JOIN效率,BROADCAST),DRDS将数据量小(小表),更新频率不高并设置为单表的表叫做广播表。广播表通过同步机制进行数据同步,有秒级延迟,广播表会在每一个分库中都会创建同样的表,但数据只存储在第一个分库上(即分库中数据不是全量复制)。
DRDS数据库水平拆分到每个RDS的数据库中,拆分的库叫分库,分库的表叫分表(也叫分片),拆分分为库级拆分(即进行分库),表级拆分(即进行分表)。通过拆分键实现,拆分键分为分库键(DB_PARTITION_KEY),分表键(TB_PARTITION_KEY)。可通过SHOW RULE查看数据库下每一个逻辑表的拆分情况。 通过SHOW TOPOLOGY查看逻辑表的拓扑分布(保存在哪些分库中,每个分库下包含哪些分表)。
dbpartition by hash(按hash分库),tbpartition by WEEK(支持按时间分表,但不支持按时间分库)。
tbpartitions :每个库上的物理表数目(默认为1),如无需分表,就无需指定该字段
DRDS拆分键是生成拆分规则的数据库字段,只支持单个字段,建好分库分表后拆分键不能变更,值不可修改。选择拆分键请尽量规避热点数据。拆分原则是 : 尽可能找到数据表中的数据在业务逻辑上的主体。
DRDS SQL路由,即按照拆分键和SQL语义把SQL分发到底层各个存储的分表进行执行。拆分键是DRDS中数据分布和SQL路由的凭证,DRDS将返回的数据按照原始SQL语义进行合并返回给用户。
DRDS中的sequence序列的特点是全局唯一,有序递增,分为三种类型 : Group,单元化Group,Simple。DRDS默认使用Group(不会单点,性能好),但序列不连续、可能会有跳跃段,不能循环,不会严格从起始值开始取值(即show sequences命令看到的不一定是最大值)。Simple(性能差),单调递增,有瓶颈,谨慎使用。
DRDS可以进行数据表管理,可查看表结构、设置全表扫描、删除表。DRDS可设置白名单。DRDS支持数据导入导出。DRDS支持分布式JOIN,但对复杂情况,如对大表之间的JOIN,执行代价高,速度过慢容易导致性能或者系统不可用。
全表扫描是SQL语句被分发到所有分库上执行,在执行带有WHERE条件的UPDATE、DELETE、SELECT语句时,SQL语句中没有使用拆分键或者虽指定拆分键但是范围太广会导致全表扫描。全表扫描默认是关闭的,响应较慢,避免在高并发业务场景中使用。
DRDS将执行时间超过1秒的SQL定义为慢SQL,分为逻辑慢SQL(应用发送到DRDS,使用SHOW FULL SLOW查看),物理慢SQL(DRDS发送到RDS,使用SHOW FULL PHYSICAL_SLOW查看)。SHOW SLOW可查看慢SQL,SHOW PROCESSLIST查看数据库实时执行信息。
DRDS支持由经典网络(Classic)切换到VPC(实例必须是共享实例,且地域和VPC的必须相同),切换后Classic类型的ECS无法访问DRDS,VPC环境的ECS才能访问VPC环境的DRDS。DRDS切换到VPC后,不会影响DRDS之下的RDS,RDS实例的域名会自动解析为VPC的IP段地址 ,因此RDS的网络类型不需要切换。
DRDS默认支持只单机事务,不支持跨库事务。分布式事务服务请单独申请开通。
DRDS DDL 拆分函数对分库分表的支持情况
DRDS 是一个支持既分库又分表的数据库服务。目前 DRDS 分库函数与分表函数的支持情况如下:
拆分函数 | 描述 | 是否支持用于分库 | 是否支持用于分表 |
---|---|---|---|
HASH | 简单取模 | 是 | 是 |
UNI_HASH | 简单取模 | 是 | 是 |
RIGHT_SHIFT | 数值向右移 | 是 | 是 |
RANGE_HASH | 双拆分列哈希 | 是 | 是 |
MM | 按月份哈希 | 否 | 是 |
DD | 按日期哈希 | 否 | 是 |
WEEK | 按周哈希 | 否 | 是 |
MMDD | 按月日哈希 | 否 | 是 |
YYYYMM | 按年月哈希 | 是 | 是 |
YYYYWEEK | 按年周哈希 | 是 | 是 |
YYYYDD | 按年日哈希 | 是 | 是 |
YYYYMM_OPT | 按年月哈希,改进型 | 是 | 是 |
YYYYWEEK_OPT | 按年周哈希,改进型 | 是 | 是 |
YYYYDD_OPT | 按年日哈希,改进型 | 是 | 是 |