阿里云DRDS使用Q&A

归档下DRDS使用过程中的Q&A,感谢提供支持的DRDS研发团队的几位。

Q:考虑到日志中时间作为关键字段,在分区的时候除了考虑写时候的均衡以外还要考虑读时候尽可能的能用到分区裁剪。权衡后决定,使用日志时间和区域(根据日志中源IP映射得到)。即可用理解成根据日志中源IP进行适当写时候的均衡,在读数据的时候这两个字段一般也被认为是业务的重要字段,查询的时候会进行裁剪。潜在的问题是,如果用户只选择了时间段,未选择区域,这样可能会跨分区查询,不知道性能衰减会到什么程度,这在第四个问题中也有涉及。

A:?采用双维度(业务字段 + 时间)切分是 DRDS 的推荐方案,通常建议按业务字段(IP)分库,按时间字段分表。正如问题里说的,这个方案可以保证写入请求均衡到不同的服务器上;对查询,如果条件中包含了业务字段(IP),那查询会自动路由到单库上,达到最好的性能。如果查询未包含业务字段(IP), DRDS 的解决方案是并发转发请求到所有分库进行查询,延迟只有单库查询的 120% 左右。但是这种并发查询对下层 RDS 的查询压力比较高,不能支持较大并发(> 200)的查询。

Q:前面有问道DRDS会不会成为写数据的一个瓶颈,结合我们的数据特征,这个问题还要补充确认下。根据我们的数据特征,和数据查询时候的要,我们现在的分区键现在选择是记录的时间。这样选择读的时候能充分的运用到分区裁剪,但是写入的时候可能会出现一个分区特别忙,其他分区完全不用的情况。在DRDS中,虽然分区的的层面更高了,但原理应该是类似的。对于打标,DRDS作为代理将请求转发到一个RDS上,应该会导致一个时间这个实例非常忙,其他服务实例空闲的。按照我们预估的数据量,是否能够支持。

A:?是的,按照你们的业务场景,按照时间做分区的话,肯定是最近这段时间的写入最忙,其他分区没有写入。如果你们主要的压力在于写入,可以考虑不用时间作为分区key,比如采用分钟作为分区key,这样写入压力可以分散。但是目前我们最大规格的RDS可以支持14000的iops,10k的数据,qps应该能跑到5w+。你们一天3亿条写入,平均qps也就3000+,我觉得即使同时压在一个rds上压力还算可以接受的。(我笔记本的mysql写入也能上万qps的)

Q:?对照Oracle上索引的观点,RDS上建索引可以理解为本地索引,DRDS建的索引可以理解为全局索引。当然为了查询效率最好是根据检索条件建全局索引,我的问题是全局索引能支持的数量是多大,理论上来说索引的行数就是大表的行数,存储上能支持多大量,数据量多了会不会影响写的效率。

A:?是的,DRDS索引表可以看作一种全局索引。在DRDS上,索引表是被当作一种分表,分片存储在所有RDS物理分库上的。由于分片数量和主表相同,因此理论上能支持的数据量和主表相同,没有上限。当然,在写入索引表时也需要考虑是否存在热点,能否跟上主表的写入速度。

Q: 在DRDS中,我们可以创建的表进行操作,进行DDL操作、DML操作。这些数据最终都是存储在RDS上,我们是否可以访问像访问DRDS一样,来访问RDS上的的分库里的分表。看到也RDS也提供了和DRDS一样的DMS系统,但是登录时候使用DRDS的用户名、密码登录总是报错,用户名不存在。

A:?建议只登陆 RDS 进行数据查询和维护(备份、抽取、性能分析)操作。DRDS 在创建时会自动在 RDS 上创建特殊的账户和密码,这些账户/密码和创建 DRDS 时指定的账户/密码是不一样的,所以不能用DRDS的账户/密码登陆底层 RDS。另外,不要修改?DRDS 在 RDS 上自动创建的账户/密码,否则会导致DRDS访问RDS时出错。?建议在 RDS 上手工创建一个新账号,然后通过RDS授权功能允许新账号访问DRDS在RDS上自动创建的数据库。这样就可以用这个新账户登陆RDS和DMS进行管理。

Q:是否支持用户自定义函数,存储过程中的流程语句,我们可以再代码中来实现,但是根据业务需要自己开发了一些自定义函数,在sql中用的比较普遍,是否有办法支持。

A:?目前不支持自定义函数。

Q: DRDS支持的数据规模是什么级别。随着数据量的增长,能有办法来通过扩大集群数量来线性或者近似线性的来保证服务的性能。这些对我们业务是透明的吗?

