GFS副本控制协议--中心化副本控制协议
对于副本集的更新操作有一个中心节点来协调管理,将分布式的并发操作转化为单点的并发操作,从而保证副本集内各节点的一致性。在GFS中,中心节点称之为Primary,非中心节点成为Secondary。中心节点是GFS Master通过lease(租约?)选举的。
数据冗余的颗粒度
GFS中,数据的冗余是以Chunk为基本单位的,而不是文件或者机器。
上图中,o p q即为数据段,相比以机器为粒度的副本,以数据段为独立的副本机制,虽然维护的元数据更多一些,但系统伸缩性更好,故障恢复更迅速,资源利用率更均匀。
数据写入过程:
step1 Client向master请求Chunk的副本信息,以及哪个副本(Replica)是Primary
step2 maste回复client,client缓存这些信息在本地
step2 client将数据(Data)链式推送到所有副本
step4 Client通知Primary提交
step5 primary在自己成功提交后,通知所有Secondary提交
step6 Secondary向Primary回复提交结果
step7 primary回复client提交结果
优势:最大化利用每个机器的网络带宽,避免网络瓶颈和高延迟连接,最小化推送延迟。GFS使用TCP流式传输数据,以最小化延迟。一旦chunkserver收到数据,即立刻开始推送,即一个replica不用收到完整的数据再发往下一个replica。
副本的一致性保证:
这里有两个术语:consistent, defined
consistent:对于文件区域A,如果所有客户端从任何副本上读到的数据都是相同的,那A就是一致的。
defined:如果A是一致的,并且客户端可以看到变异(mutation)写入的完整数据,那A就是defined,即结果是可预期的。
将异常抛给程序处理。GFS提供的一致性保证称之为“relaxed consistency”,relaxed是指,系统在某些情况下是不保证一致性,比如读取到尚未完全写完的数据(数据库中的Dirty Read);比如上面提到的padding(可以使用checksum机制解决);比如上面提到的重复的append数据(读取数据的应用自行保证幂等性)。在这些异常情况下,GFS是不保证一致性的,需要应用程序来处理。