元数据 MetaData
论文中的MetaData特指存储在Master中的信息,都存储在内存之中,它包括3个部分:
- 文件和数据块的命名空间[nameSpace]。
- 文件与数据块的对应关系。
- 每个数据块及其副本的位置信息。
其中,前两项使用操作日志的方法持久化到了磁盘。而第三部分--位置信息 则由chunkServer在心跳通信时进行上报更新。 值得注意的是,数据放入内存确实能提高响应速度,但GFS整体可存放的数据大小将受内存大小限制,且GFS系统是单一master,无法横向扩展,分布式存储元数据。为了节省宝贵的内存,我们使用前缀树这一结构存储我们的命名空间。
操作日志
操作日志记录了元数据中,命名空间及数据块对应关系的改动(历史记录)。采用追加写入的方式,天然的提供了修改操作的顺序性。一旦操作被记录下来,就能通过 文件、数据块、时间戳(三者组成联合主键)唯一且持久化的确认一条操作记录。
记录操作日志和修改内存中的元数据这两项操作应当对Client保持 原子性、可见性和持久性。
- 原子性。只有写日志和修改内存 都成功了,此次操作才视为成功。如果修改内存失败,则可以通过回放日志的方式进行恢复。
- 可见性。Client只获取内存中的元数据信息,因此将修改内存的操作放在最后。
- 持久性。操作日志持久化到磁盘,并且,为了增强容错性,将制作副本存入其他机器。
由于操作日志是不断的追加写入,该文件会变得越来越大。因此设立了检查点[checkPoint]机制,来为文件瘦身。
- checkPoint信息和结构与内存中的元数据一致,这样无需解析就可以加载到内存空间。
- 为了不使Master对外停止服务,创建checkPoint使用的是切换文件机制:
- 当日志文件增长到某一大小时,切换到一个新的日志文件上记录操作,旧的日志文件用来建立checkPoint。
- 拥有了检查点后的恢复作业只需执行最近一次检checkPoint及其之后的操作记录即可。
- 同样是容错性考虑,可以选择保留最近n+1次的checkPoint和相应的日志文件。
数据一致性
由于有数据副本的存在,对一个数据块的改动操作,除了会在本机的数据块上执行外,还需要同步到副本块上执行完成,才算是修改成功(要保证原子性)。根据CAP理论和BASE理论,GFS并不保证数据的强一致性(C),而只要求基本可用(BA)。因此,GFS的一致性级别由高到低分别为:
- Defined 可预期的。客户端读取任意副本的结果都一样 且 在并行情况下,自己的修改和预期一致。
- Consistent 一致的。所有的客户端读取到的数据都是一样的,无论它们读的是哪一个副本。但不保证副本内部数据的正确性(由并发修改引起的数据覆盖、重复等)。
- Undefined 不可预期的。 并发情况下造成的数据交叉、进而引发类似MySQL中的不可重复读问题。
- Inconsistent 不一致的。 在不同时段,不同客户端查询同一块的结果都不相同。
GFS落实一致性的方法
GFS采用追加写入+检查点机制的方式来实现宽松的一致性模型。
- 记录的追加写入采用最少一次(at-least-once)方式,虽然会产生重复数据,但可以保证记录的持久化。
- 在数据块上使用的checkPoint包括了该数据块的校验和。使用该校验和,客户端在读取时可以识别并丢弃填充字符和片段。 客户端在读取数据的时候,通过使用校验和来识别并丢弃填充字符,通过使用唯一标记将重复记录过滤出来。
加餐部分
🎁论文原文中的状态[State]一词该如何理解? 🗝状态,是相对于检查点,或者说是存档机制来说的(checkPoint的另一种翻译)。指代的是需要持久化的信息的集合。例如我们在玩电子游戏,打最终Boss时的存档动作。游戏中的存档是什么呢?我们角色的血量、金币、健康度等状态,还有世界坐标、关卡等信息。 🗝需要存什么,由游戏开发者决定。而相应的,我们的状态需要持久化哪些信息,由app的开发者决定。 🗝如果挑战Boss失败了,通过读档,我们还可以重新挑战。相应的,我们在checkPoint之后的操作失败了,也可以借助存档来快速恢复。
🎁为什么数据块不存储在Master,而是由各个server定期上报?
- chunkServer的加入、离开、修改文件名、出错、重启等能够影响位置信息的情况实在是太多而且太频繁。采用chunkServer直接汇报的方式,一方面规避了这些情况下的处理,另一方面可以最大限度的减少master-chunkServer之间的通信,节省带宽。
- chunkServer的职责就是负责数据块的存储,它离位置信息是最近的。那么,在master上再去存一份一样的位置信息是没有多大意义的。
🎁为什么会有一致性问题? 🗝GFS系统中,任何数据块都存在副本,而因为网络的不可靠,将一份内容同步到多个备份是需要时间的。(并非原子性的)在这个时间段内,任何一个部件(client,chunkserver以及网络而)出现问题,就会造成副本的不一致。
🎁一致性和defined在GFS系统中到底指的是什么?
- 一致性:任何一个副本都是一模一样的(但不保证它是defined的),因此无论何时、多少客户端去读取,看到的都是相同数据。
- defined:客户端的任何一个写操作都可以查到相应日志记录。
- undefined:通常客户端是发送一组写操作的,此时有多个客户端进行写操作时,就可能造成数据交叉,进而引发类似于MySQL事务中的 不可重复读 问题。
🎁最少一次[at-least-once] 的理解 🗝数据在c-s的传输过程中,受到网络超时的影响,可能会发生两种结果:传送过程出现问题,服务端没有收到数据。返回成功消息时出现问题,服务端已经接收到消息。
- at-least-once 特指 在 接收方已经接收到消息但返回成功消息时出现问题,发送方将采取重复发送的方式。即接收方会收到多条重复数据,需要接收方支持幂等性。
- at-most-once 与at-least-once相反,发送方只发送一次数据,也不关心接收方是否收到