Dynamo涉及的算法和协议——p2p架构,一致性hash容错+gossip协议获取集群状态+向量时钟同步数据

转自:http://www.letiantian.me/2014-06-16-dynamo-algorithm-protocol/

Dynamo是Amazon的一个分布式的键值系统,P2P架构,没有主从的概念,数据一致性做到了最终一致。Apache Cassandra参考了它的实现方法。

一致性哈希

关于一致性哈希的具体内容,可以参考一致性哈希

容错

由于一致性哈希的使用,Dynamo集群中的节点在逻辑上可以认为是一个圆环。假设有M个节点,我们从某个节点开始顺时针地依次为每个节点标号为1、2、3、…、M。出于容错的需要,假设一份数据存3份。如果某份数据通过一致性哈希被存储到了节点2中,那么这份数据的另外两个副本存储在节点3和节点4中。如果节点3临时性的宕机了,那么在节点3恢复之前,会把增量数据存入节点5中;待节点3恢复后,节点5通过Gossip协议发现节点3恢复了,节点5会将那些暂存的数据“数据回传”给节点5。判断节点3的宕机是临时性的还是永久性的方法比较简单,就是看它宕(dang)机的时间长短。如果节点3永久性宕机了,那么需要使用有效的方式将这份数据的完整版本同步到节点5中。

Gossip协议

Gossip协议,也就是闲话协议。主要用来让每个节点知道集群的最新状态。这个协议其实就是:

with a given frequency, each machine picks another machine at random and shares any hot rumors.

节点之间以固定的时间频率交换信息。在交换信息时,一节点随机选取集群中的其他某个节点交换各自对集群的掌握情况,并据此更新到最新(或者较新)的集群状态信息。

NWR

N表示一份数据的副本数量。W代表写操作成功所至少需要的副本数,即在一次写入操作中至少W个副本写成功了,这次写操作才算成功。R代表读操作成功所至少需要的副本数。Dynamo认为只要R+W>N,可以保证集群的可用性。N、W、R的值是可以设定的。如果注重读的效率,可以把R的值设置小些;如果注重写的效率,可以把W的值设置小些。NWR并不能保证数据一致。如果R=N且W=N,那么可以保证一致性。

向量时钟

对于小型的或者要求不高的分布式系统而言,可以使用时间戳的方式保证副本之间数据的一致性,在时间戳方式下,多使用NTP协议同步时钟,节点之间的时钟有较小的误差。不过在大型分布式系统中,还是换种方式比较好。

向量时钟(Vector Clock),Amazon Dynamo使用的解决数据一致性问题的方法。这是一个逻辑上的时钟。假设一份数据三个副本,这三个副本分别命名为n1n2n3,每个副本都会记录所有副本的时钟(包括自身的),一个副本一个向量,三个副本则共有三个向量。所谓时钟,其实就是所存储数据的版本号,一般从0递增即可。更新时钟的规则如下:

  • 初始化所有时钟,即全部置0。
  • 某副本有数据更新时,将其自身的向量中自身的时钟的值加一个步长,一般步长设置为1。
  • 当一副本向其他副本发送消息时(一般是为了同步数据),这个副本会把自身的向量一起发送给其他副本。
  • 若一副本接收到消息,比较自身的向量和发送来的向量,如果发送来的消息是希望同步数据,那么需要判断是否更新数据。对每个向量的元素比较并取最大值,以此更新自身的向量。那么,如何更新数据? 该副本自身存储的向量的每一个值都小于发送来的向量的每一个值,说明发送来的数据比较新,那么更新数据。如果都大于,则不需要更新数据。当然,第三种情况是既有大于的关系,也有小于的关系;还有一种情况是向量相同,但是数据不同。这种情况下,需要进行冲突的解决,比如再比较时间戳。

举个例子。

假设,n1n2n3要存储的用户id为1的用户的昵称。
最开始,三个副本的向量时钟以及数据如下表示:

n1: { vector: {n1:0, n2:0, n3:0}, data: null }
n2: { vector: {n1:0, n2:0, n3:0}, data: null }
n3: { vector: {n1:0, n2:0, n3:0}, data: null }

