收藏 分销(赏)

NoSQL数据库笔谈.doc

上传人:天**** 文档编号:2253703 上传时间:2024-05-24 格式:DOC 页数:66 大小:2.74MB
下载 相关 举报
NoSQL数据库笔谈.doc_第1页
第1页 / 共66页
NoSQL数据库笔谈.doc_第2页
第2页 / 共66页
NoSQL数据库笔谈.doc_第3页
第3页 / 共66页
NoSQL数据库笔谈.doc_第4页
第4页 / 共66页
NoSQL数据库笔谈.doc_第5页
第5页 / 共66页
点击查看更多>>
资源描述

1、(word完整版)NoSQL数据库笔谈NoSQL数据库笔谈颜开v0。22010.21. 序2. 思想篇1. CAP2. 最终一致性1. 变体3. BASE4. 其他1. I/O的五分钟法则2. 不要删除数据3. RAM是硬盘,硬盘是磁带4. Amdahl定律和Gustafson定律5. 万兆以太网3. 手段篇1. 一致性哈希1. 亚马逊的现状2. 算法的选择2. Quorum NRW3. Vector clock4. Virtual node5. gossip1. Gossip (State Transfer Model)2. Gossip (Operation Transfer Model)

2、6. Merkle tree7. Paxos1. 背景8. DHT9. Map Reduce Execution10. Handling Deletes11. 存储实现12. 节点变化13. 列存1. 描述2. 特点4. 软件篇1. 亚数据库1. MemCached1. 特点2. 内存分配3. 缓存策略4. 缓存数据库查询5. 数据冗余与故障预防6. Memcached客户端(mc)7. 缓存式的Web应用程序架构8. 性能测试2. dbcached1. Memcached 和 dbcached 在功能上一样吗?2. 列存系列1. Hadoop之Hbase2. 耶鲁大学之HadoopDB3.

3、GreenPlum4. FaceBook之Cassandra1. Cassandra特点2. Keyspace3. Column family(CF)4. Key5. Column6. Super column7. Sorting8. 存储9. API5. Google之BigTable6. Yahoo之PNUTS1. 特点2. PNUTS实现1. Record-level mastering 记录级别主节点2. PNUTS的结构3. Tablets寻址与切分4. Write调用示意图3. PNUTS感悟7. 微软之SQL数据服务3. 非云服务竞争者4. 文档存储1. CouchDB1. 特性

4、2. Riak3. MongoDB4. Terrastore5. ThruDB5. Key Value / Tuple 存储1. Amazon之SimpleDB2. Chordless3. Redis4. Scalaris5. Tokyo cabinet / Tyrant6. CT。M7. Scalien8. Berkley DB9. MemcacheDB10. Mnesia11. LightCloud12. HamsterDB13. Flare6. 最终一致性Key Value存储1. Amazon之Dynamo1. 功能特色2. 架构特色2. BeansDB1. 简介2. 更新3. 特性4

5、. 性能3. Nuclear1. 两个设计上的Tips4. Voldemort5. Dynomite6. Kai7. 未分类1. Skynet2. Drizzle8. 比较1. 可扩展性2. 数据和查询模型3. 持久化设计5. 应用篇1. eBay 架构经验2. 淘宝架构经验3. Flickr架构经验4. Twitter运维经验1. 运维经验1. Metrics2. 配置管理3. Darkmode4. 进程管理5. 硬件2. 代码协同经验1. Review制度2. 部署管理3. 团队沟通3. Cache5. 云计算架构6. 反模式1. 单点失败(Single Point of Failure)

