聊聊Cassandra-概览

如果你想学习分布式系统,Cassandra可以说是一个好的开始。 Cassandra借鉴了两篇重要的论文中的思想:Google的BigTable和Amazon的Dynamo。它的存储基于BigTable,分布式基于Dynamo。这篇文章将尝试解释整体架构中的一些细节。

数据模型(Data Model)

在关系型数据库中的一些常见术语在Cassandra中则有不同的定义。如果你能暂时忘记常规的定义,则阅读本文可能会更加顺利。

列(Colunmn)

“列”由一个name,一个相关的value和一个时间戳组成。name和value可以是任何类型,name不需要是字符串。一个列就是一个Name-Value-Timestamp集合。

列族(Column Family

可以想象成在关系数据库中一行所包含的一个key和一些列。

超列族(Super Column Family)

就是一个列族,这个列族中每个列的值就是一个列的集合。

大家可能会有些疑惑,可以看看下面的图片:

对Column Family再多说两句。一个column family 可以被定义为一个有序rows的集合,每个row都包含了一个有序的columns的集合。Cassandra是一个自由的模式,之后你可以在任意时刻添加任意column到任意column family中。Columns不需要相同,并且每行都不需要有相同数量的columns。尽管这样,在相同的column family有相同的columns还是比较好的,因为每个column family都存储在一个单独的文件中。

一个column family 有一个name和一个比较器,比较器的的值决定了columns的排序。每行中的key被用来决定该行存储在集群中哪个节点中。

KeySpaces

是数据最外层的容器。可以把它想象成RDBMS中的一个数据库。尽管不是必须的,但是为每个应用创建一个单独的keyspace比较好。一个keyspace有一个name和一些别的属性(比如说复制因子,复制策略等)。

Clusters

Cassandra运行在多个节点(一个集群)之上,它在集群间复制数据,所以当有一个节点宕机,另外的节点能接管工作。这让Cassandra是高可用的。

简而言之,Cassandra的数据模型像下面这样:

Cluster => Keyspace => Column Families (Standard or Super) => Column => (Name, Value, Timestamp)

一致性哈希

Cassandra是一个分布式数据库,一般会运行在多个机器上。在这些节点中,我们该怎么划分数据呢?可以使用一个简单的策略,比如在N个节点的集群中,把数据存放在(hash(key)%N)个机器上,但是当一个节点增加或者删除的时候会引起一些问题,因为每个节点上的数据都会变化。为了避免这种情况,我们使用一致性哈希。

在一致性哈希中,机器被放在一个逻辑上的圆环上,如下图所示,key同样也在这个圆环上,并被分配到顺时针的最近一个机器上,并复制N份到顺时针前的节点上(N被称为复制因子)。Cassandra是一个最终一致性的存储系统, 会在后台进行复制操作。客户端没必要等待所有的副本写入完成,可以设置要等待完成写入的节点数。

现在,如果我们从圆环上增加或删除一个机器,key只会在移动到和它相邻的节点上去。

反熵(Anti-Entropy) 和 读修复

Anti-Entropy是Cassandra的一个副本同步机制,来保证在不同节点上的数据都被更新到最新的版本。Anti-Entropy使用Merkle Trees,对于每个column family,都会构造这个tree。为什么叫Anti-Entropy呢?在一个最终一致性性的数据库中,随着时间流逝,应该被精确复制的节点都会慢慢互相偏差。这个偏差可以被认为是系统的“entropy”。反熵 就是让节点之间互相同步的过程。

Hash Tree被交换用来找出陈旧的数据。他们被用来减少节点之间的数据交换。Hashes trees看起来像下面这样:
当反熵 开始的时候,hash trees被构建,并在节点之间互相交换。而不是交换真实的数据。然后从root开始比较。如果某些节点的hash不一样,我们可以准确的判断出哪些数据是陈旧的。

Memtables,SSTable  and Commit Logs

一个写操作会立即写到节点的commit log中。只有当这个请求被写入到commit log中的时候,它才被认为是成功的。在被写入commit log之后,这个value被写入到一个被称为memtable的内存结构中。当memtable的大小到达一个阈值的时候,它就被刷到磁盘中的SSTable中。Memtables根据key进行排序,然后被顺序的写到磁盘中。因此,写入是非常快的。

在磁盘中的一个SSTable是不可变的。若干个SSTable被一个compaction程序合并到一起。每个SSTable都有一个相关的布隆过滤器和一个索引。布隆过滤器可以快速的检查一个元素是否在这个集合中。

读的时候,Cassandra首先会检查memtable。然后会尝试查找所有的SSTable。

Compaction

在压缩期间,SSTable会被合并:key会被合并,标记为tombstones 的数据会被丢弃,会创建新的索引。

什么是tombstones?

当一个值被 删除的时候,他不会真正的被删除,但是会给他一个tombstone标记。为什么要这么做呢?因为如果一个值在一个副本中被删除,而在另外的副本中没被删除,当重新调节的时候,系统会认为被删除值的副本是没有被更新的,然后又重新写入这个值。Tombstones显然会浪费空间,并且需要被清除。一个anti-entropy 开始的时候,在压缩的时候是最好摆脱他们的时机。在每次GCGraceSeconds之后,Tombstones被会垃圾收集。
在压缩的时候,合并的数据会被排序,一个新的索引也会被创建,然后新的合并后的数据、索引数据都会被写到一个单独的新的SSTable中。

Gossip 和失败检测

Cassandra使用Gossip协议来内部交流,所以每个节点都能知道别的节点的信息。 gossiper每秒运行一次。当节点发现目标节点上线的时候,会触发暗示提交。
gossiper会定期的随机选择一个节点,并和它开始一个gossip回话。每个回合需要三种信息:
1.发送一个GossipDigestSynMessage给它选择的节点。
2.当节点收到信息的是,他也返回一个GossipDigestAckMessage。
3.当节点收到ack信息的时候,他发送一个GossipDigestAck2Message给友节点来完成一个gossip回合。
每个节点都包含了死亡节点和可用节点的列表。Cassandra使用一个  Phi Accrual Failure Detection 技术来替代传统的“heat beat”来检查节点是否死亡。这个技术使用一个怀疑度概念来找出可能的死亡节点。

暗示提交(Hinted Handoff)

由于某些原因,节点的某些写入的数据不可用。其他节点将会处理这个写请求,并且等待着节点回来,当这个节点上线的时候,它会把写入又发回给节点。这被称为暗示提交。为什么是暗示提交呢?

  • 当一致性不是必须的时候保证高可用
  • 减少死亡节点上线所需要的时间

一个写入请求会被发送到所有的副本,当达到要求的数量的节点返回的时候,这个写入会被认为是成功的。
所以,这只是Cassandra架构的一个基本的概览。一些主题如一致性哈希、anti-entropy 等等。在后面我将单独讲这些东西。

转载自 并发编程网 - ifeve.com

时间: 2024-12-27 13:36:30

聊聊Cassandra-概览的相关文章

从 Spring Cloud 开始,聊聊微服务架构实践之路

本文讲的是从 Spring Cloud 开始,聊聊微服务架构实践之路[编者的话]随着公司业务量的飞速发展,平台面临的挑战已经远远大于业务,需求量不断增加,技术人员数量增加,面临的复杂度也大大增加.在这个背景下,平台的技术架构也完成了从传统的单体应用到微服务化的演进. 系统架构的演进过程 单一应用架构(第一代架构) 这是平台最开始的情况,当时流量小,为了节约成本,并将所有应用都打包放到一个应用里面,采用的架构为 .NET SQL Server: 表示层:位于最外层(最上层),最接近用户.用于显示数

聊聊内存管理

这篇文章我们聊聊内存管理. 本来我想不针对于任何具体的操作系统来谈内存管理,但是又觉得不接地气.言之无物.所以我决定在阐述概念的同时,还针对IA32平台Linux下的内存管理做简要的介绍,并且以实验来证明结论.以下内容分拆为几个大标题和小节,内容前后承接. 物理地址空间 首先,什么是物理地址空间?我们知道CPU与外部进行信息传递的公用通道就是总线,一般而言,CPU有三大总线:控制总线.数据总线.地址总线.这三类总线在一定程度上决定了CPU对外部设备的控制和数据传送能力.其中地址总线决定了CPU能

基于Deep Learning 的视频识别方法概览

基于Deep Learning 的视频识别方法概览 析策@阿里聚安全 深度学习在最近十来年特别火,几乎是带动AI浪潮的最大贡献者.互联网视频在最近几年也特别火,短视频.视频直播等各种新型UGC模式牢牢抓住了用户的消费心里,成为互联网吸金的又一利器.当这两个火碰在一起,会产生什么样的化学反应呢? 不说具体的技术,先上一张福利图,该图展示了机器对一个视频的认知效果.其总红色的字表示objects, 蓝色的字表示scenes,绿色的字表示activities. 图1 人工智能在视频上的应用主要一个课题

内行看门道!聊聊交互原则那些事儿

  刚学习交互设计的新人,面对繁多的交互设计原则,肯定晕头转向.总不能每款产品都按着交互原则一一比对吧?今天资深交互设计师老D由浅及深,聊聊交互原则的那些事儿,特别适合新人呦. 为什么需要设计原则? 设计原则其实就是对一些设计过程中基于人类的认知规律对设计做出的一些指导性原则,并且对已经成为行业共识的设计经验做个总结,用来指导设计师界定问题.提高效率. 经常用的设计原则有哪些? 先来抛一个老D在早年刚接触交互设计的时候最为大家所认可的几条设计原则: 1. 可学习性 目标用户在已有的知识和经验基础

聊聊2015年流行的网页设计趋势

  给明年的自己增加筹码!这一年快结束了,年底特别忙,但也别只顾工作,忘了给自己充电呦,今天特意分享一篇好文,聊聊明年将流行的设计趋势,希望能给那些奋战之余不忘充实自己的设计师们一点有价值的参考,每点趋势后都有相关文章帮你理解,不担心跟不上咯. 1. 响应式在继续 OK,也许你不打算打道回府.也许你有一个很好的理由不用响应式网页设计?在过去的几年里,响应设计快速巩固了自己作为网页设计的新标准.当然,也有争论,但是没人说,"让我们摆脱响应式设计吧".实际上,越来越多的网站选择响应式的方向

聊聊SKETCH那些方便好用的贴心功能

  编者按:Sketch最近成了很多UI设计师的新宠,同学们纷纷表示要放手Photoshop,转投Sketch的怀抱.于是就有了这样的疑问:这个上线才一年多的软件魅力在哪?今天@呼啸而过Charles 聊聊Sketch那些贴心好用到爱上改稿的神奇功能. 首先,感谢原作者Jean-Marc Denis撰写优秀的文章.本文只是将其翻译成中文,如有不妥之处请批评指教.以下为译文正文: 当我最近一次在旧金山参加苹果开发者大会(WWDC 2013)时,有幸与Sketch设计师会面. 我尝试了Sketch(

来聊聊游戏产品的那些辅助APP

  近年来移动互联网迅猛发展,逐渐成为人们日常生活的一部分.传统主机和PC端游戏为了融入移动互联网的大浪潮中也纷纷推出手机和平板等移动设备上的辅助APP应用.那今天我们就来聊聊目前了解收集到的一些辅助APP类型. 类型一:数据浏览资讯推送 先从我们熟悉的开始聊吧--如果你是一名英雄联盟玩家,想必应该用过该游戏一款名为<多玩盒子>移动端的辅助APP应用.该应用主要功能便是拉取玩家游戏内的游戏数据,方便玩家查询战斗记录.以及英雄详细资料,主流玩法以及出装等.还有就是基础的游戏资讯推送与论坛等. 该

XML签名概览

xml 摘要:本文比较全面地介绍了XML签名,但并未深入探究.本人水平有限,错误难免,欢迎指正,共同探讨. 目录: XML签名概览... 1 简介... 1 为什么需要XML签名... 1 数字签名... 2 XML签名语法... 2 应用... 4 实现... 4 参考... 4 简介 XML签名是一种基于XML格式的签名规范.它是W3C最早的XML安全方面的推荐标准规范.设计的XML签名带有多个目标,可提供"对任何数据类型的完整性.消息认证.和/或签名者认证服务, 无论是在包括该签名的 XM

EJB3.0新规范概览及其未来发展

规范 引言 期待已久的EJB3.0规范在最近发布了它的初稿.在本文中将对新的规范进行一个概要性的介绍,包括新增的元数据支持,EJBQL的修改,实体Bean模型访问bean上下文的新方法和运行时环境等等.作者还讨论了EJB在未来要作出的调整以及EJB3.0与其他开发规范之间的关系. 开始 无论如何由于EJB的复杂性使之在J2EE架构中的表现一直不是很好.EJB大概是J2EE架构中唯一一个没有兑现其能够简单开发并提高生产力的组建. EJB3.0规范正尝试在这方面作出努力以减轻其开发的复杂性.EJB3