目录
架构
gfs(google file system)包含一个master节点和若干个chunk server。master节点维护元数据,chunk server存储实际数据。访问gfs通过client进行,client通过lib的形式集成在用户程序中,先访问master节点获取要访问文件所在的chunk节点地址,然后访问chunk server操作数据。
一致性模型
gfs的数据一致性是针对多个chunk server保存的相同文件副本来说的,文件按照每64MB一个chunk的形式组织,一个文件可能占用多个chunk,每个chunk都复制多份保存在不同chunk server上,默认副本数量是3。对数据库有一定了解的同学对事务的一致性级别一定不会陌生,gfs对于文件的修改操作和数据库事务有相通之处,对于数据修改后文件的一段数据(region),定义如下两个一致性级别:
- 一致的(consistency):所有client无论从哪个副本读一个region,读到的都是同样的内容
- 已定义的(defined):region一致,且client能看到写入操作的全部内容
下面总结了所有操作的一致性级别:
写 | 记录追加 | |
---|---|---|
串行成功 | 已定义 | 已定义,部分不一致 |
并行成功 | 一致未定义 | |
失败 | 不一致 |
这里对写操作和记录追加两种修改方式分别做解释
对写操作,串行成功和失败的情况都很好理解,串行成功是最严格的一致性要求,成功后数据一定是一致的;gfs对失败操作没有类似数据库事务的回滚操作,可能在一个副本写入了数据其他副本没写入,或者每个副本写入的数据长度不一样,从而多副本之间的数据是不一致的。这里主要解释下并行成功的情况。并行写的情况发生在多个client写同一个文件区域,例如两个client同时写一个文件alibaba.txt,client A从文件偏移1000的位置开始写入100个字节,client B从文件偏移1050的位置开始写入100个字节,这样两个client的写入有50字节冲突,如图: