天天看点

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

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

我们给出的方案如下:

对需要写入的大cell按照规定大小拆分,比如1m,比如10m的cell会被拆成10个1m的片段,称为s1,s2…s10

写入流程如下,针对某一行,逐个写入s1,s2…s10,每次写都要携带一个状态列,该状态列是保证读写一致性的重要手段,详细描述如下:

读取流程如下,

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

注意事项:

上面的方案是基于已有的sdk构建的,并不会修改sdk,所以该方案和sdk发布没有绑定关系;

如果写过程中应用进程down,会留下垃圾数据(读不会成功,因为部分数据校验会失败),用户可以选择主动清理,或者重新覆盖;

上述功能依赖新版本的限制项放开,近期会升级,紧急需求可以直接论坛发帖。