参考文档:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/dml/dml_about_hh_c.html

  Hint机制是Cassandra的特性当一致性不要求时保证了写入的高可用性。但临时故障发生如网络问题,Hint机制显著地提升了反应的一致性。通过配置cassandra.yaml文件,你选择是否启用Hint机制。

一、Hint机制是如何工作的

  当一个写入发生,应当被写入的副本节点被感应到发生了故障或者没有响应写入请求,协调者会在本地存储一个hint,放入到system.hints表中。这个hint表明,对于不可用的节点,写入请求需要被重新执行。

  hint包含了:

  •发生了故障的副本节点位置

  •哪一行需要被重新写入

  •需要被写入的实际数据

  默认情况下,当副本发生故障后,hint会被存储3个小时。因为如果一个副本节点发生故障的时间大于3个小时,这个节点可能永久性的故障了。这种情况下,在故障发生前,请运行修复去重新复制数据。你可以配置这个时间,通过配置cassandra.yaml文件的max_hint_window_in_ms属性。

  节点A有节点B的hint,当节点A通过 gossip发现另一个节点B恢复了,节点A将发送hint对应的数据行发送给B。另外,节点A通过gossip每隔十分钟检查被故障检测机制通知的超时hint。一个hint并不计入一致性级别需求是ONE、QUORUM或者是ALL。协调者节点存储挂掉副本节点的hint无论一致性级别除非hint机制没有被启用。如果没有足够的存活的副本去满足一致性级别,一个UnavailableException异常会被抛出。相比于 Dynamo的复制模型,这是一个重要的不同点。

  例如,在集群中有两个节点A和B,复制因子为1:每一行存储在一个节点上。假设当我们将行K写给节点A时节点A宕机了且一致性级别为one,写入会失败因为读会影响最新的写入当:

  W-nodes + R > 复制因子

  W是写阻塞的节点的数目,R是读阻塞的节点的数目。Cassandra不会在节点B写一个hint然后返回写入成功因为Cassandra在任何一致性级别下都读不到数据直到A恢复了然后B把数据转发给A。

二、极致的写入可用性

  对于那些希望Cassandra能够接受写入请求即使所有的副本节点都已经宕机的应用程序来说,如果一致性级别ONE也不能满足的话,Cassandra提供了一致性级别ANY。ANY保证写入是持久的并且可读的当一个合适的副本节点变得可用并且接收到hint。

三、性能

  设计上,hint机制使得Cassandra 能够持续的支持相同数目的读写请求即便集群的工作能力降低。让你的集群的运行最大能力而不考虑故障是一个坏主意。hint机制设计用来最小化集群的额外负担。

  一个给定副本节点的所有的hint会被存储在一个单一的分区键,因此执行hint是一个简单的顺序读过程,因此对性能影响最低。如果一个副本节点负载过重或者不可用并且故障检测机制还未标注,预期情况下大部分或者所有的想那个节点发出的写入请求会失败直到因为 write_request_timeout_in_ms(默认为10秒)被触发超时,在那段时间内,Cassandra超时的时候会写hint。

  如果多个节点同时发生的话会在协调者节点上出现内存压力。所以协调者会跟踪有多少个hint正在写,如果这个数目比较大的话它会暂时性拒绝那些不正确的副本节点的写入。

四、hint的移除

  当使用nodetool removenode命令从集群中移除一个节点的时候,Cassandra自动移除不再存在的节点的hint。Cassandra也会移除被删除表的hint。

五、每周计划性修复

  第一眼,可能认为hint机制让你的数据更加安全而不需要运行修复。仅当硬件故障不发生时这是正确的。

  硬件故障有下列结果:

  •已经完成的写入的历史数据丢失。没有集群中其他节点关于节点丢失的数据信息。

  •发生故障的节点协调的hint中尚未重新执行的请求的丢失。

Cassandra1.2文档学习(12)—— hint机制的更多相关文章

  1. Cassandra1.2文档学习解读计划——为自己鼓劲

    最近想深入研究一下Cassandra,而Cassandra没有中文文档,仅有的一些参考书都是0.7/0.6版本的.因此有个计划,一边学习文档(地址:http://www.datastax.com/do ...

  2. Cassandra1.2文档学习(9)—— 数据写入

    数据参考:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/dml/manage_dml ...

  3. Cassandra1.2文档学习(6)—— 客户端数据请求

    参考文档:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/architecture/a ...

  4. Cassandra1.2文档学习(2)——节点间通信协议之gossip协议

    参考文档:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/architecture/a ...

  5. Cassandra1.2文档学习(15)—— 配置数据一致性

    参考文档:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/dml/dml_config ...

  6. Cassandra1.2文档学习(3)——数据分配和复制

    参考文档:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/architecture/a ...

  7. Cassandra1.2文档学习(16)—— 模式的变化

    参考文档:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/dml/dml_schema ...

  8. Cassandra1.2文档学习(13)—— 数据读取

    参考文档:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/dml/dml_about_ ...

  9. Cassandra1.2文档学习(1)——Cassandra基本说明

    参考文档:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/architecture/a ...

随机推荐

  1. Qt for iOS,Qt 与Objective C混合编程

    项目设置 既然要聊 Qt 混合 OC 编程,首先要简单介绍一下 Objective C .我只有一句话:Go,问搜索引擎去.因为我所知实在有限,怕误导了您.当然如果您不怕,往下看吧. OC源文件介绍 ...

  2. Java_spark简单例子

    import org.apache.spark.{SparkContext, SparkConf} /** * Created by spark on 15-1-19. * 根据key对K-V类型的R ...

  3. Scala Error: error while loading Suite, Scala signature Suite has wrong version expected: 5.0 found: 4.1 in Suite.class

    准备给scala项目引入单元测试 <dependency> <groupId>org.scalatest</groupId> <artifactId>s ...

  4. Cable master

    Description Inhabitants of the Wonderland have decided to hold a regional programming contest. The J ...

  5. Java字符流和字节流对文件操作

    记得当初自己刚开始学习Java的时候,对Java的IO流这一块特别不明白,所以写了这篇随笔希望能对刚开始学习Java的人有所帮助,也方便以后自己查询.Java的IO流分为字符流(Reader,Writ ...

  6. iOS银行卡合法性校验

    项目中用到了校验银行卡,就拿来贴上来了 + (BOOL)checkCardNo:(NSString*)cardNo;//判断银行卡 + (BOOL)checkCardNo:(NSString*)car ...

  7. 笔记——Function类型 及其 call、apply方法

    每个函数都是Function类型的实例.函数有三种定义方式和两个内部属性arguments和this. 同时函数也是对象,也有属性和方法.本篇主要其call()和apply()方法 属性 length ...

  8. Call to undefined function imagettftext()解决方法

    由 老高 发表于 2014-10-03  在 代码人生 分类 老高在一个新环境中装DEDECMS的时候发现后台验证码无法显示.直接搜索一下这个错误,有人说session错误,有的说权限错误等等,这不胡 ...

  9. 基于BaseHTTPServer的简单存储服务器

    服务器代码: from BaseHTTPServer import BaseHTTPRequestHandler from BaseHTTPServer import HTTPServer impor ...

  10. Oracle开发专题之:%TYPE 和 %ROWTYPE

    1. 使用%TYPE 在许多情况下,PL/SQL变量可以用来存储在数据库表中的数据.在这种情况下,变量应该拥有与表列相同的类型.例如,students表的first_name列的类型为VARCHAR2 ...