cassandra框架模型之二——存储机制 CommitLog MemTable SSTable
四、副本存储
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所示。
![](http://asyty.iteye.com/upload/picture/pic/100990/94bdd0d9-6f68-3d56-b344-98e26206bbcc.png)
图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相关推荐
- cassandra框架模型之一——Colum排序,分区策略 Token,Partitioner bloom-filter,HASH
转自:http://asyty.iteye.com/blog/1202072 一.Cassandra框架 二.Cassandra数据模型 Colum / Colum Family, SuperColu ...
- cassandra随机获取数据_Cassandra维护最终一致性 和存储机制 分区策略
维护最终一致性 Cassandra通过4个技术来维护数据的最终一致性,分别为逆熵(Anti-Entropy),读修复(Read Repair),提示移交(Hinted Handoff)和分布式删除. ...
- C++利用二次探查实现存储机制hash table的算法(附完整源码)
C++利用二次探查实现存储机制hash table的算法 C++利用二次探查实现存储机制hash table的算法完整源码(定义,实现,main函数测试) C++利用二次探查实现存储机制hash ta ...
- kafka 不同分区文件存储_Kafka 系列(二)文件存储机制与Producer架构原理怎样保证数据可靠性??...
文章目录 Kafka工作流程及文件存储机制 工作流程: topic底层存储: Producer生产者架构: 一:分区存储策略: 1.分区的原因: 2.分区的原则: ProducerRecord构造器: ...
- 一文读懂RocketMQ的存储机制
一.存储方式 业界主流的 MQ 产品像 RabbitMQ.RocketMQ.ActiveMQ.Kafka 都是支持持久化存储的,而 ZeroMQ 不需要支持持久化存储.业务系统也确实需要 MQ 支持持 ...
- 分布式数据库灵活存储机制与应用实践
2019独角兽企业重金招聘Python工程师标准>>> 嘉宾介绍:郝大为,巨杉数据库技术总监,曾任职IBM DB2数据库部门以及亚信大数据部门,资深的数据库专家.拥有丰富的数据库开发 ...
- Android Glide图片加载框架(三)缓存机制
文章目录 一.缓存简介 二.缓存用法 内存缓存方式 磁盘缓存方式 三.缓存KEY 四.内存缓存 内存缓存流程 五.磁盘缓存 磁盘缓存流程 Android Glide图片加载框架系列文章 Android ...
- JVM内存模型和类加载运行机制
JVM内存模型和类加载运行机制 JVM内存模型 运行一个 Java 应用程序,必须要先安装 JDK 或者 JRE 包.因为 Java 应用在编译后会变成字节码,通过字节码运行在 JVM 中,而 JVM ...
- (转)MyBatis框架的学习(二)——MyBatis架构与入门
http://blog.csdn.net/yerenyuan_pku/article/details/71699515 MyBatis框架的架构 MyBatis框架的架构如下图: 下面作简要概述: ...
最新文章
- C# 温故而知新:Stream篇(二)
- 微生物组—宏基因组分析专题培训开课啦!10月北京
- C#读写文本文件小结
- 防火墙iptables之常用脚本
- C语言实现二进制文件读写
- Seq2Seq之双向解码机制 | 附开源实现
- 苹果android 对比,苹果安卓旗舰差距有多少?看了这份对比,果粉傻眼了
- iview select选中值取值_iView的Select选择框
- 谈谈现在软件测试行业的趋势和面试必备的东西
- Ubuntu 安装gcc/g++
- Vc++安装包_Visual C++ 6.0中文版安装包下载及win11安装教程
- 学计算机的可以考哪种证书,自学比较容易考的证书 哪些证书有用
- 基于Linux通用GPIO接口的操作函数
- html网页随机一言,搭建Hitokoto网站·一言经典语句功能及调用案例
- linux服务器关不了机,解决Linux关不了机开机,报错NMI watchdog: BUG: soft lockup - CPU#2 stuck for 22s的bug...
- JAVA组件设计原则(二)原则一:精准解决共性问题(摘自《java组件设计》)
- 从入门到断送职业生涯只差这几步
- java专区软件_分享几款让你事半功倍的装机必备软件
- Springboot中new出来的实例中含有@Autowired注入时的Spring Bean为NULL
- Qcon演讲实录 | XQUIC与多路径传输技术Multipath QUIC
热门文章
- python 爬取贝壳网小区名称_利用python爬取贝壳网租房信息
- android播放页蒙层过渡效果,EasyGuideLayer: 这可能是最简单、灵活、强大的页面蒙层组件了!...
- linux openwrt插件,OpenWrt添加软件包(一)
- docker挂载目录原理
- 【深度学习】卷积神经网络速成
- 【响应式Web前端设计】在html页面实时显示系统时间
- 【2021年度训练联盟热身训练赛第四场】Game Map(python C++)
- Tensorflow【实战Google深度学习框架】预训练与微调含代码(看不懂你来打我)
- java+++多数据源配置,Spring Cloud + Mybatis 多数据源配置
- mysql数据库导出最大值_4.6 MySQL数据库导入与导出攻略