(一)Gossip的作用
Cassandra集群没有中心节点,各个节点的地位完全相同,它们通过一种叫做gossip的协议维护集群的状态。
通过gossip,每个节点都能知道集群中包含哪些节点,以及这些节点的状态,这使得Cassandra集群中的任何一个节点都可以完成任意key的路由,任意一个节点不可用都不会造成灾难性的后果。

(二)Gossip协议介绍
gossip的学名叫做Anti-entropy(逆熵?),比较适合在没有很高一致性要求的场景中用作同步信息。信息达到同步的时间大概是log(N),这里N表示节点的数量。
gossip有两种形式:anti-entropy和rumor-mongering。
gossip中的每个节点维护一组状态,状态可以用一个key/value对表示,还附带一个版本号,版本号大的为更新的状态。
消息的处理有3种方式,Cassandra采用第三种方式——Push-pull-gossip

(三)Gossip消息如何如何发送
当一个节点启动时,获取配置文件(cassandra.yaml)中的seeds配置,从而知道集群中所有的seed节点。
Cassandra内部有一个Gossiper,每隔一秒运行一次(在Gossiper.java的start方法中),按照以下规则向其他节点发送同步消息:
1、随机取一个当前活着的节点,并向它发送同步请求
2、向随机一台不可达的机器发送同步请求
3、如果第一步中所选择的节点不是seed,或者当前活着的节点数少于seed数,则向随意一台seed发送同步请求
如果没有这个判断,考虑这样一种场景,有4台机器,{A, B, C, D},并且配置了它们都是seed,如果它们同时启动,可能会出现这样的情形:
1、A节点起来,发现没有活着的节点,走到第三步,和任意一个种子同步,假设选择了B
2、B节点和A完成同步,则认为A活着,它将和A同步,由于A是种子,B将不再和其他种子同步
3、C节点起来,发现没有活着的节点,同样走到第三步,和任意一个种子同步,假设这次选择了D
4、C节点和D完成同步,认为D活着,则它将和D同步,由于D也是种子,所以C也不再和其他种子同步
这时就形成了两个孤岛,A和B互相同步,C和D之间互相同步,但是{A,B}和{C,D}之间将不再互相同步,它们也就不知道对方的存在了。
加入第二个判断后,A和B同步完,发现只有一个节点活着,但是seed有4个,这时会再和任意一个seed通信,从而打破这个孤岛。

(四)Cassandra中Gossip数据结构
gossip通信的状态信息主要有3种:
1、EndPointState
2、HeartBeatState
3、ApplicationState
HeartBeatState 由generation和version组成,generation每次启动都会变化,用于区分机器重启前后的状态;Version是只能增长的,每次心跳之前进行递增
ApplicationState用于表示系统的状态,由state和version组成,state表示节点的状态,version是递增的,每个对象表示节点一种状态,比如表示当前load的状态大概是这样:(1.2, 20),含义为版本号为20时该节点的load是1.2
EndPointState 封装了一个节点的ApplicationState构成的映射(Map<String, ApplicationState> applicationState_)和HeartBeatState
一个节点自身的状态只能由自己修改,其他节点的状态只能通过同步更新。

(六)Gossip状态信息有哪些
负载信息(LOAD-INFORMATION)
迁移信息(MIGRATION)
节点状态信息(MOVE)
        BOOT(启动阶段)节点正在启动
        NORMAL(正常)节点加入了Token的ring,可以提供读
        LEAVING,节点准备离开Ring
        LEFT,节点被踢出集群或者是Token信息被手工变更

(七)Gossip消息同步过程

(八)Gossip消息同步实例
(1)Node 10.0.0.1(endPointStateMap):

[xhtml] view plaincopyprint?
  1. EndPointState 10.0.0.1
  2. HeartBeatState: generation 1259909635, version 325
  3. ApplicationState “load-information”: 5.2, generation 1259909635, version 45
  4. ApplicationState “bootstrapping”: bxLpassF3XD8Kyks, generation 1259909635, version 56
  5. ApplicationState “normal”: bxLpassF3XD8Kyks, generation 1259909635, version 87
  6. EndPointState 10.0.0.2
  7. HeartBeatState: generation 1259911052, version 61
  8. ApplicationState “load-information”: 2.7, generation 1259911052, version 2
  9. ApplicationState “bootstrapping”: AujDMftpyUvebtnn, generation 1259911052, version 31
  10. EndPointState 10.0.0.3
  11. HeartBeatState: generation 1259912238, version 5
  12. ApplicationState “load-information”: 12.0, generation 1259912238, version 3
  13. EndPointState 10.0.0.4
  14. HeartBeatState: generation 1259912942, version 18
  15. ApplicationState “load-information”: 6.7, generation 1259912942, version 3
  16. ApplicationState “normal”: bj05IVc0lvRXw2xH, generation 1259912942, version 7