6、2. 同步调用3. 不具备回滚能力4. 不记录日志5. 无切分的数据库6. 无切分的应用7. 将伸缩性依赖于第三方厂商7. OLAP1. OLAP报表产品最大的难点在哪里?8. NOSQL们背后的共有原则1. 假设失效是必然发生的2. 对数据进行分区3. 保存同一数据的多个副本4. 动态伸缩5. 查询支持6. 使用 Map/Reduce 处理汇聚7. 基于磁盘的和内存中的实现8. 仅仅是炒作?6. 附1. 感谢2. 版本志3. 引用序日前国内没有一套比较完整的NoSQL数据库资料,有很多先驱整理发表了很多,但不是很系统。不材尝试着将各家的资料整合一下,并书写了一些自己的见解。本书写了一些目前的

7、NoSql的一些主要技术,算法和思想。同时列举了大量的现有的数据库实例。读完全篇,相信读者会对NoSQL数据库了解个大概.另外我还准备开发一个开源内存数据库galaxydb.本书也是为这个数据库提供一些架构资料。思想篇CAP,BASE和最终一致性是NoSQL数据库存在的三大基石.而五分钟法则是内存数据存储了理论依据。这个是一切的源头.CAP C:Consistency 一致性 A:Availability 可用性(指的是快速获取数据) P: Tolerance of networkPartition 分区容忍性(分布式)10年前,Eric Brewer教授指出了著名的CAP理论,后来Seth

8、Gilbert 和 Nancy lynch两人证明了CAP理论的正确性。CAP理论告诉我们,一个分布式系统不可能满足一致性,可用性和分区容错性这三个需求,最多只能同时满足两个。熊掌与鱼不可兼得也。关注的是一致性,那么您就需要处理因为系统不可用而导致的写操作失败的情况,而如果您关注的是可用性,那么您应该知道系统的read操作可能不能精确的读取到write操作写入的最新值。因此系统的关注点不同,相应的采用的策略也是不一样的,只有真正的理解了系统的需求,才有可能利用好CAP理论.作为架构师,一般有两个方向来利用CAP理论1. keyvalue存储,如Amaze Dynamo等,可根据CAP三原则灵活

9、选择不同倾向的数据库产品。2. 领域模型 + 分布式缓存 + 存储 (Qi4j和NoSql运动),可根据CAP三原则结合自己项目定制灵活的分布式方案,难度高。我准备提供第三种方案:实现可以配置CAP的数据库,动态调配CAP。 CA:传统关系数据库 AP:key-value数据库而对大型网站,可用性与分区容忍性优先级要高于数据一致性,一般会尽量朝着 A、P 的方向设计,然后通过其它手段保证对于一致性的商务需求。架构设计师不要精力浪费在如何设计能满足三者的完美分布式系统,而是应该进行取舍。不同数据对于一致性的要求是不同的.举例来讲,用户评论对不一致是不敏感的,可以容忍相对较长时间的不一致,这种不一

10、致并不会影响交易和用户体验。而产品价格数据则是非常敏感的,通常不能容忍超过10秒的价格不一致。CAP理论的证明:Brewers CAP Theorem最终一致性一言以蔽之:过程松,结果紧,最终结果必须保持一致性为了更好的描述客户端一致性,我们通过以下的场景来进行,这个场景中包括三个组成部分: 存储系统存储系统可以理解为一个黑盒子,它为我们提供了可用性和持久性的保证。 Process AProcessA主要实现从存储系统write和read操作 Process B 和ProcessCProcessB和C是独立于A,并且B和C也相互独立的,它们同时也实现对存储系统的write和read操作。下面以

11、上面的场景来描述下不同程度的一致性: 强一致性强一致性(即时一致性) 假如A先写入了一个值到存储系统,存储系统保证后续A,B,C的读取操作都将返回最新值 弱一致性假如A先写入了一个值到存储系统,存储系统不能保证后续A,B,C的读取操作能读取到最新值。此种情况下有一个“不一致性窗口”的概念,它特指从A写入值,到后续操作A,B,C读取到最新值这一段时间. 最终一致性最终一致性是弱一致性的一种特例.假如A首先write了一个值到存储系统,存储系统保证如果在A,B,C后续读取之前没有其它写操作更新同样的值的话,最终所有的读取操作都会读取到最A写入的最新值。此种情况下,如果没有失败发生的话,“不一致性窗

