Table Store(原OTS) 如何支持大cell写入

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
对象存储 OSS,内容安全 1000次 1年
简介: TableStore设计目标是快速读写简单的表数据,所以对单列大小限制在2M Byte(一次写入超大cell会引起系统波动),对大部分用户来说,这个值都是足够的,但是仍然有一些用户碰到了如下问题:用户自身绝大部分cell都能保证低于2M,按时有极个别的Cell高达20M,此时如果专门为这些大cell

TableStore设计目标是快速读写简单的表数据,所以对单列大小限制在2M Byte(一次写入超大cell会引起系统波动),对大部分用户来说,这个值都是足够的,但是仍然有一些用户碰到了如下问题:用户自身绝大部分cell都能保证低于2M,按时有极个别的Cell高达20M,此时如果专门为这些大cell使用另外的存储无疑增加了系统复杂度,于是“如何利用Table Store存取大cell”就被提了出来。

我们给出的方案如下:

  1. 对需要写入的大cell按照规定大小拆分,比如1M,比如10M的cell会被拆成10个1M的片段,称为S1,S2…S10
  2. 写入流程如下,针对某一行,逐个写入S1,S2…S10,每次写都要携带一个状态列,该状态列是保证读写一致性的重要手段,详细描述如下:
a)    状态列由三部分组成,分别是写入ID,已经写完的片段集合,未写完的片段集合

b)    每次有大cell写入事件都生成新的UUID作为该次事件的ID,防止并发写带来的数据不一致

c)    第一次写,状态列内容如下{ID;;S1,S2…S10}, 里面有三个字段,以字符;分割,第一个是该次写入事件ID;第二个表示已经写入成功的cell片段,因为是第一次写,所以是空;第三个表示等待写入的cell片段,因为是第一次写,所以是S1,S2…S10都属于待写入

d)    第一次写成功后,S1 cell片段已经成功写入,此时继续写入S2片段,新状态列内容变为{ID;S1;S2,S3…S10}, 此时要使用TableStore的带条件更新功能,必须检查TableStore里面的状态列内容等于原状态列内容,然后才能写入新的状态列;否则说明有多线程并发写该列,要终止此次写入,重新开始

e)    按照上面办法依次写入S2,S3…S10片段
  1. 读取流程如下,

    a)    尝试读取状态列,如果读不到,说明该行没有大cell,跳过
    
    b)    读到了状态列之后,检查里面待写入cell片段是否为空,如果不为空,说明正在写入,等待并重试
    
    c)    如果状态列中待写入cell片段为空,说明写入已经完成,则开始读,每次读过来的状态列都要跟上一次读的状态列比较,如果发现不同,则重新读取
    
    d)    所有列读出来后,拼接返回给调用方
    

我们给出了示例的代码并测试了32M大cell写入,整个写事件耗时26s,读事件耗时13s。

注意事项:

  1. 上面的方案是基于已有的SDK构建的,并不会修改SDK,所以该方案和SDK发布没有绑定关系;
  2. 如果写过程中应用进程down,会留下垃圾数据(读不会成功,因为部分数据校验会失败),用户可以选择主动清理,或者重新覆盖;
  3. 上述功能依赖新版本的限制项放开,近期会升级,紧急需求可以直接论坛发帖。

源码:https://github.com/aliyun/aliyun-tablestore-big-cell-example

相关实践学习
阿里云表格存储使用教程
表格存储(Table Store)是构建在阿里云飞天分布式系统之上的分布式NoSQL数据存储服务,根据99.99%的高可用以及11个9的数据可靠性的标准设计。表格存储通过数据分片和负载均衡技术,实现数据规模与访问并发上的无缝扩展,提供海量结构化数据的存储和实时访问。 产品详情:https://www.aliyun.com/product/ots
相关文章
|
Web App开发 存储 NoSQL
阿里云表格存储(table store)属于存储类别还是数据库类别?
什么是表格存储? 表格存储是阿里云提供的一种数据服务。阿里云官方文档的定义如下: 表格存储(Table Store)是阿里云自研的NoSQL多模型数据库,提供海量结构化数据存储以及快速的查询和分析服务。
2748 0
|
10月前
|
存储 NoSQL JavaScript
OTS(Table Store)
OTS(Table Store)是阿里云提供的分布式NoSQL数据库服务,支持海量结构化数据的存储、查询和分析。OTS具有高可用、高性能、高扩展性和低成本等特点,适用于各种场景下的数据存储和处理,例如电商、物流、游戏等。
2523 2
|
存储 SQL 开发框架
阿里云物联网平台数据转发到表格存储(Table Store)示例参考
本文主要结合物模型的结构体类型属性数据,演示payLoad的设置及规则引擎的配置。
阿里云物联网平台数据转发到表格存储(Table Store)示例参考
|
存储 对象存储 开发者
DLA支持Parquet/ORC/OTS表的Alter Table Add Column
蛮多客户提过需求:要给一个表添加列,之前推荐的做法是让客户把表删掉重建,因为DLA是计算存储分离的,删掉的其实只是计算层的元数据,存储层的数据不会动,还是比较轻量级的一个操作。不过这种做法对于一些有特别多分区的表来说代价还是还是挺大的,要删掉所有的分区,而且可能会影响其它正在使用这个表的任务,为了解决用户的这个痛点,我们现在对部分数据源(Parquet/Orc)进行了的Alter Table Add Column的支持。
1805 0
DLA支持Parquet/ORC/OTS表的Alter Table Add Column
|
存储 NoSQL JavaScript
Tablestore入门手册--表(Table)管理
表管理接口概述 API 描述 createTable 创建表 deleteTable 删除表 listTable 列出实例下的所有表 updateTable 更新表(在表被创建之后,动态的更改表的配置或预留吞吐量)
1842 0
|
7月前
|
存储 索引
表格存储根据多元索引查询条件直接更新数据
表格存储是否可以根据多元索引查询条件直接更新数据?
64 3
|
SQL 存储 弹性计算
玩转Tablestore:使用Grafana快速展示时序数据
Grafana 是一款采用 go 语言编写的开源应用,主要用于大规模指标数据的可视化展现,是网络架构和应用分析中最流行的时序数据展示工具,可以通过将采集的数据查询然后可视化的展示,实现报警通知;Grafana拥有丰富的数据源,官方支持以下数据源:Graphite,Elasticsearch,InfluxDB,Prometheus,Cloudwatch,MySQ
1650 0