时刻1,n1将用户昵称更新为john,向量时钟以及数据更新后如下:

n1: { vector: {n1:1, n2:0, n3:0}, data: ‘jian‘ }
n2: { vector: {n1:0, n2:0, n3:0}, data: null }
n3: { vector: {n1:0, n2:0, n3:0}, data: null }

此时对系统进行读操作,结果应是’jian’。n1给n2、n3发送了消息,更新后如下:

n1: { vector: {n1:1, n2:0, n3:0}, data: ‘jian‘ }
n2: { vector: {n1:1, n2:0, n3:0}, data: ‘jian‘ }
n3: { vector: {n1:1, n2:0, n3:0}, data: ‘jian‘ }

此时对系统进行读操作,结果应是’jian’。

时刻2,n3将用户昵称改为’fan’,更新后如下:

n1: { vector: {n1:1, n2:0, n3:0}, data: ‘jian‘ }
n2: { vector: {n1:1, n2:0, n3:0}, data: ‘jian‘ }
n3: { vector: {n1:1, n2:0, n3:1}, data: ‘fan‘ }

此时对系统进行读操作,结果应是’fan’。n3先给n2发送了消息,更新后如下:

n1: { vector: {n1:1, n2:0, n3:0}, data: ‘jian‘ }
n2: { vector: {n1:1, n2:0, n3:1}, data: ‘fan‘ }
n3: { vector: {n1:1, n2:0, n3:1}, data: ‘fan‘ }

当n3要给n1发消息之前,n1却对数据进行了修改,例如将用户昵称改为’ ruan’,更新后如下:

n1: { vector: {n1:2, n2:0, n3:0}, data: ‘ruan‘ }
n2: { vector: {n1:1, n2:0, n3:1}, data: ‘fan‘ }
n3: { vector: {n1:1, n2:0, n3:1}, data: ‘fan‘ }

此后,可能会出现下面两种冲突:

  • 对系统进行读操作,发现n2、n3与n1的向量没有偏序关系(即不小于也不大于),而且存的数据的值是不同的。此时需要解决冲突。
  • n1收到了n3发送来的消息,比较了两者的向量,发现了冲突,于是想办法解决。

资料

Vector clock

Gossip protocol

2.4.5 向量时钟(1)

《大规模分布式存储系统——原理解析与架构实践》第五章 杨传辉 著
《深入NoSQL》 Shashank Tiwari 著 巨成 译

时间: 2024-08-08 08:35:10

Dynamo涉及的算法和协议——p2p架构,一致性hash容错+gossip协议获取集群状态+向量时钟同步数据的相关文章

java学完框架后学什么?java架构师进阶学习,java高并发集群分布式,java大数据高可用,视频教程,

学习思路: 1.先学习第一套或者第二套架构师课程,帮助没有基础或基础学得不好的同学建立架构师思维,整套需要全部学习,很重要!! 2.根据工作需要,分别去学习第二套.第三套里的实战课程里的知识点,不需要全部全学习,那么多资料你没有那么多精力全部学完!! 对比内容: 本套课包含像Dubbo,Netty,Nio,Mina,Mecached,Nosql,MongoDB, Nginx, ActiveMQ等课程更全,我这里就不一一列举,亲们可以对比大小 本教程优势: 1.六套 架构师课程,基本包含了淘宝卖的

分布式memcached学习(四)—— 一致性hash算法原理

    分布式一致性hash算法简介 当你看到"分布式一致性hash算法"这个词时,第一时间可能会问,什么是分布式,什么是一致性,hash又是什么.在分析分布式一致性hash算法原理之前,我们先来了解一下这几个概念. 分布式 分布式(distributed)是指在多台不同的服务器中部署不同的服务模块,通过远程调用协同工作,对外提供服务. 以一个航班订票系统为例,这个航班订票系统有航班预定.网上值机.旅客信息管理.订单管理.运价计算等服务模块.现在要以集中式(集群,cluster)和分布

分布式缓存技术memcached学习系列(四)—— 一致性hash算法原理

