大型互联网技术架构3-分布式存储-I

我们继续互联网技术架构-分布式存储。

总目录:

  • 分布式存储概述
  • 分布式存储特性 - 哈希分布/一致性哈希分布
  • 分布式存储协议 - 两阶段与Paxos

1. 概述

分布式存储作为互联网之核心基石,没有分布式海量存储就好比无源之水。分布式系统不是什么新鲜事物,教科书里已经研究了好多年,但是不温不火,直到近年互联网大数据应用的兴起才使得它大规模的应用到工程实践中,其主要特点概括为:规模大+成本低。现在的大型互联网公司少则几百几千个PC服务器,多的达到数百万级别低成本PC服务器集群;

总体来说,分布式存储需要具备以下一些要素:

  • 可扩展:灵活水平扩展到成百上千上万,并且整体性能线性增长。
  • 低成本:构建与低成本PC,兼备自动容错,自动负载均衡等机制。
  • 高性能:秒,毫秒,亚秒级别。
  • 易用:构建生态环境,与其它系统集成,如监控,运维,数据导入。

分布式存储的挑战来源自于其设计的两个技术领域:分布式
+ 存储:

  • 数据分布式:数据如何分布,数据如何跨服务器读写?
  • 一致性:数据如何replication,多个副本之间又如何同步
  • 容错:检测,并迁移故障服务器上的数据
  • 负载均衡:如何“空中加油”,运行中添加,卸载服务器
  • 事务并发:分布式事务,并发控制

分布式存储数据分类:

按照其所处理的数据类型来分的话,大体分为

  • 非结构化数据:如文本,图像,图片,视频,音频等
  • 结构化数据:类似关系型数据库
  • 半结构化数据:介于上面二者之间,如HTML文档,换言之其模式结构于内容混合。

分布式存储系统分类:

有了数据,我们看一下容器如何划分:

  • 分布式文件系统:存储非结构化文件对象;如FB Haystack; GFS, HDFS
  • 分布式键值系统:存储半结构化数据,如Amazon Dynamo, Memcache
  • 分布式表格:存储半结构化数据,如BigTable,HBase, DynamoDB
  • 分布式数据库:存储结构化数据,如MySQL Sharding, Amazon RDS,以及阿里OceanBase.

2. 分布式存储特性

分布式存储包括了数据的分布,复制,一致性,容错等。

一致性:分布式存储系统会将数据冗余备份,称之为replication/copy. 副本是目前分布式存储系统容错的唯一方法。如有3个客户端A,B,C

    • 强一致:如A先写入,系统保证后续A,B,C的读去都返回最新值
    • 弱一致:如A先写入,系统不保证后续A,B,C的读去都返回最新值
    • 最终一致:“最终”只有个时间的延迟,如replication等,如A先写入,同时假设后续无其他更新相同的值,“最终”A,B,C都会读到A写入的最新值

数据分布:分布式存储当然会设计数据如何分布了,同时要考虑自动负载均衡

哈希分布无需多说,类似HashMap的index了,基本思路都是选取某业务相关主键key,然后    hash(key)
% N(服务器数量), 当然如果这里hash函数的散列性比较好的话,数据可以比较均匀的分布到集群。

上面可以么?如果仔细看过HashMap的极客们应该知道,当HashMap的数量超过一定负载后,需要resize, rehash。这有什么问题么?内存处理当然没什么大问题,这可是分布式存储啊,你这么一resize,rehash可不得了,涉及很多数据的迁移,耗时耗力。况且,分布式会动态增加,卸载节点,都不用超过一定数量限制。如何解决?

一致性哈希(Distributed Hash Table, DHT)算法如下,给系统每个节点分配一个随机token,使得这些token构成一个哈希环,存放时,根据hash(key)的值,存放到顺时针第一个大于/等于该值的token所在节点。这样,每次节点的变更只会影响哈希环中相邻的节点,对其他没有影响。