A:规模大约在几百亿到千亿都可以,关键是查询需要尽可能是可分布的,比如大表的单表查询,大表join小表的查询都比较适合。DRDS本身是分布式代理,购买的时候,需要你们自行购买RDS,搭配DRDS使用。

Q:? DRDS我能理解成就是一个做好的mysql集群吗?使用上我和使用一个mysql实例没有差别,连一个固定的服务地址和端口,使用mysql的数据库驱动,你们来保证服务性能和数据质量。使用的约束,如不能写like‘%cc%‘这样会引起索引失效的sql语句等都和我们现在用mysql oracle没有差别。

A: DRDS可以看成是一个mysql的集群+前端分布式代理集群,使用上类似mysql,但是也有一些限制(比如不支持分布式事务)。主要的mysql客户端都可以直接使用。

Q: ?DRDS上面的索引、分区这些有没有什么限制,与我们业务的相关性有多少。有些业务相关的优化是我们来做,还是你们指导我们做。如索引、分区相关的。

A:原来的索引方式不变。分区key选择和业务相关很大,尽量选择业务上自然分布的字段来做分区键。

Q: DRDS中哪个表存在那个节点上是要在schema定义的时候干预吗?如果一个很大的表和一个稍微大的表做join这样的场景,结构设计上有什么限制没。

A:哪个表存在哪个阶段不需要干预,自动分布的。大表join小表,可以开启drds的小表复制

Q:采用了DRDS后,如何后台要做些任务来做些数据分析的工作,是用sql脚本来做吗?有没有类似Nosql上的类似MR的模型之类的支持。

A:尽量不要用数据库直接做分析,除非是简单的统计,复杂的分析建议采用阿里云的cdp服务,将drds导入到odps做分析,可以直接用sql做,也可以用mr。

Q: DRDS有c++,或者GO的数据库驱动吗?

A: drds没有驱动,因为兼容mysql协议,mysql的c驱动、go的驱动应该就可以跑

Q: 在前端使用了LBS后,后端的DRDS接收数据的服务实例会不会成为瓶颈,吞吐量有机制保证吗?LBS和DRDS中间的数据代理使我们写的,我们不打算在数据代理中做缓存等更多的事情,只是把LBS来的请求丢给DRDS。

?A: drds的服务实例也是集群,可以扩展,不需要缓存。

Q: 在阿里云中有没有使用OTS这种Nosql的来存储案例,如我能想到的数据存多份,根据查询列来构建rowkey这样的方式(类似关系数据库又高了个非聚集索引)。有比较成熟可靠的案例吗?就是我们的应用可能做不多的改动使得关系数据库的特征退化一些,往Nosql方向靠一点。

A:物联网类项目采用ots存储的不少。你说的很对,ots也可以用来做索引,比如全文检索的索引。

Q:阿里云里面有类似于vertica 或者greenplum这样的列数据库基础上提供的DB的产品吗?

A: 有,就是ads是类似的产品。但是更偏分析库。实时insert的生效时间目前还较长(1分钟)。

?Q: 关于数据存储和使用的要求,每天大概生成3亿条记录,每天记录大小10kb。应用中需要支持在几个重要列上进行类似关系数据库WHERE c1 > n AND? c2 LIKE ‘%ccc%’ AND ….?? ORDER BY c3,c4 这样的查询,并且还有一些现在应用中形成的表连接操作。数据特征是插入较多,几乎没有更新操作。了解过阿里云的OTS,从protobuffer定义的get查询中看到应该是类似HBase的只是RowKey的查询,不知道能否支持比较前面提到的稍微复杂的查询;DRDS能支持的数据规模是否能满足要求;ADS是否支持实时的数据写入,不想采用存储再导入的方式。

A:后端如果用ots(类似hbase)的话,只能用rowkey做前缀模糊查询,也不能排序(ots里面的数据缺省是按照key排序的),可能不能满足你们需求,但是一般来说海量数据的存储是很难完全当一个数据库用的,需要开发人员去适配。?几百亿的规模,可以考虑用drds做,可以支持主要的数据库查询,但是也需要你们开发人员注意,尽量优化sql,类似 c2 LIKE ‘%ccc%’ 这样的查询,虽然用的很方便,但是这种查询条件无法利用索引,会导致全表(或者其他条件限定的子集)扫描,性能有可能较差。ads插入不是实时的,适合做多维分析(最近会做到1分钟内生效),如果你们分析比较复杂可以考虑。

Q: 我们可以通过存储过程来访问DRDS吗?语法和mysql sp的语法一样。和其他DDL一样,存储过程的创建也只能在控制台上执行吗?

A:?drds目前不支持存储过程