文章主目录 分布式一致性hash算法简介 分布式一致性hash算法使用背景 环形hash空间 映射key到环形hash空间 映射server节点到hash空间 映射key到server节点 添加server节点 删除server节点 虚拟节点的引入 节点变化数据分流的问题 一致性hash算法与取模算法的比较 参考文档 回到顶部 分布式一致性hash算法简介 当你看到“分布式一致性hash算法”这个词时,第一时间可能会问,什么是分布式,什么是一致性,hash又是什么.在分析分布式一致性hash算法

python3 一致性hash算法

python3 一致性hash算法 量少的场景, 一致性hash不均匀的问题很难解决,加500个虚拟节点也不是很管用 算法很简单,自己用函数写了一下,仅供参考: python3代码展示: import hashlib server_ip_list = ["192.168.1.10", "192.168.2.20", "192.168.3.30","192.168.4.40"] client_ip_list = ["1

Dynamo分布式系统——「RWN」协议解决多备份数据如何读写来保证数据一致性,而「向量时钟」来保证当读取到多个备份数据的时候,如何判断哪些数据是最新的这种情况

转自:http://blog.jqian.net/post/dynamo.html Dynamo是Amazon开发的一款高可用的分布式KV系统,已经在Amazon商店的后端存储有很成熟的应用.它的特点:总是可写(500+ per sec, 99.9% <300ms),并且可以根据需求优化配置(调整RWN模型). 根据CAP原则 (Consistency, Availability, Partition tolerance),Dynamo是一个AP系统,只保证最终一致性. Dynamo的三个主要概

[蓝牙] 2、蓝牙BLE协议及架构浅析&amp;&amp;基于广播超时待机说广播事件

第一章 BLE基本概念了解 一.蓝牙4.0和BLE区别 蓝牙4.0是一种应用非常广泛.基于2.4G射频的低功耗无线通讯技术.蓝牙低功耗(Bluetooth Low Energy ),人们又常称之为BlueTooth Smart,是由SIG( the Bluetooth Special Interest Group) 在2010年6月起草,在原有标准的蓝牙4.0核心协议上添加的一种低功耗技术. 蓝牙低功耗不等同于蓝牙4.0,只是蓝牙4.0的一个分支.蓝牙4.0是蓝牙3.0+ HS(高速蓝牙)规范的

亿级日PV的魅族云同步的核心协议与架构实践(转)

云同步的业务场景 这是魅族云同步的演进,第一张是M8.M9,然后到后面的是MX系统,M9再往后发展,我们的界面可以看到基本上是没有什么变化的,但本质发生了很大的变化,我们经过了一些协议优化,发展到今天的魅族云同步. 这是云服务对应的网页端,界面非常简洁,可以看到正中间我们有4个模块,提供一些传统数据的讨论,不得不提一下这边的查手机,我们通过它帮一些客户找到了他的手机,它的功能是很强大的,可以定位位置,还可以进行一些拍照. 我们的业务发展了这么多年,一个是手机端,一个是网页端,都说搞技术的是非常寂

马哥学习笔记二十五——ISCSI协议,架构及其安装配置

ISCSI监听在tcp/3260端口 iSCSI Target:iscsi-target-utils 客户端认正方式: 1.基于IP 2.基于用户,CHAP tgtadm:命令行工具,模式化命令 --mode 常用模式:target,logicalunit,account target --op new.delete.show.update.bind.unbind logicalunit --op new.delete account --op new.delete.bind.unbind --

浅谈集群版Redis和Gossip协议

今天来看一下Redis-Cluster和其中的重要概念Gossip协议. 1.Redis Cluster的基本概念 集群版的Redis听起来很高大上,确实相比单实例一主一从或者一主多从模式来说复杂了许多,互联网的架构总是随着业务的发展不断演进的. 单实例Redis架构最开始的一主N从加上读写分离,Redis作为缓存单实例貌似也还不错,并且有Sentinel哨兵机制,可以实现主从故障迁移. 单实例一主两从+读写分离结构: 单实例的由于本质上只有一台Master作为存储,就算机器为128GB的内存,