12、口”的大小依赖于以下的几个因素:交互延迟,系统的负载,以及复制技术中replica的个数(这个可以理解为master/salve模式中,salve的个数),最终一致性方面最出名的系统可以说是DNS系统,当更新一个域名的IP以后,根据配置策略以及缓存控制策略的不同,最终所有的客户都会看到最新的值。变体 Causal consistency(因果一致性)如果Process A通知Process B它已经更新了数据,那么Process B的后续读取操作则读取A写入的最新值,而与A没有因果关系的C则可以最终一致性. Read-your-writes consistency如果Process A写入了最

13、新的值,那么Process A的后续操作都会读取到最新值。但是其它用户可能要过一会才可以看到。 Session consistency此种一致性要求客户端和存储系统交互的整个会话阶段保证Readyour-writes consistency。Hibernate的session提供的一致性保证就属于此种一致性. Monotonic read consistency此种一致性要求如果Process A已经读取了对象的某个值,那么后续操作将不会读取到更早的值。 Monotonic write consistency此种一致性保证系统会序列化执行一个Process中的所有写操作。BASE说起来很有趣,

14、BASE的英文意义是碱,而ACID是酸.真的是水火不容啊。 Basically Availble -基本可用 Softstate -软状态/柔性事务”Soft state” 可以理解为无连接的, 而 Hard state” 是面向连接的 Eventual Consistency 最终一致性最终一致性, 也是是 ACID 的最终目的。BASE模型反ACID模型,完全不同ACID模型,牺牲高一致性,获得可用性或可靠性: Basically Available基本可用。支持分区失败(e.g. sharding碎片划分数据库) Soft state软状态 状态可以有一段时间不同步,异步。 Eventu

15、ally consistent最终一致,最终数据是一致的就可以了,而不是时时一致。BASE思想的主要实现有1.按功能划分数据库2.sharding碎片BASE思想主要强调基本的可用性,如果你需要高可用性,也就是纯粹的高性能,那么就要以一致性或容错性为牺牲,BASE思想的方案在性能上还是有潜力可挖的。其他I/O的五分钟法则在 1987 年,Jim Gray与 Gianfranco Putzolu 发表了这个”五分钟法则的观点,简而言之,如果一条记录频繁被访问,就应该放到内存里,否则的话就应该待在硬盘上按需要再访问.这个临界点就是五分钟。 看上去像一条经验性的法则,实际上五分钟的评估标准是根据投入

16、成本判断的,根据当时的硬件发展水准,在内存中保持 1KB 的数据成本相当于硬盘中存据 400 秒的开销(接近五分钟)。这个法则在 1997 年左右的时候进行过一次回顾,证实了五分钟法则依然有效(硬盘、内存实际上没有质的飞跃),而这次的回顾则是针对 SSD 这个”新的旧硬件”可能带来的影响。随着闪存时代的来临,五分钟法则一分为二:是把 SSD 当成较慢的内存(extended buffer pool )使用还是当成较快的硬盘(extended disk)使用。小内存页在内存和闪存之间的移动对比大内存页在闪存和磁盘之间的移动。在这个法则首次提出的 20 年之后,在闪存时代,5 分钟法则依然有效,只

17、不过适合更大的内存页(适合 64KB 的页,这个页大小的变化恰恰体现了计算机硬件工艺的发展,以及带宽、延时).不要删除数据Oren Eini(又名Ayende Rahien)建议开发者尽量避免数据库的软删除操作,读者可能因此认为硬删除是合理的选择。作为对Ayende文章的回应,Udi Dahan强烈建议完全避免数据删除.所谓软删除主张在表中增加一个IsDeleted列以保持数据完整.如果某一行设置了IsDeleted标志列,那么这一行就被认为是已删除的.Ayende觉得这种方法“简单、容易理解、容易实现、容易沟通”,但“往往是错的。问题在于:删除一行或一个实体几乎总不是简单的事件。它不仅影响模