EndPointState 10.0.0.1 HeartBeatState: generation 1259909635, version 325 ApplicationState “load-information”: 5.2, generation 1259909635, version 45 ApplicationState “bootstrapping”: bxLpassF3XD8Kyks, generation 1259909635, version 56 ApplicationState “normal”: bxLpassF3XD8Kyks, generation 1259909635, version 87 EndPointState 10.0.0.2 HeartBeatState: generation 1259911052, version 61 ApplicationState “load-information”: 2.7, generation 1259911052, version 2 ApplicationState “bootstrapping”: AujDMftpyUvebtnn, generation 1259911052, version 31 EndPointState 10.0.0.3 HeartBeatState: generation 1259912238, version 5 ApplicationState “load-information”: 12.0, generation 1259912238, version 3 EndPointState 10.0.0.4 HeartBeatState: generation 1259912942, version 18 ApplicationState “load-information”: 6.7, generation 1259912942, version 3 ApplicationState “normal”: bj05IVc0lvRXw2xH, generation 1259912942, version 7

(2)Node 10.0.0.2(endPointStateMap):

[c-sharp] view plaincopyprint?
  1. EndPointState 10.0.0.1
  2. HeartBeatState: generation 1259909635, version 324
  3. ApplicationState ”load-information”: 5.2, generation 1259909635, version 45
  4. ApplicationState ”bootstrapping”: bxLpassF3XD8Kyks, generation 1259909635, version 56
  5. ApplicationState ”normal”: bxLpassF3XD8Kyks, generation 1259909635, version 87
  6. EndPointState 10.0.0.2
  7. HeartBeatState: generation 1259911052, version 63
  8. ApplicationState ”load-information”: 2.7, generation 1259911052, version 2
  9. ApplicationState ”bootstrapping”: AujDMftpyUvebtnn, generation 1259911052, version 31
  10. ApplicationState ”normal”: AujDMftpyUvebtnn, generation 1259911052, version 62
  11. EndPointState 10.0.0.3
  12. HeartBeatState: generation 1259812143, version 2142
  13. ApplicationState ”load-information”: 16.0, generation 1259812143, version 1803
  14. ApplicationState ”normal”: W2U1XYUC3wMppcY7, generation 1259812143, version 6

EndPointState 10.0.0.1 HeartBeatState: generation 1259909635, version 324 ApplicationState “load-information”: 5.2, generation 1259909635, version 45 ApplicationState “bootstrapping”: bxLpassF3XD8Kyks, generation 1259909635, version 56 ApplicationState “normal”: bxLpassF3XD8Kyks, generation 1259909635, version 87 EndPointState 10.0.0.2 HeartBeatState: generation 1259911052, version 63 ApplicationState “load-information”: 2.7, generation 1259911052, version 2 ApplicationState “bootstrapping”: AujDMftpyUvebtnn, generation 1259911052, version 31 ApplicationState “normal”: AujDMftpyUvebtnn, generation 1259911052, version 62 EndPointState 10.0.0.3 HeartBeatState: generation 1259812143, version 2142 ApplicationState “load-information”: 16.0, generation 1259812143, version 1803 ApplicationState “normal”: W2U1XYUC3wMppcY7, generation 1259812143, version 6
GossipDigestSynMessage(节点10.0.0.1):
10.0.0.1:1259909635:325
10.0.0.2:1259911052:61
10.0.0.3:1259912238:5
10.0.0.4:1259912942:18

GossipDigestAckMessage(节点10.0.0.2):
10.0.0.1:1259909635:324
10.0.0.3:1259912238:0
10.0.0.4:1259912942:0
10.0.0.2:
[ApplicationState “normal”: AujDMftpyUvebtnn, generation 1259911052, version 62],
 [HeartBeatState, generation 1259911052, version 63]

GossipDigestAck2Message(节点10.0.0.1):
10.0.0.1:
  HeartBeatState: generation 1259909635, version 325
  ApplicationState “load-information”: 5.2, generation 1259909635, version 45
  ApplicationState “bootstrapping”: bxLpassF3XD8Kyks, generation 1259909635, version 56
  ApplicationState “normal”: bxLpassF3XD8Kyks, generation 1259909635, version 87
10.0.0.3:
  HeartBeatState: generation 1259912238, version 5
  ApplicationState “load-information”: 12.0, generation 1259912238, version 3
10.0.0.4:
  HeartBeatState: generation 1259912942, version 18
  ApplicationState “load-information”: 6.7, generation 1259912942, version 3
  ApplicationState “normal”: bj05IVc0lvRXw2xH, generation 1259912942, version 7

            </div>

