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

前言

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

方案细节

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


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

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

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

代码和操作流程:

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

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

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


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

func main () {//高性能实例的信息tunnelClient := tunnel.NewTunnelClient("", "", "", "")//容量型实例的信息client := tablestore.NewClient("", "", "", "")//配置callback到SimpleProcessFactory,配置消费端TunnelWorkerConfigworkConfig := &tunnel.TunnelWorkerConfig{ProcessorFactory: &tunnel.SimpleProcessFactory{ProcessFunc: replicateDataFunc,CustomValue: client,},}//使用TunnelDaemon持续消费指定tunneldaemon := 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归档存储。  


原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/518783.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java-基本运算符

运算符 public class Demo01 {public static void main(String[] args) {// 二元运算符// Ctrl D : 复制当前行到下一行int a 10;int b 20;int c 25;int d 25;System.out.println(ab);System.out.println(a-b);System.out.println(a*b);System.out.println(a/(double)b); …

蚂蚁金服终端实验室演进之路

0. 背景 作为国民级 App,支付宝客户端需要为亿级用户提供多元化的服务,因此应用的稳定性与可靠性面临巨大的挑战,需要不断地完善和优化。 今天,让我们站在服务质量的全方位监控与优化的角度,从蚂蚁终端实验室的演进之…

2020年边缘计算最新前沿报告:如何与核心云、5G、AI协同?如何打造新业态和部署运营?...

作者 | 唐汝林、陈琪责编 | 屠敏头图 | CSDN 下载自东方 IC数据来源 | 华信咨询设计研究院有限公司在数字经济的时代浪潮中,作为关键生产要素的数字技术的快速变革已成为新常态。正当人工智能开始崭露头角时,云计算的边缘化延伸趋势又成为了另一个新焦点…

Springboot/Cloud集成Sentinel进阶实战

文章目录一、自定义限流处理1. 自定义处理类2. 请求一次测试3. 重新配置流控规则4. 重新测试5. controller二、方法限流处理2.1. 创建接口2.2. 创建接口实现类2.3. 接口调用2.4. 请求2.5. 设置流控规则一、自定义限流处理 自定义限流文档 1. 自定义处理类 package com.gblfy…

若依SQL Server开发使用教程

1. sys_menu表中的将菜单ID修改为自动ID,解决不能增加菜单的问题,操作流程如下: 解决方案如下 菜单栏->工具->选项 点击设计器,去掉阻止保存要求更新创建表的更改选项,点确认既可以保存了 2 自动生成代码找不表的解决方案…

java基础 代理

1.代理是什么? 代理(Proxy)是一种设计模式。提供了对目标对象另外的访问方式,即通过代理对象访问目标对象。 有一个类我们无法更改,但我们希望在原有类上加上我们自己的逻辑(增强),这时就可以…

使用EMR Spark Relational Cache跨集群同步数据

背景 Relational Cache是EMR Spark支持的一个重要特性,主要通过对数据进行预组织和预计算加速数据分析,提供了类似传统数据仓库物化视图的功能。除了用于提升数据处理速度,Relational Cache还可以应用于其他很多场景,本文主要介绍…

Java-自增自减运算符 初始Math类

public class Demo04 {public static void main(String[] args) {// -- 自增 自减 一元运算符int a 3;int b a; // 先赋值, 在运行 a a 1System.out.println(a); // 4System.out.println(b); // 3int c a; // 先运算a a 1,在赋值System.out.p…

异构计算黄金时代下,超强异构计算服务器FP5468G2将会带来哪些变革?

就在几年前,计算领域还是通用计算的天下。此一时,彼一时,随着计算密集型领域的快速崛起,面对移动互联网、大数据和云计算需求的爆炸式增长,传统的单一CPU方案越来越力不从心。另一方面,半导体技术在纵向提速…

基于External-DNS的多集群Ingress DNS实践

概要 External-DNS提供了编程方式管理Kubernetes Ingress资源的DNS的功能,方便用户从Ingress管理DNS解析记录。而在kubernetes federation v2环境中,使用External-DNS可以快速的管理多个联邦集群的Ingress DNS解析,降低用户的操作成本。下面…

在执行Dockerfile时出现Get https://registry-1.docker.io/v2/错误的解决方案

文章目录1. 登录阿里云2. 找到镜像加速3. 使用阿里云镜像1. 登录阿里云 没有就注册,不要文为什么要用阿里云镜像,没办法,就是快! https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 2. 找到镜像加速 复制内容: {&qu…

Java基础--反射

1.概念 什么是反射? (1)Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法。 本质是JVM得到class对象之后,再通过class对象进行反编译,从而获取对象的各种信息…

Java-逻辑运算符、位运算符

逻辑运算符 // 逻辑运算符 public class Demo05 {public static void main(String[] args) {// 与(and) 或(or) 非(取反)boolean a true;boolean b false;// 逻辑与运算: 两个变量都为真,结果才为 trueSystem.out.println("a &&…

做可交互的统计图表,这套图形语法不容错过

选好可视化 “一图胜千言”,是最直观的数据可视化魅力。以图表来传达和沟通信息,其效率远超枯燥乏味的数据表达。 有需求就有市场。数据可视化崭露头角后,各个厂商出备的产品、解决方案,开发者自研的可视化工具、操作平台都如雨…

Centos7 docker 安装 zookeeper

# 默认下载最新版本 docker pull zookeeper# 指定版本下载 docker pull zookeeper:3.5.8# 创建zk容器 docker run -di -p 2181:2181 --namezk zookeeper:3.5.8# 查看正在运行的容器 docker ps# 防火墙开放2181端口firewall-cmd --zonepublic --add-port2181/tcp --permanent# 重…

10分钟带你逆袭kafka之路

作者:故事凌 1. kafka概述 ##1.1 kafka简介 Apache Kafka 是一个快速、可扩展的、高吞吐的、可容错的分布式“发布-订阅”消息系统, 使用 Scala 与 Java 语言编写,能够将消息从一个端点传递到另一个端点,较之传统的消息中 间件…

漫谈分布式计算框架

如果问 mapreduce 和 spark 什么关系,或者说有什么共同属性,你可能会回答他们都是大数据处理引擎。如果问 spark 与 tensorflow 呢,就可能有点迷糊,这俩关注的领域不太一样啊。但是再问 spark 与 MPI 呢?这个就更远了。…

.class和getClass()的区别

.class方法和getClass()的区别,这两个比较像,常弄混。它们二者都可以获取一个唯一的java.lang.Class对象,但是区别在于: 1、.class用于类名,getClass()是一个final native的方法,因此用于类实例 2、.clas…

Java-三元运算符

public class Demo07 {public static void main(String[] args) {int a 10;int b 20;ab; // a a ba-b; // a a - bSystem.out.println(a); // 10// 字符串连接符 , String, 有String类型,会把后面的转为StringSystem.out.println(""ab); // 1020Syst…

UI2CODE再进化!结合Redux的框架升级!

背景 UI2CODE的目标是通过分析视觉稿得到对应的代码,让AI提高开发效率。然而过去静态化页面的产出,不能得到业务场景的需求。针对于此,我们以UI2CODE自动化开发为基底,结合Redux的消息机制,将自动化生成的维度提升到页…