18、型中的数据,还会影响模型的外观.所以我们才要有外键去确保不会出现“订单行”没有对应的父“订单”的情况。而这个例子只能算是最简单的情况。当采用软删除的时候,不管我们是否情愿,都很容易出现数据受损,比如谁都不在意的一个小调整,就可能使“客户”的“最新订单”指向一条已经软删除的订单。如果开发者接到的要求就是从数据库中删除数据,要是不建议用软删除,那就只能硬删除了。为了保证数据一致性,开发者除了删除直接有关的数据行,还应该级联地删除相关数据。可Udi Dahan提醒读者注意,真实的世界并不是级联的:假设市场部决定从商品目录中删除一样商品,那是不是说所有包含了该商品的旧订单都要一并消失?再级联下去,这些

19、订单对应的所有发票是不是也该删除?这么一步步删下去,我们公司的损益报表是不是应该重做了?没天理了。问题似乎出在对“删除”这词的解读上。Dahan给出了这样的例子:我说的“删除”其实是指这产品“停售”了。我们以后不再卖这种产品,清掉库存以后不再进货。以后顾客搜索商品或者翻阅目录的时候不会再看见这种商品,但管仓库的人暂时还得继续管理它们。“删除”是个贪方便的说法。他接着举了一些站在用户角度的正确解读:订单不是被删除的,是被“取消”的。订单取消得太晚,还会产生花费。员工不是被删除的,是被“解雇的(也可能是退休了)。还有相应的补偿金要处理。职位不是被删除的,是被“填补”的(或者招聘申请被撤回)。在上面

20、这些例子中,我们的着眼点应该放在用户希望完成的任务上,而非发生在某个实体身上的技术动作。几乎在所有的情况下,需要考虑的实体总不止一个。为了代替IsDeleted标志,Dahan建议用一个代表相关数据状态的字段:有效、停用、取消、弃置等等.用户可以借助这样一个状态字段回顾过去的数据,作为决策的依据。删除数据除了破坏数据一致性,还有其它负面的后果。Dahan建议把所有数据都留在数据库里:“别删除。就是别删除。”RAM是硬盘,硬盘是磁带Jim Gray在过去40年中对技术发展有过巨大的贡献,“内存是新的硬盘,硬盘是新的磁带”是他的名言.“实时”Web应用不断涌现,达到海量规模的系统越来越多,这种后浪

21、推前浪的发展模式对软硬件又有何影响?Tim Bray早在网格计算成为热门话题之前,就讨论过以RAM和网络为中心的硬件结构的优势,可以用这种硬件建立比磁盘集群速度更快的RAM集群。对于数据的随机访问,内存的速度比硬盘高几个数量级(即使是最高端的磁盘存储系统也只是勉强达到1,000次寻道/秒)。其次, 随着数据中心的网络速度提高,访问内存的成本更进一步降低。通过网络访问另一台机器的内存比访问磁盘成本更低.就在我写下这段话的时候,Sun的 Infiniband产品线中有一款具备9个全互联非阻塞端口交换机,每个端口的速度可以达到30Gbit/sec!Voltaire产品的端口甚至更多;简直不敢想象。(

22、如果你想了解这类超高性能网络的最新进展,请关注Andreas Bechtolsheim在Standford开设的课程.)各种操作的时间,以2001年夏季,典型配置的 1GHz 个人计算机为标准:执行单一指令1 纳秒从L1 高速缓存取一个字2 纳秒从内存取一个字10 纳秒从磁盘取连续存放的一个字200 纳秒磁盘寻址并取字8 毫秒以太网2GB/sTim还指出Jim Gray的名言中后半句所阐述的真理:“对于随机访问,硬盘慢得不可忍受;但如果你把硬盘当成磁带来用,它吞吐连续数据的速率令人震惊;它天生适合用来给以RAM为主的应用做日志(logging and journaling).”时间闪到几年之后

