阅读GFS论文时,发现有几个地方特别不容易理解,特记录如下。
一致性问题
GFS中的文件由块组成,同一个块有多个副本,副本分布在不同的节点上,如何保证数据的一致性?
论文中有“宽松的一致性模型”这种说法,一般的理解,“宽松”的意思就是不严格保证,为什么呢?原文中的说法是为了简化系统设计。
为什么会有一致性的问题?一致性问题产生的根源是什么?
写入操作失败,是导致不一致性的一个原因。
更普遍的原因是用户多路并发写操作,因为简化系统设计,又没有提供复杂的同步机制。
一致性涉及到的重要概念:
- consistent:对于文件中的一块区域,比如从某个偏移量开始到某个偏移量结束,如果客户端从任意副本读出的这块数据都相同,则认为文件的这块区域在系统中是consistent,也就是一致的,但一致并不等同于正确。
- defined:如果对于文件中的某一个区域,如果一个变更完成后,区域中的数据在保持一致性的同时,所有的客户端都能完整的看到这次变更,则说明这块区域是defined,也就是定义的,这是理解的状态。
接下来看下表:
随机写 | 记录追加写 | |
串行成功 | 定义的 | 定义但部分不一致 |
并发成功 | 一致但是未定义 | |
失败 | 不一致 |
- 随机写串行成功