[译文]Cassandra实例

CASSANDRA学习笔记 (三) 创建keyspace 键空间 cassandra的键空间(keyspace)相当于数据库,我们创建一个键空间即是创建了一个数据库。 语句 CREATE KEYSPACE <identifier> WITH <properties> CREATE KEYSPACE语句有两个属性:replication和durable_writes。 这里我们先学习一下repication的概念: (1)什... 阅读详情

原文: http://www.rackspacecloud.com/blog/2010/05/12/cassandra-by-example/#
原作者:Eric Evan
原文发布日期:May 12, 2010
译者:王旭(http://wangxu.me/blog/ , @gnawux)
翻译时间:2010年5月15,25,26日

近来 Cassandra 备受瞩目,很多人正在评估是否可以应用 Cassandra。由于这些人更多的追求速度,相应的,我们的文档就过于粗浅了。这些文章中,最差的是为有关系数据库基础的人解释Cassandra数据模型的那些。

Cassandra 数据模型实际和传统的数据库差异非常大,足够让人眩晕,而且很多误解都需要修正。

有些人把这个数据模型描述成存放map的map,或对于super column的场景,是存放map的map的map。这些解释经常用类似 JSON 标记的视觉辅助展示方法来进行佐证。其他人则把列族看做是系数表,还有人把列族看作是存放列对象的集合容器。甚至有人有时把列看走势三元组。我觉得所有这些解释都不够好。

问题在于很难去用类比的方法来确切解释一个新的东西,而且如果比较的不准确的话常常把人搞糊涂。我仍然期望有人能解释清楚这个数据模型,但同时我觉得确切的例子可能更容易说明白一些。

 

Twitter

尽管 Twitter 本身就是 Cassandra 的一个实际的应用场景,它仍然是一个不错的教学实例,因为它众所周知而且易于抽象。在例子中,和很多站点一样,每个用户都有一份用户数据(显示名称、密码、email等),这些信息链接到朋友(译注:用户follow的人)和 follower(译注:follow用户的人)。此外,如果没有那些短 tweets 的话也就不是 twitter 了,tweet每条140个字符,它们都关联着诸如时间戳和惟一的id这样的元数据,这个id我们可以从URL里看到。

现在我们在一个关系数据库里来直接进行建模,我们首先需要一个表来存放用户。

1CREATE TABLE user (
2    id INTEGER PRIMARY KEY,
3    username VARCHAR(64),
4    password VARCHAR(64)
5);

我们还需要两张表来存储一对多的follow关系。

01CREATE TABLE followers (
02 
03    user INTEGER REFERENCES user(id),
04 
05    follower INTEGER REFERENCES user(id)
06 
07);
08 
09CREATE TABLE following (
10 
11    user INTEGER REFERENCES user(id),
12 
13    followed INTEGER REFERENCES user(id)
14 
15);

显然,我们还需要表来存储tweets。

1CREATE TABLE tweets (
2    id INTEGER,
3    user INTEGER REFERENCES user(id),
4    body VARCHAR(140),
5    timestamp TIMESTAMP
6);

由于仅仅是个例子,我已经极大简化了情况,但仅仅是这个极度简化的模型,也还有很多需要做的工作。例如,要以可行的方法达到达到数据归一化就需要一个外部键值约束,而因为我们需要从多张表join信息,我们需要对任意值建索引,以保证高效。

但是让一个分布式系统正常工作相当有挑战性,几乎不可能不做任何折衷。对Cassandra来说也是如此,而且这也是为什么上述数据模型对我们来说是无法工作的的原因。对于入门者,没有可供参考的完整性,缺乏次索引使得join很难进行,所以,你必须反归一化。另一方面,你被迫思考你要进行的查询的方式和期望结果,因为这差不多就是数据模型看起来的样子。

 

Twissandra

那么如何把上述模型翻译到Cassandra中呢?十分幸运,我们只需要看看 Twissandra,这是 Eric Florenzano 写的一个 Twitter 的简化版克隆,用作例子。那么让我们来使用 Twitter 和 Twissandra 作为例子来看看 Cassandra 的数据模型是如何的。

 

Schema

Cassandra 是一种无 schema 的数据存储方式,但为你的应用做一些特定的配置还是必要的。Twissandra 给出了一个可以工作的 Cassandra 配置,不过研究一下关于数据模型方面的配置还是物有所值的。

 

Keyspaces

Keyspaces 是 Cassandra 中最顶层的命名空间。在未来版本的 Cassandra 中,将可以动态创建 keyspace,正如在 RDBMS 中创建数据库一样,但是对于 0.6 和以前的版本,这些都在主配置文件中定义,如:

1<keyspaces>
2  <keyspace name="Twissandra">
3  ...
4  </keyspace>
5</keyspaces>

Column Families

对于每个 keyspace,都可以有一个或多个列族。列族是用于关联类型相近的记录的命名空间。Cassandra 在写操作时,在一个列族内部允许有记录级的原子性,对它们进行查询非常高效。这些特性十分重要,在进行你的数据建模前必须记牢,它们会在下面讨论到。

和keyspace类似,列族也在主配置文件中定义,虽然在将来的版本中你将可以在运行时创建列族,正像在RDBMS中创建表一样。

01<keyspaces>
02  <keyspace name="Twissandra">
03    <columnfamily comparewith="UTF8Type" name="User">
04    <columnfamily comparewith="BytesType" name="Username">
05    <columnfamily comparewith="BytesType" name="Friends">
06    <columnfamily comparewith="BytesType" name="Followers">
07    <columnfamily comparewith="UTF8Type" name="Tweet">
08    <columnfamily comparewith="LongType" name="Userline">
09    <columnfamily comparewith="LongType" name="Timeline">
10  </columnfamily></columnfamily></columnfamily></columnfamily></columnfamily></columnfamily></columnfamily></keyspace>
11</keyspaces>

需要指出的是,上面的配置片段中,指定名字的时候同时指定了一个比较者类型。这凸显了 Cassandra 和传统数据库的又一个重大不同,记录按照设计的顺序存储,在之后不能轻易改变。

 

这些列族都是什么?

一下子看所有的七个Twissandra列族是干什么的可能不那么直观,所以,我们来逐个仔细看一下:

  • User
  • User用于存储用户信息,大致相当于上面描述的用户表。列族中的每条记录以UUID为键值,并包含用户名和密码列。

  • Username
  • 在User列族中查询一个用户需要知道用户的键值,但从用户名怎么找到这个UUID键值呢?在上面描述的SQL关系数据库里的话,我们就在User 表里来一个匹配用户名的SELECT语句(WHERE username = ‘jericevans’)就行了。但这对于Cassandra来说却不可能。

    首先,关系数据库可以顺序地扫描全表来进行这样一个 SELECT,但由于记录是基于键值分布在 Cassandra 集群中的,这个匹配将可能会在多个节点上进行,可能是很多节点。而且,即使是数据就在一个节点上,仍然有一个原因会让这一操作远没有关系数据库效率高,因为关系数据库可以对username列有索引。前面提到过,Cassandra是不支持第二索引的。

    解决方案就是,建立一个我们自己的反向索引,进行用户名到UUID键值的映射,这就是Username列族的用途。

  • Friends
  • Followers
  • Friends 和 Follower 列族可以回答这些问题:用户X follow了哪些人?谁follow了用户X?这两个列族的键值都是这个唯一的用户ID,其中包含了哪些有follow关系的用户以及它们创建的时间。

  • Tweet
  • Tweet 列族用于存放所有的tweets。这个列族以每个 tweet 的 UUID为键值,还包含了用户id,tweet内容以及tweet时间这些列。

  • Userline
  • 这是属于每个用户的时间线。记录的键值是用户的ID,其他的列中,包含有一个数字时间戳到Tweet列族中的tweet ID的映射。

  • Timeline
  • 最后,Timeline列族类似于Userline,只是这里存储着每个用户的朋友的tweet的时间线视图。

    有了上面这些列祖,现在我们可以看一些常用的操作都是如何发生的。

     

    把这些列族放在一起来试一下

    添加一个新用户

    首先,新用户需要一个方法来注册一个账户,当他们注册的时候,组要将他们添加到Cassandra数据库中去。对于Twissandra,我们来看看里面的内容:

    1username = 'jericevans'
    2password = '**********'
    3useruuid = str(uuid())  
    4 
    5columns = {'id': useruuid, 'username': username, 'password': password}  
    6 
    7USER.insert(useruuid, columns)
    8USERNAME.insert(username, {'id': useruuid})

    Twissandra是用Python写成的,使用 Pycassa 作为访问 Cassandra的客户端,上述大写的 USER 和 USERNAME 是 pycassa.ColumnFamily 的实例,它们需要在使用之前的某个位置被分别初始化。

    这里说明一下,这不是从 Twissandra 里原样摘出来的。我让他们更加简单而且是自包含的。比如,在上面的例子中,如果没有对用户名和密码的赋值的话,可能不那么好理解,不过一个 web 应用只能从用户注册表单里得到这些内容。

    从这个例子中回来,有两个不同的 Cassandra 写操作(insert()),第一个创建了一个用户列族,另一个更新了用户名到用户 UUID 键值的反向映射表。在两个例子中,参数都是用于查找记录的键值,以及包含列名和值的map。

     

    Following 一个朋友

    1frienduuid = 'a4a70900-24e1-11df-8924-001ff3591711'  
    2 
    3FRIENDS.insert(useruuid, {frienduuid: time.time()})
    4FOLLOWERS.insert(frienduuid, {useruuid: time.time()})

    这里我们再来两个不同的insert()操作,这次是加入一个用户到我们的朋友列表,并加入反向关系:给被 follow 用户添加一个 follower。

     

    发出Tweet

    01tweetuuid = str(uuid())
    02body = '@ericflo thanks for Twissandra, it helps!'
    03timestamp = long(time.time() * 1e6)  
    04 
    05columns = {'id': tweetuuid, 'user_id': useruuid, 'body': body, '_ts': timestamp}
    06TWEET.insert(tweetuuid, columns)  
    07 
    08columns = {struct.pack('>d', timestamp: tweetuuid}
    09USERLINE.insert(useruuid, columns)  
    10 
    11TIMELINE.insert(useruuid, columns)
    12for otheruuid in FOLLOWERS.get(useruuid, 5000):
    13    TIMELINE.insert(otheruuid, columns)

    要存储一条新的tweet,我们需要使用一个新的UUID作为键值,在 Tweet列族创建一个记录,其中的列包含作者的用户ID,创建的时间,当然还有tweet的文本内容本身。

    此外,用户的 Userline 中也要加入tweet的时间和它的id。如果这是用户的第一条tweet的话,这个insert()会产生一条新的纪录,后面的只是为这条记录添加新列。

    最后要给发出tweet的用户和其他follower的 timeline 列族添加这条tweet的ID和时间。

    值得注意的一件事是,这里,时间戳使用的是64位长整型变量,而当它成为一个列的名字的时候,它会被打包为网络字节序的二进制值。这是因为 Userline和Timeline列族使用了一个LongType Comparator,允许我们使用数值区间指定查找指定范围,所以它们被按照数值来存放起来。

     

    接收一个用户的 tweets

    1timeline = USERLINE.get(useruuid, column_reversed=True)
    2tweets = TWEET.multiget(timeline.values())

    接收一个用户的tweet,首先从Userline获取tweet ID的一个列表,然后从Tweet列族通过multiget()方法莱读取这些tweet。得到的结果将是通过着数值表示的时间戳逆序排列的,因为Userline使用了LongTyper comparator,并且reversed设置为了True。

     

    获取一个用户的时间线

    1start = request.GET.get('start')
    2limit = NUM_PER_PAGE  
    3 
    4timeline = TIMELINE.get(useruuid, column_start=start,
    5column_count=limit, column_reversed=True)
    6tweets = TWEET.multiget(timeline.values())

    和上一个例子类似,这次是从 Timeline 读取 tweet ID,不过这次我们还使用了 start 和 limit 来控制读取列的范围。这样有助于输出结果的分页。

     

    那么,下一步呢?

    希望这足够提供给你一个大致的概念。重复一下,我从代码中提取了一些例子,为了简明起见,略去了一些操作,所以现在可能是 check out 出Twissandra 的源代码并进行下一步深入研究的好时候了。有很多功能,诸如 retweet 和 lists,都还空着没有实现,可以作为一个练习的起点。如果你已经熟悉 Python 和 Django 的话,那你可以考虑实现一下这些方法。

    Cassandra 的 wiki 包含了大量的信息,而且还在不断增多,还包括一个实时更新的其他人贡献的文章与幻灯片的列表。

    如果你喜欢IRC的话,你可以加入 irc.freenode.net 的 #cassandra 频道,来和那里的人聊天,他们总是热衷于提供帮助和回答问题。如果你更青睐 email 的话,cassandra-user 邮件列表上也有很多可以提供帮助的人。

    No related posts.

Research on Cassandra Data Compaction Strategies for Time-Series Data 时间序列数据的Cassandra数据压缩策略研究 阅读详情

相关推荐

医学图像处理实战:ABIDE数据集获取与预处理全攻略

本文详细介绍了ABIDE数据集的获取与预处理全流程,涵盖官方脚本下载、Nilearn库高效下载、数据预处理与格式转换等关键步骤。ABIDE数据集作为自闭症脑成像研究的重要资源,提供了标准化的功能磁共振成像数据,适合机器学习模型训练。文章还提供了常见问题排查与优化建议,帮助开发者高效处理医学图像数据。

weixin_29069131的博客 254

Cassandra实例

<br /><br />原文: http://www.rackspacecloud.com/blog/2010/05/12/cassandra-by-example/# <br />原作者:Eric Evan  <br />原文发布日期:May 12, 2010 <br />译者:王旭(http://wangxu.me/blog/ , @gnawux) <br />翻译时间:2010年5月15,25,26日<br />近来 Cassandra 备受瞩目,很多人正在评估是否可以应用 Cassandra。由于这

zkz的专栏 3558

VPI与Matlab协同仿真:相干光通信接收端DSP算法全解析

本文详细解析了如何利用VPI与Matlab协同仿真,构建完整的相干光通信接收端DSP算法处理闭环。重点介绍了从VPI导出数据后,在Matlab中实现时钟恢复、偏振解复用和载波相位估计等核心算法的步骤与原理,并阐述了如何通过误码率计算完成仿真验证,为相干光通信系统算法研究与验证提供了高效实用的方法。

ll5678的博客 608

利用docker安装Cassandra并进行实例操作

文章目录在docker中拉取Cassandra镜像创建docker network创建命令options参数创建一个Cassandra实例连接cqlshCQL语言CQL基础keyspacecolumn family/tablePrimary Key / TablesCQL实例 在docker中拉取Cassandra镜像 在终端中输入如下命令:(前提是已经安装好docker) docker pull...

Maestro_T的博客 6250

Cisco Firepower FMCv修改管理Ip方法

Cisco Firepower FMCv修改管理Ip方法

funnycoffee123的博客 1091

从零到一:基于Blazor和Elsa Workflows的工作流系统开发实战

本文详细介绍了如何利用Blazor和Elsa Workflows构建高效的工作流系统,从技术选型到生产环境部署,涵盖动态工作流建模、Blazor前端集成及性能优化等核心内容。通过实战案例,展示如何实现订单处理系统的自动化与灵活性,提升企业流程效率。

weixin_26875109的博客 428

cassandra_Spring Boot Cassandra的第一步

cassandra 如果您想通过Spring Boot开始使用Cassandra NoSQL数据库,最好的资源可能是此处提供的Cassandra示例以及Spring数据Cassandra文档 。 通过实际在本地安装Cassandra并对其进行基本测试,我将采取一些绕过的方式,我的目标是在下一篇博客文章中将此示例开发为更全面的示例。 设置本地Cassandra实例 您的工作量可能会有所不...

最佳 Java 编程 366

一篇文章将三极管讲透:三极管从原理到应用,从参数到特性,从入门到精通

晶体三极管(Transistor)是一种半导体电子器件,也是电子工程中最基本的元件之一。它有三个区域,分别是P型半导体,N型半导体和P型半导体,从而形成PNP型晶体三极管或者NPN型晶体三极管。

学习帮的博客 9万+

cassandra java 例子_cassandra(三)--编写java代码对分布式数据库进行操作

本文主要关注两个部分,1. 怎么写一个最简单cassandra的sample2. 通过代码,了解cassandra的数据模型及隐藏在后面的交互逻辑步骤一:首先我们创建一个工程,然后将cassandra/lib目录下的包,导入到我们的工程中。步骤二:创建一个类,内容如下:Java代码 importorg.apache.cassandra.thrift.Cassandra;importorg.apa...

weixin_39677106的博客 309

Cadence IC618/Spectre231安装避坑指南:详解License配置、环境变量隔离与依赖检查

本文详细介绍了Cadence IC618/Spectre231的安装与配置避坑指南,包括许可证系统精妙控制、环境隔离模块化实践、依赖管理进阶技巧以及长期维护的黄金法则。通过实战案例和解决方案,帮助工程师构建稳定可靠的EDA工作环境,提升芯片设计效率。

weixin_28683065的博客 460

OpenHands:开源AI智能体开发平台实战指南与架构解析

AI智能体(Agent)作为人工智能领域的关键技术,通过模拟人类的推理与行动循环,能够自主规划并执行复杂任务。其核心原理基于ReAct(Reasoning and Acting)框架,结合规划、工具使用与记忆系统,实现了从感知到决策的闭环。在软件工程领域,AI智能体的技术价值在于将自然语言指令转化为具体的开发操作,从而显著提升代码生成、测试编写和系统维护的效率。典型的应用场景包括自动化代码重构、智能文档生成以及持续集成流程的优化。本文聚焦于OpenHands这一开源AI驱动开发平台,它提供了完整的智能体SD

weixin_27021789的博客 455

[译文]理解Cassandra源代码

[译文]理解Cassandra源代码 标签: 云计算 Cloud translation nosql cassandra reading 2010-05-13 01:22 原文: http://prettyprint.me/2010/05/02/understanding-cassandra-code-base/ 原作者:Ran Tavo

Rocky 1132

杰理SDK入门教程(二):USB升级程序

开发板升级操作指南 摘要:本文介绍了开发板程序升级的两种方式(常规升级和串口升级),重点说明了常规升级的操作步骤: 拨码设置:提供4种拨码方式(不拨/1档/2档/3档),对应不同指示灯状态和按键要求 硬件连接:强制升级工具需正确连接电脑和开发板(注意USB接口方向) 升级流程:根据拨码状态操作按键,观察指示灯变化(红灯常亮绿灯灭表示进入升级模式) 执行升级:运行SDK中的download.bat完成升级 文中还包含拨码开关说明、指示灯状态对照表以及升级原理说明,帮助用户理解升级过程。升级成功后在设备管理器可

qq_42014563的博客 1114

第五部分 安装Cassandra1.0.x的单实例模式

今天我们要进入一个重要的课题,下文翻译的内容就是Cassandra的单点安装过程,安装版本选择DataStax Community Edition的Cassandra吗,其实与哪个版本没什么本质的区别,就是操作步骤略有不同,但是结果是一样的。   Installing a Single-Node Instance of Cassandra 安装Cassandra的单实例模式   原文

【名剑】黑客 专栏 3085

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Cassandra NoSQL数据模型设计指南

原文:Cassandra NoSQL Data Model Design 翻译:雁惊寒 摘要:本文通过一个简单的实例详细介绍了Cassandra数据建模的五个步骤。以下是译文。我们最近在Instaclustr发表了一篇有关在Cassandra中经常出现的数据建模错误的文章。这篇文章非常受欢迎,并促使我思考如何设计出高质量的Cassandra数据模型,以避免在设计的过程中掉入陷阱。在互联网上,你

优快云研发技术 8471

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

[译] 让 Apache Cassandra 尾部延迟减小 10 倍,已开源

原文地址:Open-sourcing a 10x reduction in Apache Cassandra tail latency 原文作者:Instagram Engineering 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m… 译者:stormluke 校对者:allenlongbaobao 在 Instagram,我们的数据库是全球最大的 ...

weixin_33752045的博客 315

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

第一部分 Cassandra 1.0.X常用命令指南

接触了一段时间的Cassandra之后发现网上一些文档显得有点旧了,绝大部分是0.6,0.7版本的资料,可是Cassandra发展很快,已经发展到了1.0.x版本了,于是决定做一些主要文档的翻译,以便一些初学者可以得到一手的资料,翻译文档也是学习的过程,翻译工作也是第一次干,肯定还是有很多的不足,希望这些资料的翻译可以帮助到一些想学习Cassandra的人。 我将在接下来的文档中体现:安装和配置

【名剑】黑客 专栏 9368

Cassandra与Mongo的事务实现之分布式协议

摘要NoSql不同于关系型数据库,是分布式存储,因此想要实现关系型数据库中的事务就不是那么简单了。本文结合Cassandra中的paxos和Mongo的two phase commit来谈谈Nosql如何利用分布式协议来实现事务的。CassandraCassandra的paxos机制在这篇译文中已有详细解释了。 下面时序图方便理解。 注意acceptor节点数量由replicate factor

方丈的寺院 2864

时间序列数据处理的角逐:MongoDB vs. Cassandra

MongoDB是最具人气的文档数据库,而Cassandra是最具人气的列存储数据库,然而这两个在适用场景上似乎有着明显区别的解决方案近日却擦出了火花。 MongoDB与Cassandra是两个最具人气的NoSQL数据库,MongoDB更是NoSQL领域当之无愧的人气王,而Cassan...

chuanjiaoye5017的博客 164

cassandra (1) What's new

译文: 主要特点 卡桑德拉1.2引入了许多改进,这是本节简要描述。 •卡桑德拉1.2.2和更高版本基于支持CQL3的实现IAuthenticator和IAuthorizer使用这些安全功能,早一点进行了介绍: •内部认证的基础上的卡桑德拉控制登录帐户和密码。 •对象权限管理使用的内部授权授予或撤销权限访问Cassandra的数据通过熟悉的关系数据库GRANT / REVOKE范式的。

404 1213

第三部分 关于Cassandra1.0.x的数据分区

About Data Partitioning in Cassandra 关于Cassandra的数据分区   原文 When you start a Cassandra cluster, youmust choose how the data will be divided across the nodes in the cluster. Thisis done by choosing

【名剑】黑客 专栏 2073

Cassandra 的压缩策略STCS,LCS 和 DTCS

更新说明: 本文编写时最新的Cassandra版本为2.2,最新的稳定版本为2.1.8 2016年6月23日,增加一篇译文,当下最新版本为3.7 最新的Cassandra 2.1 或者更高的版本支持3种压缩策略,各有优劣,在2.2的版本的说明文档中,有对这三种策略的详细说明,部分翻译如下。 文档链接:http://docs.datastax.com/en/cassandra/2.2/cassa...

weixin_33719619的博客 302
上一篇: 分布式 Key-Value 存储系统:Cassandra 入门
下一篇: redis学习笔记
Java2King
博客等级 码龄18年 221粉丝 77原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值