四、副本存储

Cassandra不像HBase是基于HDFS的分布式存储,它的数据是存在每个节点的本地文件系统中。

Cassandra有三种副本配置策略:

1) SimpleStrategy RackUnawareStrategy

副本不考虑机架的因素,按照Token放置在连续下几个节点。如图3所示,假如副本数为3,属于A节点的数据在B.C两个节点中也放置副本。

2) OldNetworkTopologyStrategy RackAwareStrategy:

考虑机架的因素,除了基本的数据外,先找一个处于不同数据中心的点放置一个副本,其余N-2个副本放置在同一数据中心的不同机架中。

3)  NetworkTopologyStrategy DatacenterShardStrategy

将M个副本放置到其他的数据中心,将N-M-1的副本放置在同一数据中心的不同机架中。

五、网络嗅探

网络嗅探主要用来计算不同host的相对距离,进而告诉Cassandra网络拓扑结构,以便更高效地对用户请求进行路由。主要有三种配置策略:

1)       org.apache.cassandra.locator.SimpleSnitch

将不同host逻辑上的距离(Cassandra Ring)作为他们之间的相对距离。

2)       org.apache.cassandra.locator.RackInferringSnitch:

相对距离是由rack和data center决定的,分别对应ip的第3和第2个八位组。即,如果两个节点的ip的前3个八位组相同,则认为它们在同一个rack(同一个rack中不同节点,距离相同);如果两个节点的ip的前两个八位组相同,则认为它们在同一个数据中心(同一个data center中不同节点,距离相同)。

3)       org.apache.cassandra.locator.PropertyFileSnitch:

相对距离是由rack和data center决定的,且它们是在配置文件cassandra-topology.properties中设置的。

六、一致性

在一致性上,Cassandra采用了最终一致性,可以根据具体情况来选择一个最佳的折衷,来满足特定操作的需求。Cassandra可以让用户指定读/插入/删除操作的一致性级别,一致性级别有多种,如图5所示。

图5  Cassandra一致性级别

注:一致性级别是由副本数决定,而不是集群的节点数目决定。

Quorum NRW协议中,只需W + R > N,就可以保证强一致性。一般来说,Quorum中比较典型的NRW为(3,2,2)。

维护最终一致性

Cassandra 通过4个技术来维护数据的最终一致性,分别为逆熵(Anti-Entropy),读修复(Read Repair),提示移交(Hinted Handoff)和分布式删除。

1)       逆熵

这是一种备份之间的同步机制。节点之间定期互相检查数据对象的一致性,这里采用的检查不一致的方法是 Merkle Tree;

2)       读修复

客户端读取某个对象的时候,触发对该对象的一致性检查:

读取Key A的数据时,系统会读取Key A的所有数据副本,如果发现有不一致,则进行一致性修复。

如果读一致性要求为ONE,会立即返回离客户端最近的一份数据副本。然后会在后台执行Read Repair。这意味着第一次读取到的数据可能不是最新的数据;如果读一致性要求为QUORUM,则会在读取超过半数的一致性的副本后返回一份副本给客户端,剩余节点的一致性检查和修复则在后台执行;如果读一致性要求高(ALL),则只有Read Repair完成后才能返回一致性的一份数据副本给客户端。可见,该机制有利于减少最终一致的时间窗口。

3)       提示移交

对写操作,如果其中一个目标节点不在线,先将该对象中继到另一个节点上,中继节点等目标节点上线再把对象给它:

Key A按照规则首要写入节点为N1,然后复制到N2。假如N1宕机,如果写入N2能满足ConsistencyLevel要求,则Key A对应的RowMutation将封装一个带hint信息的头部(包含了目标为N1的信息),然后随机写入一个节点N3,此副本不可读。同时正常复制一份数据到N2,此副本可以提供读。如果写N2不满足写一致性要求,则写会失败。 等到N1恢复后,原本应该写入N1的带hint头的信息将重新写回N1。

4)       分布式删除