Q:我们查询中有这样一个业务,大表的某个重要字段上次存储一个类似数组的内容{abcd;efgh;higk;lmno…},查询中查询是否包含某个数组元素。对于这种业务有两种选择,一种是在该字段上创建全文索引;另外一种方式就是把该数组展开成一个详细表,在查询的时候和大表做join。我们现在选择的是第二种,在大表上在时间字段上分区,在该展开表上也是同样的字段上做分区,但是这个详细表数量比大表更是要大N倍。请问在DRDS上对于这样的业务有没有什么好的支持方案,DRDS上支持好用的全文索引吗?

A:? drds不支持全文检索。你要做全文检索,可以用我们的opensearch服务,官网上有介绍。目前OpenSearch只能支持rds自动搜索,drds的搜索等需要应用自己做,也不复杂,就是插入drds的时候,同时插入一份到opensearch即可(update等等类似)。你可以把opensearch看成一个已经搭建好马上就能用的solr(当然支持规模远远超过solr很多倍)

Q: 我们还是趋向于用上面提到的第二种方案,就是用从表,自己分解数据。对从表和主表日志表用同样的分区键,在做join的时候,可以在分区内join,即不用服务器间的join。

A:可以用拆分主从表的方案。如果在查询场景中条件不包含分区键,并且匹配数组元素的记录数比较少,也可以采用双维度分表的方案:从表直接采用查询字段(数组元素)作为分区键。

Q:? 我们的业务在大表上查询条件比较多(4中提到还可能有一个展开表的join),索引的创建原则和一般单机的mysql比,有没有特别推荐的观点或者约束。DRDS上创建的索引都是分区的索引也都存在分区所在主机上吧,类似于oracle的本地索引吧,如果索引检索范围有点大,跨了分区(在DRDS中可能就是跨了几个RDS机器),在DRDS代理这里会不会有很大的性能下降,幅度大致是什么程度。

A:索引检索范围大没用关系的。但是如果返回的结果集很大性能就比较差。因为代理需要真实的汇总查询数据并排序。

A: DRDS 的索引优化有两个层面:第一个层面是需要在每个分区对应的RDS 上建立本地索引,保证分发到单机的SQL执行较快。第二个层面是:如果经常不按分区键查询,查询的量(并发,QPS)较大,可以在DRDS上建立专门的索引表,索引表按业务查询字段切分,冗余原表的主键、分区键(以及业务查询条件中会出现的字段)。这样以空间换时间的方式,可以把多机上的分布式查询变成若干次单机查询,提升整体查询性能。

Q: DRDS或者RDS是否提供查询计划,帮我们调查问题,进行sql优化。

A:? DRDS 本身支持 EXPLAIN + 原始 SQL 的方式展示 SQL 的执行计划。另外也提供了 TRACE的方式,跟踪 SQL 在 DRDS 上的执行性能;?跟踪结果可以用 SHOW TRACE 语句查看:

RDS 的查询计划支持与 MySQL 相同,支持 EXPLAIN 语句。另外可以使用 RDS 上的 DMS 控制台方便的进行 SQL 优化。

Q:我们需要对DRDS上的大表的某一个大字段的列进行分解,拆分到从表中。为了大表的写性能考虑,我们把这个操作想做成异步的,是否有一些任务调度的方式来支持我们在DRDS执行SQL,类似传统数据库的job。

A:目前 DRDS 本身暂不支持 job 功能,但是可以提供 java 代码 + 中间件的方式实现自定义 job 的功能,执行方式有定时调度,和异步触发两种方式(不过,相关的产品还没有进入阿里云售卖)。。

Q: ????上面几种规格的产品,在使用中间都可以提升规格吗?

A:? 固定规格的,比如ECS、RDS都可以提升规格。但是不能降。

Q: 这和我们传统方式上使用分区来对数据水平分割的思路是一样。我能这样理解吗?DRDS上数据水平分割物理上是通过分库和分表来实现,手头的资料有限,对DRDS这部分机制这部分描述讲的都比较粗。原来以为只有分表这一种:从DRDS上看逻辑上是一个大表,受管理的多个RDS上每个上都有一个同名的数据库实例,上面存储着这个大表的一部分。通过你的解释,是否在DRDS上数据水平分割有两级:分库和分表,前面我描述的其实是分库,在每个RDS上还通过传统的分区方式来实现分表。是这样吗?

A: DRDS 在阿里内部对应的产品TDDL是可以支持同时分库 + 分表的。可以认为基本原理与传统的数据水平分割方案一致。在云上为了简化运维,DRDS采用了一个的逻辑库默认在单台RDS上创建多个物理分库(现在是8个)的切分模式。根据创建方式,数据表有4种类型:只分布在第 0 分库(单表),每个分库建一张表放同一份数据(广播表),每个分库建一张表放不同数据(普通切分表),和每个分库重复建多张表(多维度切分表)。多维度切分最典型的场景就是业务id + 时间的切分方案:同一个业务 id 的数据分布在相同的物理分库上,按不同时间段存入不同的物理表。这冷热样数据分布比较均匀,并且支持业务 id 的分别查询与时间维度的范围查询。此外,多维度切分的功能是最近才推出的,还没体现在阿里云界面上。