Cassandra中Gossip具体实现方式相关推荐

  1. Cassandra中的数据建模

    在关系数据模型中,我们为域中的每个对象建模关系/表. 对于Cassandra,情况并非如此.本文将详细介绍在Cassandra中进行数据建模时需要考虑的所有方面. 以下是Cassandra数据建模的粗 ...

  2. 将Bean放入Spring容器中的五种方式

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:blog.csdn.net/weixin_43741092/ article/details/120176466 将bean放 ...

  3. 批量插入数据库语句java_java相关:MyBatis批量插入数据到Oracle数据库中的两种方式(实例代码)...

    java相关:MyBatis批量插入数据到Oracle数据库中的两种方式(实例代码) 发布于 2020-7-22| 复制链接 本文通过实例代码给大家分享了MyBatis批量插入数据到Oracle数据库 ...

  4. python ctypes库中动态链接库加载方式

    最近看了<Gray hat python>一书,这才知道为什么python是黑客必学的编程语言.通过python的ctypes模块,可以直接调用动态链接库中的导出函数,而且甚至可以直接在p ...

  5. android 实现自定义监听接口,Android在自定义类中实现自定义监听器方式

    Android在自定义类中实现自定义监听器方式 发布时间:2020-08-31 06:19:39 来源:脚本之家 阅读:203 作者:Simon_Qi 监听器可以说是Android开发中最常用的东西之 ...

  6. opengl中的Floatbuffer和IntBuffer与java中数据的存储方式不同的解决方法,编辑一个自己的BufferUtil工具类

    opengl中的Floatbuffer和IntBuffer与java中数据的存储方式不同的解决方法,编辑一个自己的BufferUtil工具类 参考文章: (1)opengl中的Floatbuffer和 ...

  7. 在C#中使用代理的方式触发事件 (委托和事件 ) (转)

    From:  http://www.cnblogs.com/gzhnan/articles/1859477.html 在C#中使用代理的方式触发事件 (委托和事件 ) 事件(event)是一个非常重要 ...

  8. 转载——C语言中float,double类型,在内存中的结构(存储方式)

    最近在做一个数据格式分析和转换的项目,第一次接触底层的二进制代码存储,看的一头雾水,看到这个帖子后对于在Windows系统下数据的存储方式有了更多的了解,将原文分享一下: 原文地址为http://ww ...

  9. 【Flutter】Flutter 调试 ( 调试回退功能 | Debug 调试中查看变量的方式 | 控制台信息 )

    文章目录 一.调试回退功能 二.Debug 调试中查看变量的方式 三.Debug 控制台信息 四.相关资源 一.调试回退功能 在调试过程中 , 经常错过关键位置的调试 , 如没有进入关键方法进行调试 ...

  10. 翻译:XtraDB/InnoDB中的AUTO_INCREMENT处理方式(已提交到MariaDB官方手册)

    本文为mariadb官方手册:XtraDB/InnoDB中的AUTO_INCREMENT处理方式的译文. 原文:https://mariadb.com/kb/en/auto_increment-han ...

最新文章

  1. C++内存对象大会战
  2. mysql using filesort_mysql using filesort Using temporary
  3. transform css3 的使用及理解
  4. 【计算机系统设计】实践笔记(5)插叙:内外有别之CPU和Memory
  5. 【文末赠书】漫画:什么是 “跳表” ?
  6. 对象过滤某个属性 循环 php_37道PHP面试题(附答案)
  7. linux bool变量,Objective-C中的占位符,打印BOOL类型数据
  8. hadoop的ACL权限
  9. 【题解】(图论) —— POJ 0714:兔子与星空
  10. Java单元测试框架 - JUnit
  11. 维纳滤波器matlab程序,维纳滤波原理及其matlab实现
  12. 常见sql注入语句和xss注入语句
  13. Java上传文件格式判断
  14. Codeforces Problem-705A Hulk
  15. mysql索引详细介绍简书_细说mysql索引
  16. Word2013目录设置,页码对齐
  17. git由ssh改为http后,HTTP Basic: Access denied无法同步问题解决
  18. echarts 好看的柱形图
  19. 【Python爬虫】下载b站视频。超详细。
  20. RAM ROM 寄存器(Rigester) CPU的关系

热门文章

  1. 顺利通过2021年上工信部的网络工程师考试,在此感悟一下
  2. SVN clean up报错
  3. ubuntu SSH 链接服务器加代理
  4. 国内根据IP地址查询具体位置
  5. java的string的intern_java String的intern()方法
  6. 投资体系-01-房产投资-普通购房者和投资者 分水岭
  7. 台式计算机mac地址查询,计算机mac地址查询
  8. 使用MACD指标在上证指数000001.SH上开发单边多头策略
  9. 漫话:如何给女朋友解释灭霸的指响并不是真随机消灭半数宇宙人口的?
  10. 启动计算机 登管理员用户,Windows xp系统使用管理员账户登入系统的技巧