Cassandra使用叫做Gossip的协议发现集群中其他节点的位置和状态信息。Gossip是一个点对点的通信协议,节点之间会周期进行状态信息交换——这些信息包括当前节点本身信息,以及当前节点存储的其他节点的状态信息。 在Cassandra中,gossip进程每秒钟都会和集群中的其他三个节点交换状态消息。状态信息包括节点自身的信息、以及所存储的其他节点的信息,这样集群中的节点,很快就能够互相了解。gossip消息都有一个版本信息,随着交换的进行,旧的信息会逐渐被旧的信息覆盖。 集群成员和种子节点 当节点第一次启动,它会从配置文件中确定所属Cassandra集群的名字,以及确定seeds node(我翻译为种子节点),通过这些seeds node,可以获取集群中其他节点的信息。这些配置信息,都在cassandra.yaml配置文件中。 为了避免gossip通信分区,集群中所有节点必须配置相同的seeds node列表。这对节点第一次启动来说至关重要。默认的,节点会在后续的重启过程中,记住这些与它交换gossip信息的节点。 Note:seed node的设计,并没有特殊的目的,仅仅是为了能够处理新加入节点到集群中的情况。 为了知道节点存储的是哪个范围内的数据,节点必须知道它自己的token,以及集群中其他节点的token。当初始化一个新的集群,开发人员需要为集群生成tokens,并且将这些tokens分配给每一个节点。切记,这个操作要在第一次启动之前完成。当集群启动之后,节点会通过gossip将自己的token告诉其他节点,同时也知道其他节点的token。更多可以看Cassandra数据划分。 关于失败检测和恢复 失败检测是根据gossip状态信息,判断集群中的另一个节点是否正常。失败检测可以用来避免客户端发送请求到不可达的节点。 gossip会追踪其他直接或者间接节点的心跳信息。Cassanda没有采用一个固定的阈值,作为宕机的标志,而是通过一个稍微复杂的监测机制进行的:具体会包括网络条件,服务器负载或者其他的可能影响到心跳频率的条件。在gossip消息交换过程中,每一个节点维护这一个其他节点的的gossip消息到达时间的窗口。phi值就是基于集群中所有节点的内部到达时间的分布。在Cassandra中,配置phi_convict_threshold属性可以调整失败检测的敏感度。在绝大多数的情况下,使用默认值即可。但是,DataStax推荐将其设置为12,当Cassandra部署在EC2之上的时候,主要原因是因为EC2上网络竞争比较激烈。 造成节点失效的原因可能有很多中:硬件故障,网络中断等等。节点中断经常是短暂的,但也可能会延长。一个节点的中断,不会造成节点永久的从集群中移除。其他的节点,仍旧会周期性的发送gossip消息,以判断中断节点是否恢复。如果想永久的改变节点的成员关系,管理员必须显示的通过nodetool进行删除和添加节点。 当一个节点从中断恢复之后,可能会缺少一些本来应该写入这个节点的数据。一旦检测到某一个节点宕机,原先要写入宕机节点的操作,会写入其他节点进行代替,这个需要打开hinted handoff。然后,也有可能,一些数据会真的丢失,因为检测失败是有延迟的。或者,一个节点,宕机时间超过max_hint_window_in_ms(默认是1小时),hints的数据,将不会写入到其他节点。因为这个原因,定期例行的在每一个节点上执行nodetool repair是非常有必要的。这样可以帮助保证数据的一致性。在宕机节点恢复之后,也要执行repair,可以帮助恢复数据。 【原文地址】 http://www.datastax.com/docs/1.1/cluster_architecture/gossip 这篇理解得不好,主要是gossip不够熟悉,需要加强。后面的几段,对于运维来说,还是非常重要的。 【完】

转载于:https://www.cnblogs.com/sing1ee/archive/2012/06/27/2765049.html