如上图所示,假设哈希空间为0-2^32-1大小:

1>首先求出每个服务器node的hash值(一般情况下对机器的hash计算是采用机器的IP或者机器唯一的别名作为输入值),将其分配到圆环上

2>采用同样算法计算待存储对象的key的hash值,将其分配到这个圆环

3> 开始顺时针查找,并分配到第一个找到的服务器节点

通过上图可以看出对象与机器处于同一哈希空间中,在这样的部署环境中,

hash环是不会变更的,因此,通过算出对象的hash值就能快速的定位到对应的机器中,这样就能找到对象真正的存储位置了。

上文提到,普通hash求余最大问题就是当count也就是机器的数量变化,如添加,删除后,需要rehash,并进行位置调整。我们来看一下一致性哈希如何处理:

如图,灰色的node2被删除,则只需按照瞬时针迁移,object3则会被迁移到

node3中,所以仅仅会影响object3位置,其他对象无需改动。

2.
节点添加

如果我们要在集群中添加一个新的节点node4,通过哈希算法得到key4,并映射到环中。

按照顺时针迁移规则,我们把object2迁移到node4中,其他object保持原位。

另外,稍微提及一下,当一致性哈希算法在服务节点太少时,容易因为节点分部不均匀而造成数据倾斜问题。为了解决这种数据倾斜问题,一致性哈希算法引入了虚拟节点机制,即对每一个服务节点计算多个哈希,每个计算结果位置都放置一个此服务节点,称为虚拟节点。

参考MIT论文:http://dl.acm.org/citation.cfm?id=258660

顺序分布通常做法是将一个大表顺序划分成连续范围,即子表。如经常用来举例的用户表,按照主键分为1-10000,10001-20000,...
80000-90000等。再添加类似B+树索引。其中叶子相当于子表。

分布式复制replication,常见做法类似数据库同步操作日志(commit
log)

容错:容错是分布式存储系统设计的重要目标,当然是自动容错。

  • 故障检测:心跳,通用做法。官方叫法是,Lease(租约)协议,即带有超时时间的一种授权。
  • 故障恢复:迁移,通用做法。但是当Master节点/总控节点出现故障时,为了HA,
    我们就要重新选主了,正所谓国家不可一日无主,当然现代社会,要通过Paxos协议选举,如我们介绍过的ZK.

3.
分布式协议

重要的分布式协议:Paxos选举协议与两阶段提交协议。其中Paxos协议在我们介绍ZK的时候,就有小伙伴提出详细介绍。

两阶段提交协议:Two-phase
Commit, 2PC. 主要用来确保多个节点或者分布式操作的原子性。如果有使用过JTA或者做过大型银行转账系统的应该使用过。

如跨数据库操作:

恰如其名,2PC通常分为两个阶段:

阶段1: 请求阶段Prepare Phase, 协调者通知参与者准备提交或者取消事务;

阶段2: 提交阶段Commit Phase, 协调者将阶段1的结果进行投票表决,当且仅当所有参与者同意提交事务时,协调者才通知所有参与者提交,否则通知所有参与者取消。

如下图所示:

两阶段提交协议是阻塞协议,执行过程中需要加锁,且无法容错,所以... 大多数分布式存储系统都避而远之。同理可证,JTA。

Paxos协议:主要用于解决多个节点之间一致性问题。如主节点出现故障时,其它节点如何协调选主。同时,当做到了多个节点之间的操作日志一致性,就能够在这些节点上来构建高可用服务包括分布式锁,分布式命名,配置服务等。

多数情况下,系统只有一个备点提议者Proposer, 所以它的提议总是会很快被大多数节点接受。

执行步骤:

  1. 批准(accept): Proposer发送accept消息给所有其它节点(acceptor)接受某个提议,acceptor可以选择接受或者拒绝
  2. 确认(acknowledge): 如果超过一半的acceptor接受,则提议生效,proposer发送acknowledge消息通知所有acceptor提议生效