23、的今天,我们发现硬件的发展趋势在RAM和网络领域势头不减,而在硬盘领域则止步不前.Bill McColl提到用于并行计算的海量内存系统已经出现:内存是新的硬盘!硬盘速度提高缓慢,内存芯片容量指数上升,inmemory软件架构有望给各类数据密集的应用带来数量级的性能提升.小型机架服务器(1U、2U)很快就会具备T字节、甚至更大量的内存,这将会改变服务器架构中内存和硬盘之间的平衡.硬盘将成为新的磁带,像磁带一样作为顺序存储介质使用(硬盘的顺序访问相当快速),而不再是随机存储介质(非常慢)。这里面有着大量的机会,新产品的性能有望提高10倍、100倍.Dare Obsanjo指出如果不把这句真言当回事

24、,会带来什么样的恶劣后果 也就是Twitter正面临的麻烦.论及Twitter的内容管理,Obsanjo说,“如果一个设计只是简单地反映了问题描述,你去实现它就会落入磁盘 I/O的地狱。不管你用Ruby on Rails、Cobol on Cogs、C+还是手写汇编都一样,读写负载照样会害死你。”换言之,应该把随机操作推给RAM,只给硬盘留下顺序操作.Tom White是Hadoop Core项目的提交者,也是Hadoop项目管理委员会的成员。他对Gray的真言中“硬盘是新的磁带”部分作了更深入地探讨.White在讨论MapReduce编程模型的时候指出,为何对于Hadloop这类工具来说,硬

25、盘仍然是可行的应用程序数据存储介质:本质上,在MapReduce的工作方式中,数据流式地读出和写入硬盘,MapReduce是以硬盘的传输速率不断地对这些数据进行排序和合并. 与之相比,访问关系数据库中的数据,其速率则是硬盘的寻道速率(寻道指移动磁头到盘面上的指定位置读取或写入数据的过程)。为什么要强调这一点?请看看寻道时间和磁盘传输率的发展曲线。寻道时间每年大约提高5%,而数据传输率每年大约提高20%。寻道时间的进步比数据传输率慢因此采用由数据传输率决定性能的模型是有利的.MapReduce正是如此。虽然固态硬盘(SSD)能否改变寻道时间/传输率的对比还有待观察,White文章的跟贴中,很多人

26、都认为SSD会成为RAM/硬盘之争中的平衡因素。Nati Shalom对内存和硬盘在数据库部署和使用中的角色作了一番有理有据的评述。 Shalom着重指出用数据库集群和分区来解决性能和可伸缩性的局限。他说,“数据库复制和数据库分区都存在相同的基本问题,它们都依赖于文件系统/硬盘 的性能,建立数据库集群也非常复杂”。他提议的方案是转向InMemory Data Grid(IMDG),用Hibernate二级缓存或者GigaSpaces Spring DAO之类的技术作支撑,将持久化作为服务(Persistence as a Service)提供给应用程序.Shalom解释说,IMDG提供在内存中

27、的基于对象的数据库能力,支持核心的数据库功能,诸如高级索引和查询、事务语义和锁。IMDG还从应用程序的代码中抽象出了数据的拓扑。通过这样的方式,数据库不会完全消失,只是挪到了“正确的位置。IMDG相比直接RDBMS访问的优势列举如下: 位于内存中,速度和并发能力都比文件系统优越得多 数据可通过引用访问 直接对内存中的对象执行数据操作 减少数据的争用 并行的聚合查询 进程内(Inprocess)的局部缓存 免除了对象关系映射(ORM)你是否需要改变对应用和硬件的思维方式,最终取决于你要用它们完成的工作。但似乎公论认为,开发者解决性能和可伸缩性的思路已经到了该变一变的时候。Amdahl定律和Gus

