分布式基础(六)——分布式理论之分布式一致性:Gossip协议

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO

联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬

学习必须往深处挖,挖的越深,基础越扎实!

阶段1、深入多线程

阶段2、深入多线程设计模式

阶段3、深入juc源码解析


阶段4、深入jdk其余源码解析


阶段5、深入jvm源码解析

码哥源码部分

码哥讲源码-原理源码篇【2024年最新大厂关于线程池使用的场景题】

码哥讲源码【炸雷啦!炸雷啦!黄光头他终于跑路啦!】

码哥讲源码-【jvm课程前置知识及c/c++调试环境搭建】

​​​​​​码哥讲源码-原理源码篇【揭秘join方法的唤醒本质上决定于jvm的底层析构函数】

码哥源码-原理源码篇【Doug Lea为什么要将成员变量赋值给局部变量后再操作?】

码哥讲源码【你水不是你的错,但是你胡说八道就是你不对了!】

码哥讲源码【谁再说Spring不支持多线程事务,你给我抽他!】

终结B站没人能讲清楚红黑树的历史,不服等你来踢馆!

打脸系列【020-3小时讲解MESI协议和volatile之间的关系,那些将x86下的验证结果当作最终结果的水货们请闭嘴】

Gossip 协议,顾名思义,就像流言蜚语一样,利用一种随机、带有传染性的方式,将信息传播到整个网络中,并在一定时间内,使得系统内的所有节点数据一致。

根据 Base 理论,如果你需要实现最终一致性,那么就可以通过 Gossip 协议实现这个目标。

Gossip协议的核心一共是三块内容:直接邮寄(Direct Mail)反熵(Anti-entropy)谣言传播(Rumor mongering)

一、直接邮寄(Direct Mail)

所谓直接邮寄,就是直接发送更新数据,当数据发送失败时,将数据缓存下来,然后重传。

比如下图中,节点 A 直接将更新数据发送给了节点 B、D:

虽然直接邮寄实现起来比较容易,数据同步也很及时,但可能会因为缓存队列满了而丢数据。 也就是说,只采用直接邮寄是无法实现最终一致性的。

二、反熵(Anti-entropy)

熵,在物理学中是用来度量体系的混乱程度。所以,反熵就是要消除混乱,Gossip协议通过反熵来异步修复节点之间的数据差异,实现最终一致性。

反熵的实现,一共有  、  、 推拉 三种。 集群中的节点,每隔一段时间就会随机选择某个其他节点,然后交换自己的已有数据来消除两者之间的差异。

但是正因为反熵需要节点间两两交换比对数据,所以执行反熵时的通讯成本会很高,不建议在实际场景中频繁执行反熵,应该通过引入Checksum等机制,降低需要对比的数据量和通讯次数。

2.1 推方式

推方式,就是将自己的所有副本数据,推给对方,修复对方副本中的熵:

2.2 拉方式

拉方式,就是拉取对方的所有副本数据,修复自己副本中的熵:

2.3 推拉方式

推拉方式,就是同时修复自己副本和对方副本中的熵:

虽然反熵很实用,但是执行反熵时,相关的节点都是已知的,而且节点数量不能太多,如果是一个动态变化或节点数比较多的分布式环境,反熵就不适用了。那么当你面临这个情况要怎样实现最终一致性呢?答案就是谣言传播。

三、谣言传播(Rumor mongering)

谣言传播,广泛地散播谣言,它指的是当一个节点有了新数据后,这个节点变成活跃状态,并周期性地联系其他节点向其发送新数据,直到所有的节点都存储了该新数据。

比如下图中,节点 A 向节点 B、D 发送新数据,节点 B 收到新数据后,变成活跃节点,然后节点 B 向节点 C、D 发送新数据:

谣言传播非常具有传染性,它 适合动态变化的分布式系统 。

四、总结

作为一种异步修复、实现最终一致性的协议,反熵在存储组件中应用广泛,比如 Dynamo、InfluxDB、Cassandra,在需要实现最终一致性时,如果节点都是已知的,一般优先考虑反熵。当集群节点是变化的,或者集群节点数比较多时,这时要采用谣言传播的方式,同步更新数据,实现最终一致。

  • 12
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值