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的三个主要概念:

  • Key-Value:Key用来唯一标识一个数据对象,Value标识数据对象具体内容,只能通过Key对该对象进行读写操作。
  • 节点(node):指一台物理主机。主要有 协调请求(request coordination)、成员及故障检测(membership and failure detection) 和 本地持久化(local persistence engine) 三大功能组件,底层的数据持久化存储一般使用Berkeley DB TDS。
  • 实例(instance):每个实例由一组节点组成,从应用层看,实例提供IO功能。实例上的节点可以位于不同IDC以保证容灾。

数据分区(Partition)

分布式系统中 数据分区 是个重要话题,Dynamo使用了Consistent Hash的变种,增加了虚节点的概念。这样一个实际的物理节点会分布到环上的成百上千个虚节点上。这样的好处在于:

  • 如果一个节点不可用(故障或者维护),该节点的负载可以均匀的分散到其他可用节点上;
  • 如果一个节点重新可用,或者新加入一个节点,新增节点可以接受到和原来节点大致相同的请求量;
  • 虚节点的数目可以根据物理机器的容量调整,以保证不容量的机型达到相应的负载。

数据复制(Replication)

为了高可用性,Dynamo同样使用副本,默认副本数为3。Dynamo里复制副本很简单,当Key通过Consistent Hash散列到节点A上后,节点A的协调器(coordinator)会把该份数据自动复制到顺时针方向紧邻它的N-1个节点上,其中N是副本数。

数据版本(Data Versioning)

由于存在多副本,在没有达到最终一致性之前,对每个副本的写操作Dynamo是接受的,它的做法是标记一个版本号,这会导致系统中同一时间出现同一数据对象的多个版本。当然,这种做法比较适合Amazon自己的购物车应用,以便保证每次用户对购物车的更改都是可以保留下来。

在多数情况下,新版本会包含老版本,且系统自己就能协调(syntactic reconciliation)决定最终版本。但用过版本管理系统的人都知道,版本冲突是不可避免的,Dynamo也会遇到这种情况,此时需要交由应用层来协调,将多个分支的数据强行合并(collapse)一个版本。这种版本协调的结果,对于购物车应用来说,添加的商品不会丢失,但是删除的商品有可能出现,对于购物车场景来说是可以接受的。

Dynamo使用向量时钟(Vector Clock)来做版本控制,以合并冲突。

读写操作

Dynamo是一个高可用性系统,任何节点可以在任何时刻(failure-free)接受应用层的读写操作。但由于有多副本,读写操作就涉及数据一致性问题。为了解决该问题,Dynamo使用了类似法定仲裁Quorum)的一致性协议。

Quroum协议有两个个配置项:

  • R 一次成功读操作中最少参与的节点数目
  • W 一次成功写操作中最少参与的节点数目

Quorum是说要保证:W+R > N,相当于 写成功需要的副本数 + 读成功需要的副本数 > 副本总数,则能保证最终一致性。官方建议(N, R, W) = (3, 2, 2)以兼顾AP。

故障处理(Hinted handoff)

在一个节点出现临时性故障时,数据会自动进入列表中的下一个节点进行写操作,并标记为handoff数据,在收到通知需要原节点恢复时重新把数据推回去。这能使系统的写入成功大大提升。

处理永久故障(Replica synchronization)

为了更快的检测副本之间是否不一致,Dynamo使用MerkleTree。MerkleTree是一个hash值构成的树,每个叶子节点是Key的hash值,然后中间节点是所有儿子节点的hash值,这样每个子节点的变动都会反应到上层父节点。使用MerkleTree为数据建立索引,只要任意数据有变动,都将快速反馈出来,可以提速数据变动时的查找。这一技术在torrent p2p传输中早有普及。

成员和故障检测

Gossip是一种去中心化的通讯协议,通常被用在分布式的非强一致性系统中,用来同步各节点状态。具体做法是,在一个有界网络中,每个节点会 周期性的 随机的 发起Gossip会话,经过多轮通信后,最终所有节点状态会达成一致。它可以用来发现成员,也可以用来故障检测。

Gossip有多种具体实现,Daynamo中使用的是Anti-entropy实现。

据说早期Dynamo的做法类似corosync,是在每台节点上维护一个全部节点状态的全局视图。

参考:

时间: 2024-10-27 18:20:31

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

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

