分布式协议-Gossip协议
【摘要】 Gossip背景在分布式系统中,不同的节点进行数据/信息共享是一个基本的需求。一种比较简单粗暴的方法就是集中式发散消息,简单来说就是一个主节点同时共享最新消息给其他所有节点,比较依赖中心化系统,不过过于依赖中心节点,存在单点风险。于是分散式发散消息的Gossip协议诞生Gossip协议简介Gossip直译即流言蜚语的意思,比喻容易传播且传播速度快。Gossip协议具有随机传播特性,这是Gos...
Gossip背景
在分布式系统中,不同的节点进行数据/信息共享是一个基本的需求。
一种比较简单粗暴的方法就是集中式发散消息,简单来说就是一个主节点同时共享最新消息给其他所有节点,比较依赖中心化系统,不过过于依赖中心节点,存在单点风险。于是分散式发散消息的Gossip协议诞生
Gossip协议简介
Gossip直译即流言蜚语的意思,比喻容易传播且传播速度快。
Gossip协议具有随机传播特性,这是Gossip协议的主要特点。
Gossip协议是一种允许在分布式系统中共享状态的去中心化通信协议,通过这种通信协议,我们可以将信息传播给网络或集群中的所有成员。
Gossip协议应用
Redis、Apache Cassandra、Consul等使用了Gossip协议。
Redis举例:
Redis Cluster是一个典型的分布式系统,分布式系统中的各个节点需要互相通信。既然要相互通信就要遵循一致的通信协议,Redis Cluster中的各个节点基于Gossip协议来进行通信共享信息,每个Redis节点都维护了一份集群的状态信息。
Redis Cluster的节点之间会互相发送多种Gossip消息:
- MEET: 在Redis Cluster中的某个Redis节点上执行ClUSTER MEET in port命令,可以像指定的Redis节点发送一条MEET消息,用于将其添加进Redis Cluster成为新的Redis节点。
- PING/PONG:Redis Cluster 中的节点都会定时地向其他节点发送PING消息,来交换各个节点状态消息,检查各个节点状态,包括在线状态、疑似下线状态PFAIL和已下线状态FAIL。
- FAIL: Redis Cluster 中的节点A发现B节点PFAIL,并且在下线报告的有效期内集群中半数以上的节点将B节点标记为 PFAIL,节点A就会向集群广播一条FAIL消息,通知其他节点将故障节点B标记为FAIL.
- ....
有了Redis Cluster之后,不需要专门部署Sentinel集群服务了。Redis Cluster相当于内置了Sentinel机制,Redis Cluster内部的各个节点通过Gossip协议互相探测健康状态,在故障时可以自动切换。
Gossip协议消息传播模式
Gossip设计了两种可能的消息传播模式:反熵和传谣
- 熵:即混乱的意思: 反熵主要体现在随机上,集群中的节点通过随机选择其他节点,通过推、拉、推拉的方式进行数据传播。但是对于节点过多以及节点动态变化的场景不太实用。
- 谣言:即热点传播的意思:谣言主要体现在热点上,集群中的节点获取了新的节点后,就会成为活跃点,周期性练习其他节点“传播谣言”,知道所有节点都存储了该数据。适用于节点多的情况,但是传输的数据包不易过大。
总结:
- 反熵会传播节点所有的数据,谣言仅传播节点新增数据
- 反熵一般需要涉及成闭环
- 谣言比较适合节点数量多以及动态的节点场景
Gossip协议的优势和缺陷
优势
- 相比于其他分布式协议/算法来说,Gossip协议理解容易
- 能够容忍网络节点的随意增加或减少,节点去中心化
- 速度相对快,节点较多的场景比中心化节点传播的方式速度更快
劣势
- 消息需要多轮传播才能传播到真个网络,强调的是最终一致性
- 拜占庭将军问题,不允许恶意节点
- 可能出现消息冗余问题,随机性可能导致重复传播
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)