Q:只有分表的说明,可以指定分表的键。在建表的时候也可以指定分库的键吗?这部分DDL的语句应该不能写SQL的,有详细的文档吗?除了我上面看到的链接。

A: 目前双维度切分(分别指定分库键与分表键)必须通过DRDS 的DDL语法(命令行界面)来操作,文档见链接:http://docs.aliyun.com/?spm=5176.7622920.9.2.hmQNdX#/pub/drds/user-guide/user_drds_ddl

?Q:DRDS中有“分区键必须是主键的一部分”这样的约束吗?

A: 目前没有,但是在使用上分区键是必须当作主键对待的。例如引用一条切分数据必须同时记录数据的主键和分区键。

?Q:引出一个问题,为了性能考虑,我们在主表插入的时候,从表的数据不生成。而是异步的来根据主表数据来构建从表数据。有点类似于异步索引(如果我愿意把从表的数据看成主表中那个大字段上建的索引的话)。我的问题是这个异步如何支持,是有类似数据库的job或者其更数据库的办法来支持,还是只能自己来写服务,在后台服务里来定时做这样的数据操作。

A: 目前这种索引表的数据同步有两种方案,第一种是应用通过ONS的事务消息机制,在写入主表的同时发出一条消息,再接受消息异步写入索引表。ONS的事务消息机制可以保证写入主表和消息投递同时成功;另一种方式是通过RDS的后台binlog做数据同步,目前DRDS内部提供的精卫组件可以自动实现这种同步机制,支持字段映射,复杂规则需要写java代码。另外一个限制就是精卫组件目前还没有上云,对用户不可见,需要内部手工配置。

Q: The table ‘/home/mysql/data3002/tmp/#sql_2153_0′ is full

A: rds–具体实例–参数设置中修改tmp_table_size

Q:The last packet successfully received from the server was 30,026 milliseconds ago

A:出现这个错误是因为查询的执行时间超过了SQL的超时时间(秒)。

对于必须的慢查询,请您参考下面的文档,增加hint调整SQL的超时时间。

比如:/*TDDL:socket_timeout=10000*/select count(*) from tddl5_users;

socket_timeout的单位是毫秒,如果socket_timeout=0,则该SQL不会超时。

Q:事务隔离级别如何设置

A:1.RDS的事务隔离级别是Read-commit,该隔离级别是架构统一的,不支持修改,能够实现性能和数据一致性的最大化 2.autocommit参数全局都是开启的,如您业务需要,可以在session级别设置set autcommit =0 来实现。

?Q:DRDS中如何查看每个表的数据量情况

A:进入每个RDS,在DMS–实例信息–表数据量统计中查看,但只能查看单个实例

进入RDRS的DMS,show table status;但是不能加过滤条件,而且显示行数有限

Q:不支持跨实例事务。

A:循环插入,由于数据量太大,会产生很多额外的消耗,暂时得不到更好的解决。

?Q:我表里面有个Name字段,我where Name?= ‘其中一个值’ 查不出任何数据,但是like就可以。

A:Name数据库定义长度为20,客户端插入字符长度为30,截断成20,可能是DRDS做了特殊处理,导致字段尾部有特殊字符。

?Q:建表失败,提示

执行失败,失败原因:DELETE command denied to user ‘lvjtsvog2′@’10.144.24.44′ for table ‘__drds__system__lock__’

A:尚未解决,原因未知。

Q:SQL执行速度不稳定

如:/*TDDL:socket_timeout=0*/select count(*) from big_table;

总行数:2100W

有时候执行几秒就返回结果,有时候需要几十分钟,甚至报错结束。

A:尚未解决,原因未知。

Q:执行统计过程报错

执行失败,失败原因:java.lang.IllegalArgumentException: Environment home /home/admin/drds-server/bin/bdbtmp/14404889553232056815436requestID.2 doesn’t exist

A:去掉order by子句,能执行成功,花费45秒,一方面没有排序,结果没有任何意义,满足不了需求,另一方面,执行时间太长,实用性很差。 当where order by等重要字段不是分库分表键时,数据量比较大,DRDS表现其实也是不好的,原理决定的,并未像想象那样挺一个无限强大的mysql。

完。

原创文章。为了维护文章的版本一致、最新、可追溯,转载请注明: 转载自idouba

本文链接地址: 阿里云DRDS使用Q&A


, , ,

No comments yet.

发表评论