转自:http://www.letiantian.me/2014-06-16-dynamo-algorithm-protocol/ Dynamo是Amazon的一个分布式的键值系统,P2P架构,没有主从的概念,数据一致性做到了最终一致.Apache Cassandra参考了它的实现方法. 一致性哈希 关于一致性哈希的具体内容,可以参考一致性哈希. 容错 由于一致性哈希的使用,Dynamo集群中的节点在逻辑上可以认为是一个圆环.假设有M个节点,我们从某个节点开始顺时针地依次为每个节点标号为1.2.

判断json数据是否为空

json数据是没有length这个属性的 ,所以不能直接用.length()方法 我们可以先遍历,然后根据遍历次数求长度 1.在IE上这样遍历json:(js代码) var jsonLength = 0; JSON形如:json = ["数据1","数据2"];$.each(json,function(index,record){alert(record); jsonLength++;}); 2.在火狐上这样遍历: for(var json in JSON){ al

C语言判断系统数据大/小端存储方式

小端存储:数据的低位部分,存储于存储器的低地址空间里. 大端存储:数据的低位部分,存储于存储器的高地址空间里. 首先,一般PC数据存储方式是小端存储. 基本实现思想是:将存储器中所存的数据按字节以地址顺序输出,与存入数据的高低位进行比较,即得出结论. 实现方法一: 1 #include <stdio.h> 2 int main(void) 3 { 4 short int x; 5 char *arr; 6 7 x = 0x1122; 8 arr = (char *)&x; 9 10 i

Apache Spark-1.0.0浅析(十):数据存储——读写操作

“RDD是由不同的partition组成的,transformation和action是在partition上面进行的:而在storage模块内部,RDD又被视为由不同的block组成,对于RDD的存取是以block为单位进行的,本质上partition和block是等价的,只是看待的角度不同.在Spark storage模块中中存取数据的最小单位是block,所有的操作都是以block为单位进行的.” BlockManager中定义了三种主要的存储类型(tackyonStore暂且不做分析)

解决并发保证数据一致性、幂等性方案

解决高并发.保证数据一致性.幂等性的方案 基本思路:在每次请求服务之前,先必须调用"令牌服务",获得一个唯一的令牌,然后再带上令牌ID这个参数去调用相关的服务.由于这个令牌ID是唯一的,所以,这样可以有效的防止同一个业务多次执行. 具体步骤如下: step1.首先在数据库中创建一个存放令牌相关信息的表open_ticket: step2.定义调用令牌服务的参数:至少包括 操作用户.业务编号.业务场景类型: step3.定义获取"令牌"的服务TicketDTO bui

MOOC(7)- case依赖、读取json配置文件进行多个接口请求-模拟接口响应数据(18)

这里是把传入的请求数据作为响应值返回 # -*- coding: utf-8 -*- # @Time : 2020/2/15 9:47 # @File : do_mock_18.py # @Author: Hero Liu # 接口不可用,模拟返回响应数据 import mock def mock_test(mock_method, url, method, request_data, response_data, header=None): mock_method = mock.Mock(re

分布式系统中的一致性协议

前言 在分布式系统设计的过程中,我们需要考虑cap理论的指导思想,如下图所示,P分区容错性,考虑到分布式系统部署在多个结点上,因此分区容错性是分布式系统的最基本要具备的.因此我们只能在一致性和可用性之间作权衡.于是就出现了很多一致性协议.著名的协议有二阶段提交协议,三阶段提交协议和Paxos算法.本文主要介绍二阶段提交协议和三阶段提交协议的理论基础. 基本概念 ①二阶段提交. 2pc,是two-phase-commit的缩写,即二阶段提交.二阶段分为提交事务请求.执行事务提交. ②三阶段提交 3

分布式系统常见的问题和解决办法

https://blog.csdn.net/Be_Pretty_Better/article/details/82732908 1.分布式session问题:因为在分布式系统中,服务器集群,同一服务通常会放在几台不同的服务器中,当浏览器第一次发来请求或原session已经失效时,会在服务器端创建session,并将sessionId放在响应头中返回浏览器保存在cookie.当浏览器第二次访问时,会带着sessionId在服务器中查找session,虽然两次访问的网址相同,但是请求可能打到两个不同

判断一个数据是否存在于一个表中,Oracle中写自定义函数

create or replace function isExist(data in DataTypes) --DataTypes 为表中该数据的类型return Numberisv_flag number(2);v_data [DataTypes]; --表中数据的类型beginselect data into v_data from table_name where ....;if v_data not null then v_falg := 1;else v_flag :=0;end if