Apache Cassandra 数据存储模型

我们在《Apache Cassandra 简介》文章中介绍了 Cassandra 的数据模型类似于 Google 的 Bigtable,对应的开源实现为 Apache HBase,而且我们在 《HBase基本知识介绍及典型案例分析》 文章中简单介绍了 Apache HBase 的数据模型。按照这个思路,Apache Cassandra 的数据模型应该和 Apache HBase 的数据模型很类似,那么这两者的数据存储模型是不是一样的呢?本文将为大家解答这些问题。我们从 KeySpace -> Table -> Partition -> Row -> Cell 顺序介绍。本文基于 Apache Cassandra 3.11.4 源码进行介绍的,不同版本可能有些不一样。

Table & KeySpace

Cassandra 中的 KeySpace 概念和 RDBMS 里面的 DataBase 概念很类似,一个 KeySpace 包含多张表,一般将有关联的数据表放到同一个 KeySpace 下面。KeySpace 创建的时候可以指定副本策略,副本因子以及是否启用 CommitLog 机制(类似 HBase 中的 WAL)。

Cassandra 中表的概念和 RDBMS 很类似。不同的是在 Cassandra 中属于同一张表的数据在物理上是分布在不同节点上存储的,同一张表由多个 Partition 组成。

Partitions

Cassandra 一般是由多台节点组成的,每台节点负责一定范围的,如果使用 Murmur3hash 的时候,每个节点负责的 Token 类似于下面那样:

所以 Token 范围为 -9223372036854775808 ~ -4611686018427387904 的数据存储在 A 节点;同理,Token 范围为 -4611686018427387903 ~ -1 之间的数据存储在 B节点,其他类似;每个 Token 范围由多个 Partition 构成,每个 Partition 由一行或多行数据组成,Partition 类似下面的:

其中,username 为 Partition key;type 为 Clustering key。那么在这种情况下,username = iteblog 的两条数据构成一个 Partition;另外两条构成分别构成两个 Partitions。在底层存储每个 Partition 格式如下:

从上图可以看出,一个 Partition 是由 PartitionHeader、零个或多个 Row (格式在后面介绍)以及 EndPartition 三部分组成的。EndPartition 这个用于标记 Partition 结束,只占用一个字节,并使用 0x00000001 标记。PartitionHeader 的格式如下:

  • Partition Key 就是我们建表的时候指定的,由于 Partition Key 长度使用两字节表示,所以 Cassandra 中 Partition Key 长度必须小于等于 65535 字节。
  • Local Delete Time 是删除发生时的服务器时间(以秒为单位),与 gc_grace_seconds 进行比较以确定何时可以清除它。当与 TTL 一起使用时,localDeletionTime 是数据到期的时间。共占四个字节;
  • Marked For Delete At 记录删除的时间戳,时间戳小于此值的数据被视为已删除,共占用八字节。
  • Static Row:如果我们建表的时候有 Static 字段,那么标记为 Static 的列会在这里存储。从这里也可以看出,partition key 相同的数据 Static 列只会保存一份数据。

在底层存储中,多个 Partition 组成一个 SSTable(Sorted-String Table)文件。那么同一个 SSTable 文件中的数据数据是如何组织的呢?答案是按照 Partition Key 计算得到的 Token 升序排序的。

Row

上面看出,Partition 里面包含了零个或多个 Row,这些 Row 对应的 Partition Key 是一样的。非 Static 的 Row 在磁盘存储的格式如下:

上面除了 flags 、Row Body Size 、 Previous Row Body Size 以及 Primary Key Liveness Timestamp 这四个字段一定会存在,其他字段需要满足条件才会存储。下面对上面字段进行介绍:

  • flags:Row 的标记信息,主要用于标记当前 Row 是否存在时间戳、TTL、被删除、是否包含所有的列等信息。flag 字段占用一个字节,
  • hasExtendedFlags:当前 Row 是否含有 Static 列,存在才会有数据;
  • Clustering info:每个 Row 包含零个或多个 Clustering 相关的信息。Clustering 信息就是我们创建表的时候指定的 Clustering key 信息。每个 Clustering Info 在持久化的时候会先存储头部信息,标记当前 Clustering key 是否为空、是否为 null 以及是否有值等信息;然后根据数据类型将值存下来,如果当前 Clustering key 的值占用字节非固定,还需要存储当前 Clustering key 值的字节数。
  • Row Body Size:当前 Row Body 的大小,Row Body 包含 primary key 的 liveness 信息、Row 是否删除等信息以及 Cell 的信息。
  • Previous Row Body Size:前一个 Row Body 的大小,这个主要用于加速反向查询的,不过当前并没有使用;
  • Primary Key Liveness Timestamp:primary key 的 Liveness 用于确定行是否还活着或已经死了(没有 live cells 并且 liveness 为空)。这个字段主要用于存储当前 Row 的 Liveness 时间戳。注意,持久化到磁盘的时间戳是相对于当前 Memtable 最小时间戳的值。
  • Primary Key Liveness TTL:这个字段主要用于存储当前 Row 的 Liveness TTL 信息。也是相对于当前 Memtable 最小 TTL 的值
  • Primary Key Liveness LocalExpirationTime:当前 Liveness 的 ExpirationTime,也是相对时间;
  • Row Marked For Delete At:当前 Row 的删除时间,也是相对时间,精确到毫秒;
  • Row Local Deletion Time:当前被标记为 tombstone 时服务器的时间,也是相对时间,精确到秒;
  • Columns Bitmap:从 Cassandra 3.x 开始,列的信息已经不保存到数据文件里面了,列的信息是保存在对应 SSTable 的 md-X-big-Statistics.db 文件中。这个字段是用于标记当前行哪些列存在,哪些列不存在。如果列存在则标记为0;如果列不存在则标记为1;如果列全部存在,直接标记为0。当表的字段数小于64个的时候,直接使用一个 long 类型的数据来存储这个 bitmap。如果大于等于64个,处理方案稍微复杂一些:
    先保存一个标记位,标记当前表拥有的字段个数大于等于64;

如果存在的列没有占总列数的一半,则按照全部列的顺序保存存在的列在排序后列的索引位置;
如果存在的列占总列数超过一半,则按照全部列的顺序保存不存在的列在排序后列的索引位置。
可见,Cassandra 通过将列的信息(包括列的名称、类型、表名、keySpace等信息)保存到对应 SSTable 的 md-X-big-Statistics.db 文件中,相应的行只保存列是否存在的标记信息,这个可以节省存储空间的占用。注意,HBase 存储数据的时候每个 Cell 都需要保存列名称和列族名称的。

非 Static Row 的底层存储格式已经在前面描述过,对于 Static Row 除了没有上图的 Clustering info 信息,其余都一样,所以这里就不介绍了。

上图中最后有 N 个 Cell,那多个 Cell 之间的顺序是如何保证的呢?答案是按照列的名称字典顺序升序排序的。比如我们表的定义如下:

CREATE TABLE iteblog (user_id text,type text,action text,username text,age text,email text,PRIMARY KEY(user_id)
);

那么 Cell 的顺序排列如下:

action -> age -> email -> type -> username

这个排序是通过 BTree 实现的,Row 的实现类为 BTreeRow。

Cell

Cell 就是每列数据的底层实现,Cell 里面包含了列的定义信息,比如是否被删除、是否过期、是否设置了时间戳等。在 Cassandra 里面,Column 有 Simple 和 Complex(CASSANDRA-8099引入的) 之分。non-frozen collection 或 UDT(用户自定义类型)的列是 ComplexColumn(Complex Cell)。

Simple Cell(Simple Column)的底层格式

我们正常使用的列就是属于这种类型的,它的底层存储格式如下:

  • flags:这个 Cell 的 flag 标记,主要用于标记当前 Cell 是否有值、是否被删除、是否过期、是否使用 Row 时间戳、是否使用 Row TTL 等信息。flag 字段占用一个字节,每位的含义代表如下:
  • timestamp:当前 Cell 的时间戳,Cassandra 中我们可以对每列设置时间戳;
  • deletion time:当前 Cell 的删除时间;
  • ttl:当前 Cell 的 TTL,Cassandra 中我们可以对每列设置 TTL,代表这个 Cell 保留多长时间;
  • value:当前 Cell 的值;

