Download presentation
Presentation is loading. Please wait.
1
电子工业出版社《云计算(第二版)》配套课件
第2章 Google云计算原理与应用 《云计算(第二版)》购买网址: 当当网: 京东商城: 解放军理工大学 刘鹏 教授主编 华东交通大学 刘鹏 制作
2
《云计算(第二版)》购买网址: 当当网 京东商城 姊妹力作《实战Hadoop》购买网址: 当当网 京东商城 《云计算(第二版)》购买网址:
当当网 京东商城 《云计算(第二版)》购买网址: 当当网: 京东商城: 姊妹力作《实战Hadoop》购买网址: 当当网 京东商城
3
提 纲 Google文件系统GFS 分布式数据处理MapReduce 分布式锁服务Chubby
提 纲 Google文件系统GFS 分布式数据处理MapReduce 分布式锁服务Chubby 分布式结构化数据表Bigtable 分布式存储系统Megastore 大规模分布式系统的监控基础架构Dapper Google应用程序引擎
4
分布式锁服务Chubby Paxos算法 Chubby系统设计 Chubby中的Paxos Chubby文件系统 通信协议
正确性与性能
5
Google设计的提供粗粒度锁服务的一个文件系统,它基于松耦合分布式系统,解决了分布的一致性问题
Chubby Google设计的提供粗粒度锁服务的一个文件系统,它基于松耦合分布式系统,解决了分布的一致性问题 一种建议性的锁而不是强制性的锁;具有更大的灵活性 GFS使用Chubby选取一个GFS主服务器 Bigtable使用Chubby指定一个主服务器并发现、控制与其相关的子表服务器 Chubby还可以作为一个稳定的存储系统存储包括元数据在内的小数据 Google内部还使用Chubby进行名字服务(Name Server)
6
Paxos算法 方案存在什么缺陷? Paxos算法
Leslie Lamport最先提出的一种基于消息传递(Messages Passing)的一致性算法,用于解决分布式系统中的一致性问题 分布式系统一致性问题——就是如何保证系统中初始状态相同的各个节点在执行相同的操作序列时,看到的指令序列是完全一致的,并且最终得到完全一致的结果 一个最简单的方案——在分布式系统中设置一个专门节点,在每次需要进行操作之前,系统的各个部分向它发出请求,告诉该节点接下来系统要做什么。该节点接受第一个到达的请求内容作为接下来的操作,这样就能够保证系统只有一个唯一的操作序列 方案存在什么缺陷?
7
Paxos算法 proposers提出决议(Value,系统接下来执行的指令) acceptors批准决议
learners获取并使用已经通过的决议 缺陷——专门节点失效,整个系统就很可能出现不一致。为了避免这种情况,在系统中必然要设置多个专门节点,由这些节点来共同决定操作序列 Paxos算法
8
Paxos算法 保证数据的一致性 (1)决议只有被proposers提出后才 能批准 (2)每次只批准一个决议
(3)只有决议确定被批准后learners 才能获取这个决议
9
Paxos算法 P1:每个acceptor只接受它得到的第一个决议 P2:一旦某个决议得到通过,之后通过的决议必须和该决议保持一致
P2a和P1是有矛盾的 ! P2a:一旦某个决议v得到通过,之后任何acceptor再批准的决议必须是v 系统约束条件 P2:一旦某个决议得到通过,之后通过的决议必须和该决议保持一致 P1和P2b保证条件(2),彼此之间不存在矛盾。但是P2b很难通过一种技术手段来实现它,因此提出了一个蕴涵P2b的约束P2c P2b:一旦某个决议v得到通过,之后任何proposer再提出的决议必须是v P2c:如果一个编号为n的提案具有值v,那么存在一个“多数派”,要么它们中没有谁批准过编号小于n的任何提案,要么它们进行的最近一次批准具有值v
10
Paxos算法 准备阶段:proposers选择一个提案并将它的编号设为n,然后将它发送给acceptors中的一个“多数派”。Acceptors 收到后,如果提案的编号大于它已经回复的所有消息,则acceptors将自己上次的批准回复给proposers,并不再批准小于n的提案 解决一致性问题算法:为了减少决议发布过程中的消息量,acceptors将这个通过的决议发送给learners 的一个子集,然后由这个子集中的learners 去通知所有其他的learners; 特殊情况:如果两个proposer在这种情况下都转而提出一个编号更大的提案,那么就可能陷入活锁。此时需要选举出一个president,仅允许 president提出提案 决议通过的两个阶段 批准阶段:当proposers接收到acceptors 中的这个“多数派”的回复后,就向回复请求的acceptors发送accept请求,在符合acceptors一方的约束条件下,acceptors收到accept请求后即批准这个请求
11
分布式锁服务Chubby Paxos算法 Chubby系统设计 Chubby中的Paxos Chubby文件系统 通信协议
正确性与性能
12
Chubby系统设计 高可用性和高可靠性;首要目标,在保证这一目标的基础上再考虑系统的吞吐量和存储能力
高扩展性;将数据存储在价格较为低廉的RAM,支持大规模用户访问文件 系统设计目标 支持粗粒度的建议性锁服务;提供这种服务的根本目的是提高系统的性能 服务信息的直接存储;可直接存储包括元数据、系统参数在内的有关服务信息 支持通报机制;客户可以及时地了解到事件发生 支持缓存机制;通过一致性缓存将常用信息保存在客户端,避免了频繁地访问主服务器
13
Chubby系统设计 01 02 03 Chubby中还添加了一些新的功能特性;这种设计主要是考虑到以下几个问题
基于锁的开发接口容易被开发者接受。虽然在分布式系统中锁的使用会有很大的不同,但是和一致性算法相比,锁显然被更多的开发者所熟知 开发者初期很少考虑系统的一致性,但随着开发进行,问题会变得越来越严重。单独的锁服务可以保证原有系统架构不会发生改变,而使用函数库很可能需要对系统架构做出大幅度的改动 系统中很多事件发生是需要告知其他用户和服务器,使用一个基于文件系统的锁服务可以将这些变动写入文件中。有需要的用户和服务器直接访问这些文件即可,避免因大量系统组件之间事件通信带来系统性能下降
14
Chubby系统设计 Paxos算法实现过程中需要一个“多数派”就某个值达成一致,本质上就是分布式系统中常见的quorum机制;为保证系统高可用性,需要若干台机器,但使用单独锁服务的话一台机器也能保证这种高可用性 Chubby设计过程中一些细节问题值得关注: 在Chubby系统中采用了建议性的锁而没有采用强制性的锁。两者的根本区别在于用户访问某个被锁定的文件时,建议性的锁不会阻止访问,而强制性的锁则会阻止访问,实际上这是为了方便系统组件之间的信息交互 另外,Chubby还采用了粗粒度(Coarse-Grained)锁服务而没有采用细粒度(Fine-Grained)锁服务,两者的差异在于持有锁的时间,细粒度的锁持有时间很短
15
Chubby系统设计 Chubby基本架构:客户端和服务器端,两者通过远程过程调用(RPC)来连接
客户端每个客户应用程序都有一个Chubby程序库(Chubby Library),所有应用都是通过调用这个库中相关函数来完成 服务器一端Chubby单元,一般由五个称为副本(Replica)服务器组成,它们配置上完全一致,且系统刚开始时处于对等地位
16
分布式锁服务Chubby Paxos算法 Chubby系统设计 Chubby中的Paxos Chubby文件系统 通信协议
正确性与性能
17
Chubby中的Paxos 单个Chubby副本结构
容错日志——对数据库正确性提供重要支持;一致性由Paxos算法保证;副本之间通过特定的Paxos协议通信,同时本地文件中保存与Chubby中相同的日志数据 容错数据库——快照(Snapshot)和记录数据库操作重播日志(Replay-log);每一次的数据库操作最终都将提交至日志中;本地文件中也保存着一份数据库数据副本 Chubby构建在这个容错的数据库之上,Chubby利用这个数据库存储所有的数据。Chubby的客户端通过特定的Chubby协议和单个的Chubby副本进行通信 单个Chubby副本结构
18
Chubby中的Paxos Content Title Content Title 容错日志的API Chubby中Paxos算法过程
1、选择一副本为协调者(Coordinator) Content Title 2、协调者从客户提交的值中选择一个,accept消息广播给所有的副本,其他的副本收到广播后,选择接受或者拒绝这个值,并将决定结果反馈 Content Title 3、协调者收到大多数副本接受信息后,认为达到了一致性,接着向相关副本发送一个commit消息 容错日志的API Chubby中Paxos算法过程
19
Chubby中的Paxos Chubby设计者借鉴了Paxos的两种解决机制:给协调者指派序号或限制协调者可以选择的值
指派序号的方法 (1)在一个有n个副本系统中,为每个副本分配一个id ,其中 0≤ir≤n-1。则副本的序号,其中k的初始值为0 (2)某个副本想成为协调者之后,它就根据规则生成一个比它以前的序号更大的序号(实际上就是提高k的值),并将这个序号通过propose消息广播给其他所有的副本 (3)如果接受到广播的副本发现该序号比它以前见过的序号都大,则向发出广播的副本返回一个promise消息,并且承诺不再接受旧的协调者发送的消息。如果大多数副本都返回了promise消息,则新的协调者就产生了 限制协调者可以选择的值 Paxos强制新的协调者必须选择和前任相同的值
20
Chubby中的Paxos Chubby做了一个重要优化来提高系统效率—在选择某一个副本作为协调者之后就长期不变,此时协调者就被称为主服务器(Master) 客户端的数据请求由主服务器完成,Chubby保证在一定时间内有且仅有一个主服务器,这个时间就称为主服务器租约期(Master Lease) 客户端需要确定主服务器的位置,可向DNS发送一个主服务器定位请求,非主服务器的副本将对该请求做出回应 Chubby对于Paxos论文中未提及的一些技术细节进行了补充,所以Chubby的实现是基于Paxos,但其技术手段更加的丰富,更具有实践性
21
分布式锁服务Chubby Paxos算法 Chubby系统设计 Chubby中的Paxos Chubby文件系统 通信协议
正确性与性能
22
Chubby文件系统 Chubby系统本质上就是一个分布式的、存储大量小文件的文件系统,它所有的操作都是在文件的基础上完成
Chubby最常用的锁服务中,每一个文件就代表一个锁,用户通过打开、关闭和读取文件,获取共享(Shared)锁或独占(Exclusive)锁 选举主服务器过程中,符合条件的服务器都同时申请打开某个文件并请求锁住该文件 成功获得锁的服务器自动成为主服务器并将其地址写入这个文件夹,以便其他服务器和用户可以获知主服务器的地址信息
23
Chubby文件系统 Chubby的文件系统和UNIX类似
例如在文件名“/ls/foo/wombat/pouch”中,ls代表lock service,这是所有Chubby文件系统的共有前缀;foo是某个单元的名称;/wombat/pouch则是foo这个单元上的文件目录或者文件名 Google对Chubby做了一些与UNIX不同的改变 例如Chubby不支持内部文件的移动;不记录文件的最后访问时间;另外在Chubby中并没有符号连接(Symbolic Link,又叫软连接,类似于Windows系统中的快捷方式)和硬连接(Hard Link,类似于别名)的概念 在具体实现时,文件系统由许多节点组成,分为永久型和临时型,每个节点就是一个文件或目录。节点中保存着包括ACL(Access Control List,访问控制列表)在内的多种系统元数据
24
Chubby文件系统 元数据包含以下四种单调递增64位编号 实例号:新节点实例号必定大于旧节点的实例号 内容生成号:文件内容修改时该号增加
锁生成号:锁被用户持有时该号增加 ACL生成号:ACL名被覆写时该号增加
25
模式信息:用于新的主服务器重新创建一个旧句柄
Chubby文件系统 用户打开某个节点的同时会获取一个类似于UNIX中文件描述符(File Descriptor)的句柄,这个句柄由以下三个部分组成 校验数位:防止其他用户创建或猜测这个句柄 1 序号:确定句柄由当前还是以前的主服务器创建 2 模式信息:用于新的主服务器重新创建一个旧句柄 3
26
Chubby文件系统 在实际执行中,为了避免所有的通信都使用序号带来系统开销增长,Chubby引入了sequencer的概念
sequencer实际上就是一个序号,只能由锁的持有者在获取锁时向系统发出请求来获得。这样一来Chubby系统中只有涉及锁的操作才需要序号,其他一概不用。 在文件操作中,用户可以将句柄看做一个指向文件系统的指针 函 数 名 称 作 用 Open() 打开某个文件或者目录来创建句柄 Close() 关闭打开的句柄,后续的任何操作都将中止 Poison() 中止当前未完成及后续的操作,但不关闭句柄 GetContentsAndStat() 返回文件内容及元数据 GetStat() 只返回文件元数据 ReadDir() 返回子目录名称及其元数据 SetContents() 向文件中写入内容 SetACL() 设置ACL名称 Delete() 如果该节点没有子节点的话则执行删除操作 Acquire() 获取锁 Release() 释放锁 GetSequencer() 返回一个sequencer SetSequencer() 将sequencer和某个句柄进行关联 CheckSequencer() 检查某个sequencer是否有效 常用句柄函数及其作用
27
分布式锁服务Chubby Paxos算法 Chubby系统设计 Chubby中的Paxos Chubby文件系统 通信协议
正确性与性能
28
Chubby客户端与服务器端的通信过程 从左到右的水平方向表示时间在增加,斜向上的箭头表示一次KeepAlive请求,斜向下的箭头则是主服务器的一次回应 M1、M2、M3表示不同的主服务器租约期;C1、C2、C3则是客户端对主服务器租约期时长做出的一个估计 KeepAlive是周期发送的一种信息,它主要有两方面的功能:延迟租约的有效期和携带事件信息告诉用户更新
29
故障处理 客户端向主服务器发出一个KeepAlive请求(上图1)
如果有需要通知的事件时则主服务器会立刻做出回应,否则等到客户端的租约期C1快结束的时候才做出回应(图2),并更新主服务器租约期为M2 客户端接到回应后认为该主服务器仍处于活跃状态,于是将租约期更新为C2并立刻发出新的KeepAlive请求(图3) 宽限期内,客户端不会立刻断开其与服务器端的联系,而是不断地做探询,当它接到客户端的第一个KeepAlive请求(图4)时会拒绝(图5) 客户端在主服务器拒绝后使用新纪元号来发送KeepAlive请求(图6) 新的主服务器接受这个请求并立刻做出回应(图7) 如果客户端接收到这个回应的时间仍处于宽限期内,系统会恢复到安全状态,租约期更新为C3。如果在宽限期未接到主服务器的相关回应,客户端终止当前的会话 客户端租约过期
30
故障处理 正常情况下旧的主服务器出现故障后系统会很快地选举出新的主服务器,新选举需要经历以下九个步骤:
(1)产生一个新的纪元号以便今后客户端通信时使用,这能保证当前的主服务器不必处理针对旧的主服务器的请求 (2)只处理主服务器位置相关的信息,不处理会话相关的信息 (3)构建处理会话和锁所需的内部数据结构 (4)允许客户端发送KeepAlive请求,不处理其他会话相关的信息 (5)向每个会话发送一个故障事件,促使所有的客户端清空缓存 (6)等待直到所有的会话都收到故障事件或会话终止 (7)开始允许执行所有的操作 (8)如果客户端使用了旧的句柄则需要为其重新构建新的句柄 (9)一定时间段后(1分钟),删除没有被打开过的临时文件夹 主服务器出错 如果这一过程在宽限期内顺利完成,则用户不会感觉到任何故障的发生,也就是说新旧主服务器的替换对于用户来说是透明的,用户感觉到的仅仅是一个延迟
31
在客户端保存一个和单元上数据一致的本地缓存,需要时客户可以直接从缓存中取出数据而不用再和主服务器通信
系统实现时,Chubby还使用了一致性客户端缓存(Consistent Client-Side Caching)技术,这样做的目的是减少通信压力,降低通信频率 在客户端保存一个和单元上数据一致的本地缓存,需要时客户可以直接从缓存中取出数据而不用再和主服务器通信 当某个文件数据或者元数据需要修改时,主服务器首先将这个修改阻塞;然后通过查询主服务器自身维护的一个缓存表,向对修改的数据进行了缓存的所有客户端发送一个无效标志(Invalidation) 客户端收到这个无效标志后会返回一个确认(Acknowledge),主服务器在收到所有的确认后才解除阻塞并完成这次修改 这个过程的执行效率非常高,仅仅需要发送一次无效标志即可,因为对于没有返回确认的节点,主服务器直接认为其是未缓存
32
分布式锁服务Chubby Paxos算法 Chubby系统设计 Chubby中的Paxos Chubby文件系统 通信协议
正确性与性能
33
一致性 每个Chubby单元是由五个副本组成的,这五个副本中需要选举产生一个主服务器,这种选举本质上就是一个一致性问题。实际执行过程中,Chubby使用Paxos算法来解决 主服务器产生后客户端的所有读写操作都是由主服务器来完成的 读操作很简单,客户直接从主服务器上读取所需数据即可 写操作就会涉及数据一致性的问题;为了保证客户的写操作能够同步到所有的服务器上,系统再次利用了Paxos算法
34
安全性 Chubby用ACL形式安全保障措施。系统有三种ACL名:写ACL名(Write ACL Name)、读ACL名(Read ACL Name)和变更ACL名(Change ACL Name) 只要不被覆写,子节点都是直接继承父节点的ACL名 ACL同样被保存在文件中,它是节点元数据的一部分,用户在进行相关操作时首先需要通过ACL来获取相应的授权 Chubby的ACL机制 用户chinacloud提出向文件CLOUD中写入内容请求。CLOUD首先读取自身的写ACL名fun,接着在fun中查到了chinacloud这一行记录,于是返回信息允许chinacloud对文件进行写操作,此时chinacloud才被允许向CLOUD写入内容。其他的操作和写操作类似
35
性能优化 为满足系统高可扩展性,Chubby目前已经采取了一些措施:比如提高主服务器默认的租约期、使用协议转换服务将Chubby协议转换成较简单的协议、客户端一致性缓存等;除此之外,Google的工程师们还考虑使用代理(Proxy)和分区(Partition)技术 代理可以减少主服务器处理KeepAlive以及读请求带来的服务器负载,但是它并不能减少写操作带来的通信量 使用分区技术的话可以将一个单元的命名空间(Name Space)划分成N份。除了少量的跨分区通信外,大部分的分区都可以独自地处理服务请求。通过分区可以减少各个分区上的读写通信量,但不能减少KeepAlive请求的通信量
36
分布式结构化数据表Bigtable 设计动机与目标 数据模型 系统架构 主服务器 子表服务器 性能优化
37
设计动机与目标 需要存储的数据种类繁多:Google目前向公众开放的服务很多,需要处理的数据类型也非常多。包括URL、网页内容、用户的个性化设置在内的数据都是Google需要经常处理的 设计动机 海量的服务请求:Google运行着目前世界上最繁忙的系统,它每时每刻处理的客户服务请求数量是普通的系统根本无法承受的 商用数据库无法满足Google的需求:一方面现有商用数据库设计着眼点在于通用性,根本无法满足Google的苛刻服务要求;另一方面对于底层系统的完全掌控会给后期的系统维护、升级带来极大的便利
38
设计动机与目标 基本目标 广泛的适用性 很强的可扩展性 Bigtable是为了满足系列Google产品而非特定产品存储要求
根据需要随时可以加入或撤销服务器 基本目标 高可用性 简单性 Bigtable设计的重要目标之一就是确保几乎所有的情况下系统都可用 底层系统简单性既可减少系统出错概率,也为上层应用开发带来便利
39
分布式结构化数据表Bigtable 设计动机与目标 数据模型 系统架构 主服务器 子表服务器 性能优化
40
数据模型 Bigtable是一个分布式多维映射表,表中的数据通过一个行关键字(Row Key)、一个列关键字(Column Key)以及一个时间戳(Time Stamp)进行索引 Bigtable对存储在其中的数据不做任何解析,一律看做字符串 Bigtable的存储逻辑可以表示为: (row:string, column:string, time:int64)→string Bigtable数据模型
41
数据模型 行 同一地址域的网页会被存储在表中的连续位置,有利于用户查找和分析 倒排便于数据压缩,可以大幅提高压缩率
Bigtable的行关键字可以是任意的字符串,但是大小不能超过64KB。Bigtable和传统的关系型数据库有很大不同,它不支持一般意义上的事务,但能保证对于行的读写操作具有原子性(Atomic) 表中数据都是根据行关键字进行排序的,排序使用的是词典序。 一个典型实例,其中com.cnn.www就是一个行关键字。不直接存储网页地址而将其倒排是Bigtable的一个巧妙设计。这样做至少会带来以下两个好处 同一地址域的网页会被存储在表中的连续位置,有利于用户查找和分析 倒排便于数据压缩,可以大幅提高压缩率
42
数据模型 列 Bigtable并不是简单地存储所有的列关键字,而是将其组织成所谓的列族(Column Family),每个族中的数据都属于同一个类型,并且同族的数据会被压缩在一起保存。引入了列族的概念之后,列关键字就采用下述的语法规则来定义: 族名:限定词(family:qualifier) 族名必须有意义,限定词则可以任意选定 图中,内容(Contents)、锚点(Anchor)都是不同的族。而cnnsi.com和my.look.ca则是锚点族中不同的限定词 族同时也是Bigtable中访问控制(Access Control)基本单元,也就是说访问权限的设置是在族这一级别上进行的
43
数据模型 时间戳 Google的很多服务比如网页检索和用户的个性化设置等都需要保存不同时间的数据,这些不同的数据版本必须通过时间戳来区分。图2中内容列的t3、t5和t6表明其中保存了在t3、t5和t6这三个时间获取的网页。Bigtable中的时间戳是64位整型数,具体的赋值方式可以采取系统默认的方式,也可以用户自行定义 为了简化不同版本的数据管理,Bigtable目前提供了两种设置:一种是保留最近的N个不同版本,图中数据模型采取的就是这种方法,它保存最新的三个版本数据。另一种就是保留限定时间内的所有不同版本,比如可以保存最近10天的所有不同版本数据。失效的版本将会由Bigtable的垃圾回收机制自动处理
44
分布式结构化数据表Bigtable 设计动机与目标 数据模型 系统架构 主服务器 子表服务器 性能优化
45
系统架构 一个分布式的任务调度器,主要被用来处理分布式系统队列分组和任务调度
46
系统架构 在Bigtable中Chubby主要有以下几个作用: (1)选取并保证同一时间内只有一个主服务器(Master Server)
(2)获取子表的位置信息 (3)保存Bigtable的模式信息及访问控制列表 另外在Bigtable的实际执行过程中,Google的MapReduce 和Sawzall也被用来改善其性能
47
系统架构 Bigtable主要由三个部分组成:客户端程序库(Client Library)、一个主服务器(Master Server)和多个子表服务器(Tablet Server) 客户访问Bigtable服务时,首先要利用其库函数执行Open()操作来打开一个锁(实际上就是获取了文件目录),锁打开以后客户端就可以和子表服务器进行通信 和许多具有单个主节点分布式系统一样,客户端主要与子表服务器通信,几乎不和主服务器进行通信,这使得主服务器的负载大大降低 主服务主要进行一些元数据操作以 及子表服务器之间负载调度问题, 实际数据是存储在子表服务器上
48
分布式结构化数据表Bigtable 设计动机与目标 数据模型 系统架构 主服务器 子表服务器 性能优化
49
主服务器 当一个新子表产生时,主服务器通过一个加载命令将其分配给一个空间足够的子表服务器。创建新表、表合并以及较大子表的分裂都会产生一个或多个新子表。对于前面两种,主服务器会自动检测到,而较大子表的分裂是由子服务发起并完成的,所以主服务器并不能自动检测到,因此在分割完成之后子服务器需要向主服务发出一个通知 由于系统设计之初就要求能达到良好的扩展性,所以主服务器必须对子表服务器的状态进行监控,以便及时检测到服务器的加入或撤销 Bigtable中主服务器对子表服务器的监控是通过Chubby完成的——子表服务器在初始化时都会从Chubby中得到一个独占锁。通过这种方式所有子表服务器基本信息被保存在Chubby中一个称为服务器目录(Server Directory)的特殊目录之中
50
主服务器 主服务器会定期向其询问独占锁的状态。如果子表服务器的锁丢失或没有回应,则此时可能有两种情况
要么是Chubby出现了问题(虽然这种概率很小,但的确存在,Google自己也做过相关测试) 要么是子表服务器自身出现了问题。对此主服务器首先自己尝试获取这个独占锁,如果失败说明Chubby服务出现问题,需等待恢复;如果成功则说明Chubby服务良好而子表服务器本身出现了问题 当在状态监测时发现某个子表服务器上负载过重时,主服务器会自动对其进行负载均衡操作
51
主服务器 基于系统出现故障是一种常态的设计理念,每个主服务器被设定了一个会话时间的限制。当某个主服务器到时退出后,管理系统就会指定一个新的主服务器,这个主服务器的启动需要经历以下四个步骤: (1)从Chubby中获取一个独占锁,确保同一时间只有一个主服务器 (2)扫描服务器目录,发现目前活跃的子表服务器 (3)与所有的活跃子表服务器取得联系以便了解所有子表的分配情况 (4)扫描元数据表,发现未分配的子表并将其分配到合适子表服务器 如果元数据表未分配,则首先需要将根子表(Root Tablet)加入未分配的子表中。由于根子表保存了其他所有元数据子表的信息,确保了扫描能够发现所有未分配的子表
52
分布式结构化数据表Bigtable 设计动机与目标 数据模型 系统架构 主服务器 子表服务器 性能优化
53
SSTable及子表基本结构 子表实际组成 SSTable结构 Bigtable中的日志文件是一种共享日志,每个子表服务器上仅保存一个日志文件,某个子表日志只是这个共享日志的一个片段。这样会节省大量的空间,但在恢复时却有一定的难度 Google为了避免这种情况出现,对日志做了一些改进。Bigtable规定将日志的内容按照键值进行排序,这样不同的子表服务器都可以连续读取日志文件了 一般来说每个子表的大小在100MB到200MB之间。每个子表服务器上保存的子表数量可以从几十到上千不等,通常情况下是100个左右 SSTable中数据被划分成一个个的块(Block),每个块的大小是可以设置的,一般为64KB 在SSTable的结尾有一个索引(Index),这个索引保存了块的位置信息,在SSTable打开时这个索引会被加载进内存,用户在查找某个块时首先在内存中查找块的位置信息,然后在硬盘上直接找到这个块 由于每个SSTable一般都不是很大,用户还可以选择将其整体加载进内存,这样查找起来会更快 SSTable是Google为Bigtable设计的内部数据存储格式。所有的SSTable文件都存储在GFS上 每个子表都是由多个SSTable以及日志(Log)文件构成 不同子表的SSTable可以共享
54
子表地址结构 子表地址的查询是经常碰到的操作。在Bigtable系统的内部采用的是一种类似B+树的三层查询体系
55
所有子表地址都被记录在元数据表中,元数据表也是由一个个的元数据子表(Metadata tablet)组成
根子表是元数据表中一个比较特殊的子表,它既是元数据表的第一条记录,也包含了其他元数据子表的地址,同时Chubby中的一个文件也存储了这个根子表的信息。 查询时,首先从Chubby中提取这个根子表的地址,进而读取所需的元数据子表的位置,最后就可以从元数据子表中找到待查询的子表。除了这些子表的元数据之外,元数据表中还保存了其他一些有利于调试和分析的信息,比如事件日志等
56
为了减少访问开销,提高客户访问效率,Bigtable使用了缓存(Cache)和预取(Prefetch)技术
子表的地址信息被缓存在客户端,客户在寻址时直接根据缓存信息进行查找。一旦出现缓存为空或缓存信息过时的情况,客户端就需要按照图示方式进行网络的来回通信(Network Round-trips)进行寻址,在缓存为空的情况下需要三个网络来回通信。如果缓存的信息是过时的,则需要六个网络来回通信。其中三个用来确定信息是过时的,另外三个获取新的地址 预取则是在每次访问元数据表时不仅仅读取所需的子表元数据,而是读取多个子表的元数据,这样下次需要时就不用再次访问元数据表
57
子表数据存储及读/写操作 Bigtable将数据存储划分成两块:较新的数据存储在内存中一个称为内存表(Memtable)的有序缓冲里,较早的数据则以SSTable格式保存在GFS中 写操作(Write Op)——先查询Chubby中保存的访问控制列表确定用户具相应写权限,通过认证之后写入的数据首先被保存在提交日志(Commit Log)中。提交日志中以重做记录(Redo Record)的形式保存着最近的一系列数据更改,这些重做记录在子表进行恢复时可以向系统提供已完成的更改信息。 读操作(Read Op)——先通过认证,之后读操作就要结合内存表和SSTable文件来进行,因为内存表和SSTable中都保存了数据 Bigtable数据存储及读/写操作
58
每一次旧的内存表停止使用时都会进行一个次压缩操作,这会产生一个SSTable。但如果系统中只有这种压缩的话,SSTable的数量就会无限制地增加下去
数据压缩问题 Bigtable中有三种形式的数 据压缩 : 次压缩(Minor Compaction) 合并压缩(Merging Compaction) 主压缩(Major Compaction) 而在Bigtable中,读操作实际上比写操作更重要,因此Bigtable会定期地执行一次合并压缩的操作,将一些已有的SSTable和现有的内存表一并进行一次压缩 主压缩其实是合并压缩的一种,只不过它将所有的SSTable一次性压缩成一个大的SSTable文件。主压缩也是定期执行,执行一次主压缩之后可以保证将所有的被压缩数据彻底删除 三种形式压缩之间的关系
59
分布式结构化数据表Bigtable 设计动机与目标 数据模型 系统架构 主服务器 子表服务器 性能优化
60
局部性群组(Locality groups)
根据需要,将原本不存储在一起的数据,以列族为单位存储至单独的子表 有的用户可能只对网页内容感兴趣,那么它可以通过设置局部性群组(见下图)只看内容这一列;有的对诸如网页语言、网站排名等可以用于分析的信息比较感兴趣,他也可以将这些列设置到一个群组中
61
压缩 压缩 压缩可以有效地节省空间,Bigtable中的压缩被应用于很多场合
首先压缩可以被用在构成局部性群组的SSTable中,可以选择是否对个人的局部性群组的SSTable进行压缩。这种压缩是对每个局部性群组独立进行,虽然会浪费一些空间,但是在需要读时解压速度非常快 通常情况下,用户可以采用两步压缩的方式: 第一步利用Bentley & McIlroy方式(BMDiff)在大的扫描窗口将常见的长串进行压缩;第二步采取Zippy技术进行快速压缩,它在一个16KB大小的扫描窗口内寻找重复数据,这个过程非常快 压缩技术还可以提高子表的恢复速度,当某个子表服务器停止使用后,需要将上面所有的子表移至另一个子表服务器。转移前两次压缩:第一次压缩减少了提交日志中未压缩状态;文件正式转移前还要进行一次压缩,主要是将第一次压缩后遗留的未压缩空间进行压缩
62
布隆过滤器(Bloom Filter) 布隆过滤器(Bloom Filter)
巴顿·布隆在1970年提出的,实际上它是一个很长的二进制向量和一系列随机映射函数,在读操作中确定子表的位置时非常有用 优势:速度快,省空间。而且它有一个最大的好处是它绝不会将一个存在的子表判定为不存在 缺点:在某些情况下它会将不存在的子表判断为存在。不过这种情况出现的概率非常小,跟它带来的巨大好处相比这个缺点是可以忍受的 目前包括Google Analytics、Google Earth、个性化搜索、Orkut和RRS阅读器在内几十个项目都使用Bigtable。这些应用对Bigtable的要求以及使用的集群机器数量都各不相同,但从实际运行来看,Bigtable完全可以满足这些不同需求的应用,而这一切都得益于其优良的构架以及恰当的技术选择
63
谢 谢!
Similar presentations