28、tafson定律这里,我们都以S(n)表示n核系统对具体程序的加速比,K表示串行部分计算时间比例.Amdahl 定律的加速比:S(n) 使用1个处理器的串行计算时间 / 使用n个处理器的并行计算时间S(n) = 1/(K+(1K)/n) = n/(1+(n-1)K)Gustafson定律的加速比:S(n) 使用n个处理器的并行计算量 / 使用1个处理器的串行计算量S(n) = K+(1-K)n有点冷是不是?通俗的讲,Amdahl 定律将工作量看作1,有n核也只能分担1K的工作量;而Gustafson定律则将单核工作量看作1,有n核,就可以增加n(1K)的工作量。这里没有考虑引进分布式带来的开销

29、,比如网络和加锁。成本还是要仔细核算的,不是越分布越好.控制算法的复杂性在常数范围之内。万兆以太网手段篇一致性哈希要求分布式架构的发展说起.第一阶段考虑到单服务器不能承载,因此使用了分布式架构,最初的算法为 hash() mod n, hash()通常取用户ID,n为节点数。此方法容易实现且能够满足运营要求。缺点是当单点发生故障时,系统无法自动恢复.第二阶段为了解决单点故障,使用 hash() mod (n/2), 这样任意一个用户都有2个服务器备选,可由client随机选取。由于不同服务器之间的用户需要彼此交互,所以所有的服务器需要确切的知道用户所在的位置。因此用户位置被保存到memcach

30、ed中。当一台发生故障,client可以自动切换到对应backup,由于切换前另外1台没有用户的session,因此需要client自行重新登录.这个阶段的设计存在以下问题负载不均衡,尤其是单台发生故障后剩下一台会压力过大。不能动态增删节点节点发生故障时需要client重新登录第三阶段打算去掉硬编码的hash() mod n 算法,改用一致性哈希(consistent hashing)分布假如采用Dynamo中的strategy 1我们把每台server分成v个虚拟节点,再把所有虚拟节点(nv)随机分配到一致性哈希的圆环上,这样所有的用户从自己圆环上的位置顺时针往下取到第一个vnode就是自己

31、所属节点.当此节点存在故障时,再顺时针取下一个作为替代节点。优点:发生单点故障时负载会均衡分散到其他所有节点,程序实现也比较优雅。亚马逊的现状aw2。0公司的Alan Williamson撰写了一篇报道,主要是关于他在Amazon EC2上的体验的,他抱怨说,Amazon是公司唯一使用的云提供商,看起来它在开始时能够适应得很好,但是有一个临界点:在开始的日子里Amazon的表现非常棒。实例在几分钟内启动,几乎没有遇到任何问题,即便是他们的小实例(SMALL INSTANCE)也很健壮,足以支持适当使用的MySQL数据库。在20个月内,Amazon云系统一切运转良好,不需要任何的关心和抱怨。然而

32、,在最后的八个月左右,他们“盔甲”内的漏洞开始呈现出来了。第一个弱点前兆是,新加入的Amazon SMALL实例的性能出现了问题。根据我们的监控,在服务器场中新添加的机器,与原先的那些相比性能有所下降。开始我们认为这是自然出现的怪现象,只是碰 巧发生在“吵闹的邻居(Noisy Neighbors)旁边。根据随机法则,一次快速的停机和重新启动经常就会让我们回到“安静的邻居”旁边,那样我们可以达到目的。 然而,在最后的一两个月中,我们发现,甚至是这些“使用高级CPU的中等实例”也遭受了与小实例相同的命运,其中,新的实例不管处于什么位置,看起来似乎都表现得一样。经过调查,我们还发现了一个新问题,它已

33、经悄悄渗透到到Amazon的世界中,那就是内部网络延迟。算法的选择不同的哈希算法可以导致数据分布的不同位置,如果十分均匀,那么一次MapReduce就涉及节点较多,但热点均匀,方便管理。反之,热点不均,会大致机器效率发挥不完全。Quorum NRW N: 复制的节点数量 R: 成功读操作的最小节点数 W: 成功写操作的最小节点数只需W + R N,就可以保证强一致性。第一个关键参数是 N,这个 N 指的是数据对象将被复制到 N 台主机上,N 在实例级别配置,协调器将负责把数据复制到 N1 个节点上。N 的典型值设置为 3。复 制中的一致性,采用类似于 Quorum 系统的一致性协议实现。这个协

34、议有两个关键值:R 与 W。R 代表一次成功的读取操作中最小参与节点数量,W 代表一次成功的写操作中最小参与节点数量。R + WN ,则会产生类似 quorum 的效果。该模型中的读(写)延迟由最慢的 R(W)复制决定,为得到比较小的延迟,R 和 W 有的时候的和又设置比 N 小。如果N中的1台发生故障,Dynamo立即写入到preference list中下一台,确保永远可写入如 果W+RN,那么分布式系统就会提供强一致性的保证,因为读取数据的节点和被同步写入的节点是有重叠的。在一个RDBMS的复制模型中 (Master/salve),假如N=2,那么W=2,R=1此时是一种强一致性,但是这

35、样造成的问题就是可用性的减低,因为要想写操作成功,必须要等 2个节点都完成以后才可以。在分布式系统中,一般都要有容错性,因此一般N都是大于3的,此时根据CAP理论,一致性,可用性和分区容错 性最多只能满足两个,那么我们就需要在一致性和分区容错性之间做一平衡,如果要高的一致性,那么就配置N=W,R=1,这个时候可用性就会大大降低。如果 想要高的可用性,那么此时就需要放松一致性的要求,此时可以配置W=1,这样使得写操作延迟最低,同时通过异步的机制更新剩余的NW个节点。当存储系统保证最终一致性时,存储系统的配置一般是W+R=N,此时读取和写入操作是不重叠的,不一致性的窗口就依赖于存储系统的异步实现方

36、式,不一致性的窗口大小也就等于从更新开始到所有的节点都异步更新完成之间的时间.(N,R,W) 的值典型设置为 (3, 2 ,2),兼顾性能与可用性。R 和 W 直接影响性能、扩展性、一致性,如果 W 设置 为 1,则一个实例中只要有一个节点可用,也不会影响写操作,如果 R 设置为 1 ,只要有一个节点可用,也不会影响读请求,R 和 W 值过小则影响一致性,过大也不好,这两个值要平衡。对于这套系统的典型的 SLA 要求 99.9% 的读写操作在 300ms 内完成。无 论是Read-yourwritesconsistency,Session consistency,Monotonic read

37、consistency,它们都通过黏贴(stickiness)客户端到执行分布式请求的服务器端来实现的,这种方式简单是简单,但是它使得负载均衡以 及分区容错变的更加难于管理,有时候也可以通过客户端来实现Readyour-writesconsistency和Monotonic read consistency,此时需要对写的操作的数据加版本号,这样客户端就可以遗弃版本号小于最近看到的版本号的数据。在系统开发过程 中,根据CAP理论,可用性和一致性在一个大型分区容错的系统中只能满足一个,因此为了高可用性,我们必须放低一致性的要求,但是不同的系统保证的一致性 还是有差别的,这就要求开发者要清楚自己用

38、的系统提供什么样子的最终一致性的保证,一个非常流行的例子就是web应用系统,在大多数的web应用系统中都 有“用户可感知一致性”的概念,这也就是说最终一致性中的“一致性窗口”大小要小于用户下一次的请求,在下次读取操作来之前,数据可以在存储的各个节点之 间复制.还比如假如存储系统提供了readyourwriteconsistency一致性,那么当一个用户写操作完成以后可以立马看到自己的更 新,但是其它的用户要过一会才可以看到更新.几种特殊情况:W = 1, R = N,对写操作要求高性能高可用。R = 1, W = N , 对读操作要求高性能高可用,比如类似cache之类业务.W = Q, R