Complex Cell(Complex Column)的底层格式

如果列属于 non-frozen collection 或 UDT(用户自定义类型),那么这个属于 Complex Cell,它的底层存储格式如下:

可以看出,Complex Cell 和 Simple Cell 大部分很类似,下面只介绍不一样的地方:

  • Complex Cell Marked For Delete At & Complex Cell Local Deletion Time:这两个属性和前面的类似,只不过针对 Complex Cell 而言的。
  • Complex Cell Counts:Complex Cell 的个数;
  • path:当前 Cell 的路径。

在 Cassandra 中, Complex Cell 的实现类是 ComplexColumnData。


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

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

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

相关文章

解决Navicat 出错:1130-host . is not allowed to connect to this MySql server,MySQL

use mysql; select host,user from user; update user set host% where userroot; flush privileges;

Knative Eventing 中 Channel 如何注入默认 Provisioner

场景 通常的在创建Broker时,我们需要通过 spec.ChannelTemplate 指定使用某个具体的 Channel Provisioner。例如这样的Broker: apiVersion: eventing.knative.dev/v1alpha1 kind: Broker metadata:name: pubsub-channel spec:channelTemplate:provisioner:apiVers…

删库跑路事件发生,SaaS云服务如何守护数据安全

作者 | 蒋敏峰责编 | Carol封图 | CSDN付费下载于视觉中国近日,某SaaS服务商/微盟遭遇员工删库跑路,服务器出现大面积故障,一时间让平台上的几百万家商户生意基本停摆。这一事件发生后,不管是厂商还是平台上的用户,都在…

express模板引擎 html,Express使用html模板的代码分析

express默认使用jade模板,可以配置让其支持使用ejs或html模板。1.安装ejs在项目根目录安装ejs.npminstallejs2、引入ejsvarejsrequire(ejs);//我是新引入的ejs插件3、设置html引擎app.engine(html,ejs.__express);设置视图引擎app.set(viewengine,html)…

记一次吐血的ping: unknown host

背景: 某客户的ECS,ping域名提示unknown host,ping ip则可以通,ping的时候抓包没有解析的包出去,是解析的问题吗?1,测试ping域名以及抓包发现没有dns的解析包出去 # ping www.baidu.com -c 1 p…

Nacos Committer 张龙:Nacos Sync 的设计原理和规划

与你同行,抬头便是星空。 本文整理自Nacos Committer 张龙的现场分享,阿里巴巴中间件受权发布。 随着 Nacos 1.0.0 稳定版的发布,越来越多的企业开始在测试/预演/生产环境中逐步部署 Nacos。目前,除了部分企业已处于转型分布式架…

Linux 会成为主流桌面操作系统吗?

整理 | 屠敏出品 | CSDN(ID:CSDNnews)2020 年 1 月 14 日,微软正式停止了 Windows 7 系统的扩展支持,这意味着服役十年的 Windows 7,属于它的时代真的终结了,说不出的再见,只能怀恋。…

阿里搜索推荐系统又双叒叕升级了?!

搜索导购产品作为搜索的流量入口,承载了为用户导购推荐、搜索流量分流的重要功能。主要产品包括:首页底纹、下拉推荐、搜索发现、导航、历史搜索等。经过几年的探索和积累,各个产品越发地成熟,机器学习算法广泛地应用于导购产品中…

处理网络超时问题的最佳实践

对于云上的用户来说,业务日志里面报超时问题处理起来往往比价棘手,因为1) 问题点可能在云基础设施层,也有可能在业务软件层,需要排查的范围非常广;2) 这类问题往往是不可复现问题,抓到现场比较难。在本文里…

BZip2Codec压缩、Map端压缩控制、Reduce端压缩控制……都在这份Hadoop整合压缩知识点里了!...

