当前位置: 首页 > news >正文

TableStore: 海量结构化数据分层存储方案

前言

表格存储是阿里云自研分布式存储系统,可以用来存储海量结构化、半结构化的数据。表格存储支持高性能和容量型两种实例类型。高性能使用SSD的存储介质,针对读多写多的场景都有较好的访问延时。容量型使用的是SSD和SATA混合的存储介质。对写多的场景,性能接近高性能,读方面,如果遇到冷数据产生读SATA盘的话,延时会比高性能上涨一个量级。在海量数据存储场景下,例如时序场景,我们会希望最新的数据可以支持高性能查询,较早的数据的读写频次都会低很多。这时候一个基于表格存储高性能和容量型存储分层的需求就产生了。

方案细节

表格存储近期对外正式发布的全增量一体的通道服务(参考文档),通道服务基于表格存储数据接口之上的全增量一体化服务。通道服务为用户提供了增量、全量、增量加全量三种类型的分布式数据实时消费通道。有了通道服务,我们可以很方便的构建从高性能实例下的表到容量型表之间的实时数据同步,进而可以在高性能表上使用表格存储的特性数据生命周期(参考文档),根据业务需求设置一个合理的TTL。
总体来说就可以构建一个如下图所示的架构:

wz1.png
整个数据的流动过程如下:

  1. 业务写入端直接写入高性能实例
  2. 高性能实例中的数据通过通道服务同步至容量型
  3. 高性能实例中的老数据自动过期,减少存储量占用
  4. 用户查询请求根据时序查询条件,判断是否是近期数据

    1. 近期数据查询进入高性能,毫秒级别返回
    2. 较早数据查询进入容量型,几十毫秒后返回

代码和操作流程:

在高性能实例上根据业务主键需求创建数据表,并设置合理的数据TTL,然后在容量型下创建相同的schema的表用来持久化存储所有数据。

wz2.png

然后在通道页面创建一个全增量类型的通道:

wz3.png

通过控制台可以简单清晰的查看到同步的状态,并发,进度等信息:

wz4.png


下面贴一下通过Tunnel进行复制同样schema表TableStore表的Sample代码:

func main () {
    //高性能实例的信息
  tunnelClient := tunnel.NewTunnelClient("", "", "", "")
  //容量型实例的信息
    client := tablestore.NewClient("", "", "", "")

    //配置callback到SimpleProcessFactory,配置消费端TunnelWorkerConfig
    workConfig := &tunnel.TunnelWorkerConfig{
        ProcessorFactory: &tunnel.SimpleProcessFactory{
            ProcessFunc: replicateDataFunc,
            CustomValue: client,
        },
    }

    //使用TunnelDaemon持续消费指定tunnel
    daemon := tunnel.NewTunnelDaemon(tunnelClient, "", workConfig)
    err := daemon.Run()
    if err != nil {
        fmt.Println("failed to start tunnel daemon with error:", err)
    }
}

func replicateDataFunc(ctx *tunnel.ChannelContext, records []*tunnel.Record) error {
    client := ctx.CustomValue.(*tablestore.TableStoreClient)
    fmt.Println(client)
    for _, rec := range records {
        fmt.Println("tunnel record detail:", rec.String())
        updateRowRequest := new(tablestore.UpdateRowRequest)
        updateRowRequest.UpdateRowChange = new(tablestore.UpdateRowChange)
        updateRowRequest.UpdateRowChange.TableName = "coldtable"
        updateRowRequest.UpdateRowChange.PrimaryKey = new(tablestore.PrimaryKey)
        updateRowRequest.UpdateRowChange.SetCondition(tablestore.RowExistenceExpectation_IGNORE)
        for _, pk := range rec.PrimaryKey.PrimaryKeys {
            updateRowRequest.UpdateRowChange.PrimaryKey.AddPrimaryKeyColumn(pk.ColumnName, pk.Value)
        }
        for _, col := range rec.Columns {
            if col.Type == tunnel.RCT_Put {
                updateRowRequest.UpdateRowChange.PutColumn(*col.Name, col.Value)
            } else if col.Type == tunnel.RCT_DeleteOneVersion {
                updateRowRequest.UpdateRowChange.DeleteColumnWithTimestamp(*col.Name, *col.Timestamp)
            } else {
                updateRowRequest.UpdateRowChange.DeleteColumn(*col.Name)
            }
        }

        _, err := client.UpdateRow(updateRowRequest)
        if err != nil {
            fmt.Println("hit error when put record to cold data", err)
        }
    }
    fmt.Println("a round of records consumption finished")
    return nil
}

总结

通过通道服务,存储在表格存储中的结构化,半结构化数据可以实时流出,进行加工,萃取,计算或进行同步。如果是想进一步降低冷数据的存储成本,可以参考这篇文章把表格存储的数据备份到OSS归档存储。       

相关文章:

  • GitHub Draft Pull请求支持新的协作流程
  • 常用技巧
  • 原生js实现倒计时页面刷新不重新加载
  • word快捷键
  • 干货驾到:Redis5.0支持的新功能说明
  • ENVI图像几何校正
  • 彻底搞懂call、apply和bind
  • Vue对象变化检测
  • corejava基础知识(5)-集合
  • Docker最全教程之使用Docker搭建Java开发环境(十七)
  • 51Talk发布Q4财报:净营收2.981亿元,菲教1对1业务增长63%,将聚焦非一线城市
  • 分布式数据中的坑(一)Master-Slave架构
  • 人工智能实战第二次作业_李大
  • bat实现往hosts文件追加内容
  • 使用高德,百度地图时 填写的安全码SHA1获取方式
  • 自己简单写的 事件订阅机制
  • (三)从jvm层面了解线程的启动和停止
  • ECMAScript入门(七)--Module语法
  • JavaScript学习总结——原型
  • MobX
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • Rancher如何对接Ceph-RBD块存储
  • Redash本地开发环境搭建
  • spring + angular 实现导出excel
  • vue.js框架原理浅析
  • 从0实现一个tiny react(三)生命周期
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 将 Measurements 和 Units 应用到物理学
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 前端存储 - localStorage
  • 区块链将重新定义世界
  • 思考 CSS 架构
  • 听说你叫Java(二)–Servlet请求
  • RDS-Mysql 物理备份恢复到本地数据库上
  • 带你开发类似Pokemon Go的AR游戏
  • ​插件化DPI在商用WIFI中的价值
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (1)(1.13) SiK无线电高级配置(六)
  • (4)(4.6) Triducer
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (rabbitmq的高级特性)消息可靠性
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (规划)24届春招和25届暑假实习路线准备规划
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • 、写入Shellcode到注册表上线
  • ... 是什么 ?... 有什么用处?
  • .gitattributes 文件
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .net Application的目录
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .net 按比例显示图片的缩略图
  • .Net6 Api Swagger配置