单机删除非常简单,只需要把数据直接从磁盘上去掉即可,而对于分布式,则不同,分布式删除的难点在于:如果某对象的一个备份节点 A 当前不在线,而其他备份节点删除了该对象,那么等 A 再次上线时,它并不知道该数据已被删除,所以会尝试恢复其他备份节点上的这个对象,这使得删除操作无效。Cassandra 的解决方案是:本地并不立即删除一个数据对象,而是给该对象标记一个hint,定期对标记了hint的对象进行垃圾回收。在垃圾回收之前,hint一直存在,这使得其他节点可以有机会由其他几个一致性保证机制得到这个hint。Cassandra 通过将删除操作转化为一个插入操作,巧妙地解决了这个问题。

七、存储机制

Cassandra的存储机制借鉴了Bigtable的设计,采用Memtable和SSTable的方式。

CommitLog

和HBase一样,Cassandra在写数据之前,也需要先记录日志,称之为Commit Log,然后数据才会写入到Column Family对应的MemTable中,且MemTable中的数据是按照key排序好的。SSTable一旦完成写入,就不可变更,只能读取。下一次Memtable需要刷新到一个新的SSTable文件中。所以对于Cassandra来说,可以认为只有顺序写,没有随机写操作。

MenTable

MemTable是一种内存结构,当数据量达到块大小时,将批量flush到磁盘上,存储为SSTable。这种机制,相当于缓存写回机制(Write-back Cache),优势在于将随机IO写变成顺序IO写,降低大量的写操作对于存储系统的压力。所以我们可以认为Cassandra中只有顺序写操作,没有随机写操作。

SSTable

SSTable是Read Only的,且一般情况下,一个CF会对应多个SSTable,当用户检索数据时,Cassandra使用了Bloom Filter,即通过多个hash函数将key映射到一个位图中,来快速判断这个key属于哪个SSTable。

为了减少大量SSTable带来的开销,Cassandra会定期进行compaction,简单的说,compaction就是将同一个CF的多个SSTable合并成一个SSTable。在Cassandra中,compaction主要完成的任务是:

1) 垃圾回收: cassandra并不直接删除数据,因此磁盘空间会消耗得越来越多,compaction 会把标记为删除的数据真正删除;

2) 合并SSTable:compaction 将多个 SSTable 合并为一个(合并的文件包括索引文件,数据文件,bloom filter文件),以提高读操作的效率;

3) 生成 MerkleTree:在合并的过程中会生成关于这个 CF 中数据的 MerkleTree,用于与其他存储节点对比以及修复数据。

详细存储数据结构参考 http://www.ibm.com/developerworks/cn/opensource/os-cn-cassandraxu2

Cassandra和HBase的一个重要区别是, Cassandra在每个节点是是一个单 Java 进程,而完整的HBase 解决方案却由不同部分组成:有数据库进程本身,它可能会运行在多个模式;一个配置好的 hadoop HDFS 分布式文件系统,以及一个 Zookeeper 系统来协调不同的 HBase 进程。

转载于:https://www.cnblogs.com/bonelee/p/6278154.html