作者 | Tai_Park责编 | Carol来源 | CSDN 博客封图 | CSDN付费下载于东方 IC今天来聊聊 Hadoop 的压缩。压缩:原始数据通过压缩手段产生目标数据,要求输入和输出的内容是一样的(大部分),但体积是不一样的。对于单机用户…

WAF+SLB负载不均衡案例分享

问题演变过程 时间点1:高防WAFSLB2台ECS 时间点2:高防WAFSLB4台ECS 问题描述 在时间点1时,没有发现明显的负载不均衡的情况。在时间点2时,出现大部分请求都打到了其中一台ECS上。需要定位问题原因 问题梳理 问题链路 是SLB后…

架构整洁之道, 看这一篇就够了!

程序的世界飞速发展,今天所掌握的技能可能明年就过时了,但有些知识历久弥新,掌握了它们,你在程序的海洋中就不会迷路,架构思想就是这样的知识。 本文是《架构整洁之道》的读书心得,作者将书中内容拆解后再组…

2019年度CSDN博客之星TOP10榜单揭晓,你上榜了吗?

培根说,『读书造成充实的人,会议造成未能觉悟的人,写作造成正确的人』。在短信短视频快速迭代的快时代,更深度的思考、更正确的实践,更成体系的写作与分享,尤显可贵。这里,每一篇博文都是开发者…

(进阶篇_01)Oracle数据同步3种场景

文章目录一、场景分析二、实战2.1. 创建原表表结构初始化数据2.2. 创建目标表表结构2.3. 同步前效果图2.4. 连接串2.5. 执行同步2.6.执行后效果图2.7.操作记录三、实战场景2(第1种)3.1. 原表表结构初始化数据3.2. 目标表表结构3.3. 连接字符串3.4. 数据同…

html背景图片横屏,CSS背景颜色 背景图片 居中 重复 固定样式background经验篇

我们使用CSS Background样式属性,可以设置网页背景单一颜色、网页背景为图片、网页背景图片居中于网页、网页背景图片网页固定位置、网页背景图片中网页中重复平铺等css背景样式介绍与案例讲解。扩展阅读:CSS背景Background基础:http://www.d…

借助混沌工程工具 ChaosBlade 构建高可用的分布式系统

在分布式架构环境下,服务间的依赖日益复杂,可能没有人能说清单个故障对整个系统的影响,构建一个高可用的分布式系统面临着很大挑战。在可控范围或环境下,使用 ChaosBlade 工具,对系统注入各种故障,持续提升…

etcd 在超大规模数据场景下的性能优化

概述 etcd是一个开源的分布式的kv存储系统, 最近刚被cncf列为沙箱孵化项目。etcd的应用场景很广,很多地方都用到了它,例如kubernetes就用它作为集群内部存储元信息的账本。本篇文章首先介绍我们优化的背景,为什么我们要进行优化, 之后介绍et…

时间复杂度的表示、分析、计算方法……一文带你看懂时间复杂度!

作者 | OverRedMaple责编 | Carol来源 | CSDN 博客封图 | CSDN付费下载于东方 IC如果你还在发愁究竟怎么计算时间复杂度和空间复杂度,那你是来对地方了!名词解释:在计算机科学中,时间复杂性,又称时间复杂度&#xff0c…

ThreadPoolExecutor中的keepAliveTime详解

文章目录一、keepAliveTime的概念二、keepAliveTime的设置方法2.1. 通过构造函数设置2.2. 通过setKeepAliveTime方法动态设置三、线程是如何根据keepAliveTime进行销毁的阅读这篇文章,你将会知道: keepAliveTime的概念。 keepAliveTime是如何设置的。 线…

OPPO数据中台之基石:基于Flink SQL构建实数据仓库

本文整理自 2019 年 4 月 13 日在深圳举行的 Flink Meetup 会议,分享嘉宾张俊,目前担任 OPPO 大数据平台研发负责人,也是 Apache Flink contributor。本文主要内容如下: OPPO 实时数仓的演进思路;基于 Flink SQL 的扩…