39、= Q where Q = N / 2 + 1 一般应用适用,读写性能之间取得平衡。如N=3,W=2,R=2Vector clockvector clock算法.可以把这个vector clock想象成每个节点都记录自己的版本信息,而一个数据,包含所有这些版本信息。来看一个例子:假设一个写请求,第一次被节点A处理了。节点A会增加一个版本信息(A,1).我们把这个时候的数据记做D1(A,1)。 然后另外一个对同样key(这一段讨论都是针对同样的key的)的请求还是被A处理了于是有D2(A,2)。这个时候,D2是可以覆盖D1的,不会有冲突产生。现在我们假设D2传播到了所有节点(B和C),B和C收到

40、的数据不是从客户产生的,而是别人复制给他们的,所以他们不产生新的版本信息,所以现在B和C都持有数据D2(A,2).好,继续,又一个请求,被B处理了,生成数据D3(A,2;B,1),因为这是一个新版本的数据,被B处理,所以要增加B的版本信息。假设D3没有传播到C的时候又一个请求被C处理记做D4(A,2;C,1)。假设在这些版本没有传播开来以前,有一个读取操作,我们要记得,我们的W=1 那么R=N=3,所以R会从所有三个节点上读,在这个例子中将读到三个版本。A上的D2(A,2);B上的D3(A,2;B,1);C上的D4(A,2;C,1)这个时候可以判断出,D2已经是旧版本,可以舍弃,但是D3和D4

41、都是新版本,需要应用自己去合并。如果需要高可写性,就要处理这种合并问题.好假设应用完成了冲入解决,这里就是合并D3和D4版本,然后重新做了写入,假设是B处理这个请求,于是有D5(A,2;B,2;C,1);这个版本将可以覆盖掉D1-D4那四个版本。这个例子只举了一个客户的请求在被不同节点处理时候的情况, 而且每次写更新都是可接受的,大家可以自己更深入的演算一下几个并发客户的情况,以及用一个旧版本做更新的情况.上面问题看似好像可以通过在三个节点里选择一个主节点来解决,所有的读取和写入都从主节点来进行。但是这样就违背了W=1这个约定,实际上还是退化到W=N的情况了。所以如果系统不需要很大的弹性,W=

42、N为所有应用都接受,那么系统的设计上可以得到很大的简化.Dynamo 为了给出充分的弹性而被设计成完全的对等集群(peer to peer),网络中的任何一个节点都不是特殊的.Virtual node虚拟节点,未完成gossipGossip协议是一个Gossip思想的P2P实现.现代的分布式系统经常使用这个协议,他往往是唯一的手段.因为底层的结构非常复杂,而且Gossip也很有效。Gossip协议也被戏称为病毒式传播,因为他的行为生物界的病毒很相似。Gossip (State Transfer Model)在状态转移到模式下,每个重复节点都保持的一个Vector clock和一个state v

43、ersion tree.每个节点的状态都是相同的(based on vector clock comparison),换句话说,state version tree包含有全部的冲突updates。At query time, the client will attach its vector clock and the replica will send back a subset of the state tree which precedes the clients vector clock (this will provide monotonic read consistency)。 T

44、he client will then advance its vector clock by merging all the versions。 This means the client is responsible to resolve the conflict of all these versions because when the client sends the update later, its vector clock will precede all these versions.At update, the client will send its vector clo

45、ck and the replica will check whether the client state precedes any of its existing version, if so, it will throw away the clients update。Replicas also gossip among each other in the background and try to merge their version tree together.Gossip (Operation Transfer Model)In an operation transfer app

46、roach, the sequence of applying the operations is very important。 At the minimum causal order need to be maintained. Because of the ordering issue, each replica has to defer executing the operation until all the preceding operations has been executed。 Therefore replicas save the operation request to a log file and exchange the log among each other and consolidate these operation logs to figure out the right sequence to apply the operations to their local store in an appropriate order。”Causal order”

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 通信科技 > 数据库/数据算法

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服