Dynamo: Amazon’s Highly Available Key-value Store

2023-10-31 00:18

本文主要是介绍Dynamo: Amazon’s Highly Available Key-value Store,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

参考:http://www.allthingsdistributed.com/2007/10/amazons_dynamo.html

 

所谓key-value存储系统就是,系统提供两个提口,一是put,一是get,put的时候,传进key与value,就可以把数据写到系统里,get的时候,传进key,就可以获得相应的value。

key-value存储系统可以认为是从传统的关系数据库系统演化而成。传统的关系数据库在WEB应用中,存在性能、可扩展性、容灾等方面的问题,而观察发现,WEB应用中,大部分情况下不需要作关系查询,可以只支持key-value查询,以提高性能,可扩展性等

简 单来说,只需要维护一个HASH表或者B树一类的索引结构,然后把value存在硬盘上,就是一个简单的key-value存储系统了。但是如果数据量大 了,单机就存不下来了,或者能存下来,但是查询速度会比较慢,这时候就需要分多台机器储存了。这时候就进化成一个分布式的key-value存储系统了。 我想国内很多公司山寨的KEY-VALUE存储系统就只做到这一步。

一般的做法是对key取模,然后分到相应的机器上。但是这样新增机器或者减少机器的时候会很麻烦,所以Dynamo用的是consistent hash(http://hi.baidu.com/rodimus/blog/item/6f23a9c4512b2dc638db4928.html ),用的时候,是把一台机器映射成多个节点,一方面是使数据分布更均匀,另一方面性能好的机器映射成更多的节点,从而充分利用机器性能

至 此数据已经可以存下来了,但是如果有机器坏了怎么办?需要作备份,一般认为两个备份不够,需要三个备份。最简单的备份方式是有几台完全相同的机器互为备 分,但是这样修改备份数的话,会比较麻烦。可能还有别的考虑吧,Dynamo的做法是,一台机器是部分数据的首选,同时是多台机器的备分。

作 备份容易,难的是作了备份之后,每次作写操作都需要写多台机器,性能下降了,极端情况下,有一台坏了,就是写不成功。所以写的时候,可以在部分机器写成功 后就返回,剩下的后台再继续写。这样写简单了,读就麻烦了。读的时候如果只读一台机器,可能会读到旧的数据,如果读多台机器,可能会读到不同的数据,一般 情况下,如果有N个备份,写W台,读R台,保证W+R>N,则至少可以读到一份新的数据。读到的R份数据可能会不同,Vector clocks(http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.142.3682&rep=rep1&type=pdf )理清各个版本的关系,具体的merge逻辑,由上层应用决定(在并发写的情况下,可能会有两份并行的数据,底层很难知道应该保留哪个),把merge后的数据,再回写到存储系统里。

作为长期运行的系统,迟早会有机器出故障的。系统小的时候,故障的频率低,可以手工修复。系统大了,就不行了。故障要分两种,一种是临时性的,一种是永久性的。

对 于临时性错误,每个key对于所有的机器有个优先级考虑,之前是选前N个来存储,现在改为前N个健康的机器存储,当A机器故障,而被迫把A的数据写往D的 时候,数据里带一个信息告诉D,这部分数据是属于A的,D会把这部分数据与原来属于它的数据分开存储,然后在A恢复后(需要周期性地探测),再把数据拷回 去。在A已经恢复,正在把数据拷回去的时候,读写会比较复杂。

有一种情况是,D也出问题了或者别的情况,反正现在没办法把D帮A存的数据搬到A上面去了。这种情况下,A复活后,需要从别备份机上拷贴贝数据。为了减少数量拷贝量,采用hash tree(http://hi.baidu.com/rodimus/blog/item/5787a5c84983691d7f3e6f3a.html )。hass tree可以使得同步的数据很少,但是维护的代价比较大。

至此系统已经可以运行了。但是随着数据的数据的变化,可能会增加或者移除机器,consisten hash可以保证冲击会很小,系统会自动地进行数据的迁移。

 

一般的所谓分布式系统,都会有一个中控机。但是Dynamo是没有的,这是一个P2P的系统,所有的机器之间用gossip-based protocol通信

这篇关于Dynamo: Amazon’s Highly Available Key-value Store的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/311503

相关文章

深入理解Redis大key的危害及解决方案

《深入理解Redis大key的危害及解决方案》本文主要介绍了深入理解Redis大key的危害及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、背景二、什么是大key三、大key评价标准四、大key 产生的原因与场景五、大key影响与危

python 字典d[k]中key不存在的解决方案

《python字典d[k]中key不存在的解决方案》本文主要介绍了在Python中处理字典键不存在时获取默认值的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录defaultdict:处理找不到的键的一个选择特殊方法__missing__有时候为了方便起见,

git ssh key相关

step1、进入.ssh文件夹   (windows下 下载git客户端)   cd ~/.ssh(windows mkdir ~/.ssh) step2、配置name和email git config --global user.name "你的名称"git config --global user.email "你的邮箱" step3、生成key ssh-keygen

DBeaver 连接 MySQL 报错 Public Key Retrieval is not allowed

DBeaver 连接 MySQL 报错 Public Key Retrieval is not allowed 文章目录 DBeaver 连接 MySQL 报错 Public Key Retrieval is not allowed问题解决办法 问题 使用 DBeaver 连接 MySQL 数据库的时候, 一直报错下面的错误 Public Key Retrieval is

App Store最低版本要求汇总

1,自此日期起: 2024 年 4 月 29 日 自 2024 年 4 月 29 日起,上传到 App Store Connect 的 App 必须是使用 Xcode 15 为 iOS 17、iPadOS 17、Apple tvOS 17 或 watchOS 10 构建的 App。将 iOS App 提交至 App Store - Apple Developer 2,最低XCode版本 Xcod

MongoDB学习—(1)安装时出现The default storage engine 'wiredTiger' is not available问题解决

MongoDB是NoSql类型的一种基于分布式文件存储的数据库,其存储方式与关系型数据库不同。其详细解释可见于[百科]。安装文件可从官网下载,官网:http://mongodb.org 我将下载的解压文件放到D盘的mongodb文件夹下,

ExtMvc store不能通过xtype选择器得到的办法

store 不能通过xtype选择器得到,  init : function() {         this.control({                 'smsmenu gridpanel[name='company'] : {                                         render:function(grid,opts){

为 Key-Value 数据库实现MVCC 事务

ACID是软件领域使用最广泛的技术之一,它是关系数据库的基石,是企业级中间件不可或缺的部分,但通常通过黑盒的方式提供。但是在许多情况下,这种古老的事务方式已经不能够适应现代大规模系统和NoSQL数据库的需要了,现代系统要求更高的性能要求,更大的数据量,更高的可用性。在这种情况下,传统的事务模型被定制的事务或者半事务模型所取代,而在这些模型中事务性并不像以往那样被看重。   在本文中我们会讨论一

兔子-(PHP 5.3 and above) Please set 'request_order' ini value to include C,G and P (recommended: 'CGP'

由于在PHP最新的版本中增加了一个配置项目“request_order”,默认值为“GP”,这个存在一定的安全风险。这里我们建议用户将配置更改为“CGP” 可以在php的安装目录下找到php.ini配置目录,找到下面选项: request_order = "GP"  更改为 request_order = "CGP"   重启服务器后即可。 此

MySql 1264 - Out of range value for column 异常

前段时间操作数据库,本是一个很简单的修改语句,却报了  1264 - Out of range value for column字段类型官网  当时一看懵逼了,网上很多都说是配置的问题,需要修改my.ini文件,这个方式我没有试过,我想肯定还有其它方法,经过慢慢排 查发现表里的字段为 decimal(10,3) ,这说明小数点前只有7位,保留了3位小数点,而值在小数点前却有8位,这就导致了错误