如果系统有多个proposer,则各自分别发起提议,如修改操作或者提议自己选主,如果proposer第一次发起的accept请求没有被acceptor中多数派批准,则需要进行一轮完整的Paxos协议,如下:

1. 准备prepare: Proposer首先选择一个提议序号n给其它acceptor节点发送

prepare消息,Acceptor收到消息后,如果提议序号已经大于它已经回复的所有prepare消息,则acceptor将自己上次接受的提议回复给proposer,并承诺不再回复小于n的提议。

2. 批准accept:Proposer收到了acceptor中多数派队prepare的回复后,就进入批准阶段。如果在之前的prepare阶段acceptor回复了上次接受的提议,则提议值发给acceptor批准。Acceptor在不违背它之前在prepare阶段的承诺前提下接受这个请求。如果超过一半的acceptor接受,提议值生效,Proposer发送acknowledge消息通知所有acceptor。

稍微有点绕,Paxos需要确保2点,正确性,即只有一个提议值会生效;可终止性,即最终会有一个提议值生效。数学语言,有且只有一个。

受限与篇幅以及时间,我们会分2篇来介绍分布式存储系统。下一篇将提及著名Google分布式数据库

“The largest single database on earth”。

公众号:技术极客TechBooster

时间: 2024-12-13 13:56:39

大型互联网技术架构3-分布式存储-I的相关文章

大型互联网技术架构4-分布式存储-II Google

The largest single database on earth - Google Spanner. 我们继续互联网技术架构-分布式存储. 上文大篇幅介绍了一些分布式存储的理论,偏重理论.可别小看这些理论,Google的各个神器都是建立在这些理论之上,甚至整个Apache的大数据3剑客项目都是受惠于这些理论.难怪@Tiger大牛讲Google靠的是一大批世界顶尖数据,物理,计算领域的Ph.D.,这些大神以及他们的Paper是Google为什么是Google的原因,以及Google没有开源

《大型网站技术架构》读书笔记之七:随需应变之网站的可扩展架构

此篇已收录至<大型网站技术架构>读书笔记系列目录贴,点击访问该目录可获取更多内容. 一.可伸缩与可扩展-傻傻分不清楚 上篇笔记我们学习了可伸缩架构,但在实际场合中,包括许多架构师也常常混淆可伸缩和可扩展,用可扩展表示伸缩性.那么在此,跟随作者我们来理清这两个概念,避免我们以后对其傻傻分不清楚. (1)扩展性(Extensibiltiy) 指对现有系统影响最小的情况下,系统功能可持续扩展或提升的能力.我们不禁想到了面向对象中一大原则:开闭原则,对扩展开放,对修改封闭.也就说,当系统新增一个功能时

《大型网站技术架构》读书笔记之六:永无止境之网站的伸缩性架构

此篇已收录至<大型网站技术架构>读书笔记系列目录贴,点击访问该目录可获取更多内容. 首先,所谓网站的伸缩性,指不需要改变网站的软硬件设计,仅仅通过改变部署的服务器数量就可以扩大或者缩小网站的服务处理能力.在整个互联网行业的发展渐进演化中,最重要的技术就是服务器集群,通过不断地向集群中添加服务器来增强整个集群的处理能力. 一.网站架构的伸缩性设计 1.1 不同功能进行物理分离实现伸缩 (1)纵向分离:将业务处理流程上得不同部分分离部署,实现系统的伸缩性: (2)横向分离:将不同的业务模块分离部署

大型网站技术架构的演进

最近我在阅读 2 本关于大型网站架构的书:<大型网站技术架构--核心原理与案例分析>李智慧.<大型网站系统与 Java 中间件实践>曾宪杰. 我期望从这些书中学习到大型网站是如何做架构的,这个过程会遇到什么问题.当看完这 2 本书后,我总结出两个大问题: 1. 网站技术架构为什么会演进?换个说法就是为什么网站会变大? 2. 演进的过程会遇到什么问题?或者说为了演进,会遇到什么问题? 网站技术架构为什么会演进 我个人总结出来我们的技术架构演进的两种驱动力,驱动着我们为什么演进网站的技