cassandra框架模型之二——存储机制 CommitLog MemTable SSTable相关推荐

  1. cassandra框架模型之一——Colum排序,分区策略 Token,Partitioner bloom-filter,HASH

    转自:http://asyty.iteye.com/blog/1202072 一.Cassandra框架 二.Cassandra数据模型 Colum / Colum Family, SuperColu ...

  2. cassandra随机获取数据_Cassandra维护最终一致性 和存储机制 分区策略

    维护最终一致性 Cassandra通过4个技术来维护数据的最终一致性,分别为逆熵(Anti-Entropy),读修复(Read Repair),提示移交(Hinted Handoff)和分布式删除. ...

  3. C++利用二次探查实现存储机制hash table的算法(附完整源码)

    C++利用二次探查实现存储机制hash table的算法 C++利用二次探查实现存储机制hash table的算法完整源码(定义,实现,main函数测试) C++利用二次探查实现存储机制hash ta ...

  4. kafka 不同分区文件存储_Kafka 系列(二)文件存储机制与Producer架构原理怎样保证数据可靠性??...

    文章目录 Kafka工作流程及文件存储机制 工作流程: topic底层存储: Producer生产者架构: 一:分区存储策略: 1.分区的原因: 2.分区的原则: ProducerRecord构造器: ...

  5. 一文读懂RocketMQ的存储机制

    一.存储方式 业界主流的 MQ 产品像 RabbitMQ.RocketMQ.ActiveMQ.Kafka 都是支持持久化存储的,而 ZeroMQ 不需要支持持久化存储.业务系统也确实需要 MQ 支持持 ...

  6. 分布式数据库灵活存储机制与应用实践

    2019独角兽企业重金招聘Python工程师标准>>> 嘉宾介绍:郝大为,巨杉数据库技术总监,曾任职IBM DB2数据库部门以及亚信大数据部门,资深的数据库专家.拥有丰富的数据库开发 ...

  7. Android Glide图片加载框架(三)缓存机制

    文章目录 一.缓存简介 二.缓存用法 内存缓存方式 磁盘缓存方式 三.缓存KEY 四.内存缓存 内存缓存流程 五.磁盘缓存 磁盘缓存流程 Android Glide图片加载框架系列文章 Android ...

  8. JVM内存模型和类加载运行机制

    JVM内存模型和类加载运行机制 JVM内存模型 运行一个 Java 应用程序,必须要先安装 JDK 或者 JRE 包.因为 Java 应用在编译后会变成字节码,通过字节码运行在 JVM 中,而 JVM ...

  9. (转)MyBatis框架的学习(二)——MyBatis架构与入门

    http://blog.csdn.net/yerenyuan_pku/article/details/71699515 MyBatis框架的架构 MyBatis框架的架构如下图:  下面作简要概述: ...

最新文章

  1. C# 温故而知新:Stream篇(二)
  2. 微生物组—宏基因组分析专题培训开课啦!10月北京
  3. C#读写文本文件小结
  4. 防火墙iptables之常用脚本
  5. C语言实现二进制文件读写
  6. Seq2Seq之双向解码机制 | 附开源实现
  7. 苹果android 对比,苹果安卓旗舰差距有多少?看了这份对比,果粉傻眼了
  8. iview select选中值取值_iView的Select选择框
  9. 谈谈现在软件测试行业的趋势和面试必备的东西
  10. Ubuntu 安装gcc/g++
  11. Vc++安装包_Visual C++ 6.0中文版安装包下载及win11安装教程
  12. 学计算机的可以考哪种证书,自学比较容易考的证书 哪些证书有用
  13. 基于Linux通用GPIO接口的操作函数
  14. html网页随机一言,搭建Hitokoto网站·一言经典语句功能及调用案例
  15. linux服务器关不了机,解决Linux关不了机开机,报错NMI watchdog: BUG: soft lockup - CPU#2 stuck for 22s的bug...
  16. JAVA组件设计原则(二)原则一:精准解决共性问题(摘自《java组件设计》)
  17. 从入门到断送职业生涯只差这几步
  18. java专区软件_分享几款让你事半功倍的装机必备软件
  19. Springboot中new出来的实例中含有@Autowired注入时的Spring Bean为NULL
  20. Qcon演讲实录 | XQUIC与多路径传输技术Multipath QUIC

热门文章

  1. python 爬取贝壳网小区名称_利用python爬取贝壳网租房信息
  2. android播放页蒙层过渡效果,EasyGuideLayer: 这可能是最简单、灵活、强大的页面蒙层组件了!...
  3. linux openwrt插件,OpenWrt添加软件包(一)
  4. docker挂载目录原理
  5. 【深度学习】卷积神经网络速成
  6. 【响应式Web前端设计】在html页面实时显示系统时间
  7. 【2021年度训练联盟热身训练赛第四场】Game Map(python C++)
  8. Tensorflow【实战Google深度学习框架】预训练与微调含代码(看不懂你来打我)
  9. java+++多数据源配置,Spring Cloud + Mybatis 多数据源配置
  10. mysql数据库导出最大值_4.6 MySQL数据库导入与导出攻略