上一篇文章介绍了FastCFS采用数据分组的做法,一个数据分组的几个节点(如三个节点即三副本)之间是Master/Slave关系;FastCFS采用数据强一致模型,通过Master/Slave结构的同步复制机制来保证数据一致性,本文将概要介绍这一机制的原理和关键点。
和单机系统相比,分布式系统因网络通信方面存在较大不确定性,要做到数据强一致的挑战非常大。业界分布式系统主流做法是采用BASE理论,有意避开数据强一致性这个难题。BASE理论是Basically Available(基本可用),Soft State(软状态或中间状态)和Eventually Consistent(最终一致性)三个短语的缩写。BASE理论比较偏工程实践,见文知意,需要进一步了解的朋友自行脑补。
采用Master/Slave结构,保证数据强一致的逻辑很简单。client的更新操作只能由Master处理,然后master同步调用slave转发该请求。FastCFS中master可以并发请求多个slave,因此client的响应时间和slave数目(副本数)并不是线性关系。master只会对在线(ACTIVE)的slave发起同步调用,那么slave因重启服务或网络通信异常导致掉线(OFFLINE),FastCFS是如何处理的呢?OFFLINE状态的slave会进入数据恢复(追加数据)阶段,追上master的最新数据后,方可切换为ACTIVE状态。为了确保平滑切换,引入了ONLINE这一中间状态。
有朋友就说了,上面的同步复制方式很简单直接嘛,并没有多么高深的地方。嗯,简单的往往就是最有效的。有挑战的地方不在方案的复杂性,而在于工程实现。在保证数据一致性前提下,数据同步复制方案的两大关键点:维护精准的集群状态和slave状态平滑切换。
FastCFS引入leader/follower这一机制来维护精准的集群状态。leader通过选举产生,follower和leader建立连接并每秒报告其自身状态(磁盘空间、数据版本号等)。当集群状态发生变化时,如master切换、slave状态变化等,leader会立即将变动消息推送给所有follower。借助zookeeper或者etcd也可以实现同样的功能,为什么要自造轮子呢?原因有二:一、自主可控,减少依赖;二、简单高效,避免臃肿。
分布式系统在保证数据强一致性的前提下,还要做到高可用和高性能,挑战非常大。为了做到这一点,还有一个最为关键的地方,下一篇文章将为你揭晓。