《大型网站技术架构核心原理与案例分析》阅读笔记-01

通过阅读该书籍我们能够更加清楚的树立大型网站的的技术发展历程,剖析大型网站技术架构模式,深入的讲述大型互联网架构核心原理,并通过一些典型的技术案例来讲述大型网站开发全景视图,该书籍深入的阐述了各种大型网站面临的各种架构问题及解决方案. 在第一章第一篇大型网站架构演化中了解到与传统企业应用系统相比,大型互联网应用系统具有高并发大流量.高可用性.海量数据.用户分布广泛,网络情况复杂.安全环境恶劣.需求快速变更,发布频繁.渐进式发展等特点:大型网站架构演化发展历程经历了初始阶段的网络架构它的应用程序.

《大型网站技术架构-核心原理与案例分析》之一: 大型网站架构演化

最近刚刚读完李智慧的<大型网站技术架构-核心原理与案例分析>,对每章重点内容作了一些笔记,以便加深印象及日后查阅. 一.大型网站软件系统的特点 高并发,大流量:需要面对高并发用户,大流量访问. 高可用:系统7X24小时不间断服务. 海量数据:需要存储.管理海量数据,需要使用大量服务器. 用户分布广泛,网络情况复杂:许多大型互联网都是为全球用户提供服务的,用户分布范围广,各地网络情况千差万别. 安全环境恶劣:由于互联网的开放性,使得互联网站更容易受到攻击,大型网站几乎每天都会被黑客攻击. 需求快

《大型网站技术架构 -核心原理与安全分析》读书笔记

大型网站架构演化的价值观 网站的价值在于它能为用户提供什么价值,在于网站能做什么,而不在于它是怎么做的,所以在网站还很小的时候去追求网站的架构是舍本逐末,得不偿失的.小型网站最需要做的就是为用户提供好的服务来创造价值,得到用户的认可,活下去,野蛮生长. 网站架构设计误区 一味追求大公司的解决方案 大公司的经验和成功模式固然重要,值得学习借鉴,但如果因此而变得盲从,就失去了坚持自我的勇气,在架构演化的道路上迟早会迷路. 为了技术而技术 网站技术是为业务而存在的,除此毫无意义.在技术选型和架构设计中

大型网站技术架构介绍--squid

一.大型网站技术架构介绍 1.pv高  ip高 并发量 2.大型网站架构重点 1. 高性能:响应时间,TPS,系统性能计数器.缓存,消息队列等. 高可用性High Availability   99.99% 7*24 2.衡量标准:假设环境中一台或者多台服务器宕机,服务是否依然可用.解决关键办法:冗余.资源定位,健康检查.负载均衡,关键服务器冗余:web DB ,及时有效的监控和报警 3.高伸缩性[高可维护性] 是否可以用多台服务器构建集群,是否容易向集群添加新的服务器,新服务是否可提供相同的服

《大型网站技术架构》读书笔记一:大型网站架构演化

一.大型网站系统特点 (1)高并发.大流量:PV量巨大 (2)高可用:7*24小时不间断服务 (3)海量数据:文件数目分分钟xxTB (4)用户分布广泛,网络情况复杂:网络运营商 (5)安全环境恶劣:黑客的攻击 (6)需求快速变更,发布频繁:快速适应市场,满足用户需求 (7)渐进式发展:慢慢地运营出大型网站 二.大型网站架构演化过程 (1)初始阶段网站架构:一台Server就刚需-应用程序.数据库.文件等所有资源都集中在一台Server上,典型案例:基于LAMP架构的PHP网站 (2)应用和数据