阿帕奇卡桑德拉

可用

4.1 说明

Apache Cassandra是属于 NoSQL 系统类的分布式数据库管理系统,旨在为以哈希形式呈现的庞大数据阵列创建高度可扩展且可靠的存储。

最初,该项目是在 Facebook 的内部开发的,并于 2009 年转移到 Apache 软件基金会的旗下,该组织继续开发该项目。部署基于 Cassandra 的工业解决方案,为 Cisco、IBM、Cloudkick、Reddit、Digg、Rackspace、华为、Netflix、Apple、Instagram、GitHub、Twitter 和 Spotify 等公司提供服务。到 2011 年,为 Cassandra 下的单个数据库提供服务的最大服务器集群拥有 400 多台机器并包含超过 300 TB 的数据。

它使用Java 语言编写,实现了类似于 DynamoDB 的分布式哈希系统,随着数据量的增加提供几乎线性的可扩展性。它使用基于列族的数据存储模型,这与 MemcacheDB 等系统的不同之处在于,它能够存储具有多层嵌套的哈希值,后者仅将数据存储在键值对中。

属于容错型DBMS的范畴:放在数据库中的数据自动复制到分布式网络的几个节点甚至均匀分布在几个数据中心。当一个节点发生故障时,它的功能会被其他节点即时获取,向集群添加新节点和更新 Cassandra 版本都是即时完成的,无需额外的手动干预和其他节点的重新配置。

但是,强烈建议为每个节点(包括现有节点)重新生成密钥(标签),以保持负载平衡的质量。在节点数量成倍增加(2倍、3倍等)的情况下,可以避免为现有节点生成密钥。

4.2 数据模型

在 Cassandra 术语中,应用程序使用键空间,这对应于关系模型中数据库模式的概念。这个键空间可以包含多个列族,对应关系表的概念。

反过来,列族又包含列(column),这些列使用记录(row)中的键(row key)进行组合。列由三部分组成:名称(column name)、时间戳(timestamp)和值(value)。记录中的列是有序的。与关系数据库不同,记录(就数据库而言,这些是行)是否包含与其他记录中名称相同的列没有限制 - 没有。

列族可以有多种,但在本文中我们将省略这个细节。同样在最新版本的 Cassandra 中,可以使用 CQL 语言执行定义和更改数据(DDL、DML)的查询,以及创建二级索引。

cassandra中存储的具体值标识为:

  • 键空间是对应用程序(域)的绑定。允许您在同一集群上托管来自不同应用程序的数据;
  • 列族是对查询的绑定;
  • key是对集群节点的绑定。键确定保存的列将在哪些节点上结束;
  • 列名是对记录中属性的绑定。允许您在一个条目中存储多个值。

每个值都与一个时间戳相关联,这是一个用户指定的数字,用于解决记录期间的冲突:数字越大,将考虑较新的列,并且在比较时会覆盖旧列。

4.3 数据类型

按数据类型:键空间和列族是字符串(名称);timestamp 是一个 64 位数字;键、列名和列值是一个字节数组。Cassandra 也有数据类型的概念。这些类型可以由开发人员在创建列族时指定(可选)。

对于列名,这称为比较器,对于值和键,它称为验证器。第一个定义了列名允许的字节值以及如何对它们进行排序。二是什么字节值对列和键值有效。

如果未设置这些数据类型,则 cassandra 会存储这些值并将它们作为字节字符串 (BytesType) 进行比较,因为实际上,它们是在内部存储的。

数据类型是:

  • BytesType:任何字节字符串(无验证)
  • AsciiType : ASCII 字符串
  • UTF8Type : UTF-8 字符串
  • IntegerType : 任意大小的数字
  • Int32Type : 4 字节数字
  • LongType : 8字节数字
  • UUIDType:UUID 类型 1 或 4
  • TimeUUIDType:类型 1 UUID
  • DateType : 8 字节时间戳值
  • BooleanType:两个值:true = 1 或 false = 0
  • FloatType : 4字节浮点数
  • DoubleType : 8字节浮点数
  • DecimalType:具有任意大小和浮点数的数字
  • CounterColumnType : 8 字节计数器

在cassandra中,所有的数据写入操作始终都是重写操作,即如果列族中已经存在一个具有相同key和name的列,并且时间戳大于保存的,则该值被覆盖. 记录的值永远不会改变,只是更新的列带有新的值。

写入 cassandra 比读取更快。这改变了设计中采用的方法。如果我们从设计数据模型的角度考虑 cassandra,那么更容易将列族想象成一个物化视图,而不是一个表 - 一种表示某些复杂查询数据的结构,但将其存储在磁盘。

与其尝试使用查询以某种方式组合数据,不如尝试将此查询可能需要的所有内容存储在目标系列中。也就是说,有必要不从实体之间的关系或对象之间的关系方面来处理,而是从查询方面来处理:需要选择哪些字段;记录应该按什么顺序排列;应该一起请求与主要数据相关的哪些数据——所有这些都应该已经存储在列族中。

一条记录的列数理论上限制为 20 亿。这是一个简短的题外话,更多细节可以在设计和优化技术一文中找到。现在让我们深入研究将数据保存到 cassandra 并读取它的过程。

评论
  • 受欢迎
你必须先登录才能发表评论
此页面还没有任何评论