有关Cassandra节点之间的通信:Gossip【译】相关推荐

  1. kubernetes 控制平台和节点之间的通信

    这篇文章也是翻译的官网:Control Plane-Node Communication 这篇文章主要罗列(catelogs)控制平台(更确切的说是apiserver)和工作节点(nodes)之间的通 ...

  2. 基于ssh的多节点之间互信通信的实现

    实现条件:node1:192.168.176.6 主机名称是node1.magedu.com: node2:192.168.176.6 主机名称是node1.magedu.com: 实现目的:在节点n ...

  3. k8s pod之间不能通信_Kubernetes的工作由两个pod组成(必须在不同的节点上运行并相互通信)...

    我正在尝试创建一个包含两个pod的Kubernetes作业,这两个pod必须在我们的Hybrid集群中的不同节点上进行调度 . 我们的要求是其中一个pod在Windows Server节点上运行而另一 ...

  4. 分布式系统中节点之间的同步形成区块链

    链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载. 分布式系统中节点之间的同步形成区块链 分布式系统由Tanenbaum定义,"分布式系统是一组独立的计算 ...

  5. linux:进程之间的通信

    ipc :进程间通信(InterProcess Communication) 1.管道 同一时间是单向的:父读子写,或父写子读  管道中的数据 ,读走就没了  参数是一个整型数的数组,数组的大小是两个 ...

  6. 【网络通信与信息安全】之深入解析两台主机之间的通信过程和原理

    一.前言 本文通过在 Docker 容器中执行命令,来深入了解两台主机之间的通信过程.阅读完本文,您将熟悉以下内容: Docker 的基本操作: 创建 socket 并发送 HTTP 请求: 路由表. ...

  7. android组建之间通信_Android组件化(三)组件之间的通信

    介绍 在组件化开发的时候,组件之间是相互独立的没有依赖关系,我们不能在使用显示调用来跳转页面了,因为我们组件化的目的之一就是解决模块间的强依赖问题,假如现在要从A业务组件跳转到业务B组件,并且要携带参 ...

  8. MQTT通信平台助力AGV小车与控制系统之间实现通信

    前言 本案例主要描述AGV小车和控制系统之间的通信过程,通过VDA 5050标准接口.MQTT通信协议和虹科HiveMQ实现AGV小车和控制系统之间指令和状态信息的通信. VDA 5050是一种AGV ...

  9. 云产品流转 - 实现小车和微信小程序之间的通信(M2M通信)

    @[toc] 功能需求: 小程序客户端(设备1)需要向小车(设备2)发送指令,控制小车的速度和方向等.所以,也就是说两个设备之间需要通信. 尝试方法:使用自定义 Topic 设备1:订阅了一个自定义的 ...

最新文章

  1. 讯飞语音:客户端未被授权
  2. 博士如何高效率阅读文献?有哪些技巧可以借鉴?
  3. 基于倒排表的电力调度知识问答系统构建 (100行代码带你实现nlp问答系统)
  4. Python基础概念_12_编程风格
  5. 用户模式 linux救援单用户 (补充)
  6. Tmux的安装、使用与配置
  7. 对GCD的一些理解和实践
  8. 四、scrapy爬虫框架——scrapy管道的使用
  9. pytorch实现人脸识别_PyTorch实现,GitHub4000星:这是微软开源的计算机视觉库
  10. flex项目学习包括什么内容
  11. 处理ionic项目中,输入框的光标不自动定位,键盘不弹出的问题
  12. eclipse远程发布代码的方法(SSH自动同步)
  13. 毕业设计 - 题目 :基于大数据的疫情数据分析及可视化系统
  14. 2015-nature-deep learning-LeCun, Bengio and Hinton
  15. 39个让你受益的HTML5教程
  16. iTool拷贝app到电脑上
  17. 腾讯云阿里云4月服务器价格对比
  18. 蓝桥 卷“兔”来袭编程竞赛专场-06姜子牙阴书加密 题解
  19. 能够翻译文档的免费软件-免费翻译整个文档的软件
  20. 【Resnet】Resnet代码详解(图+代码)

热门文章

  1. Sql中partition by的使用
  2. rel=alternate stylesheet属性
  3. Android学习之NDK环境的配置
  4. C++之第一个程序Hello World,使用IO库输出Hello World
  5. Java学习之路之环境的配置
  6. SpringMVC自学日志01(回顾servlet)
  7. SpringCloud使用汇总Config
  8. 铁大Facebook——十天冲刺(1)
  9. python中字典和集合的使用
  10. ID的权限问题导致免密码登录失效