3.4.2 一致性与可用性
来自Berkerly的Eric Brewer教授提出了一个著名的CAP理论:一致性(Consistency),可用性(Availability)以及分区可容忍性(Tolerance of network Partition)三者不能同时满足。笔者认为没有必要纠结CAP理论最初的定义,在工程实践中,可以将C、A、P三者按如下方式理解:
●一致性:读操作总是能读取到之前完成的写操作结果,满足这个条件的系统称为强一致系统,这里的“之前”一般对同一个客户端而言;
●可用性:读写操作在单台机器发生故障的情况下仍然能够正常执行,而不需要等待发生故障的机器重启或者其上的服务迁移到其他机器;
●分区可容忍性:机器故障、网络故障、机房停电等异常情况下仍然能够满足一致性和可用性。
分布式存储系统要求能够自动容错,也就是说,分区可容忍性总是需要满足的,因此,一致性和写操作的可用性不能同时满足。
如果采用强同步复制,保证了存储系统的一致性,然而,当主备副本之间出现网络或者其他故障时,写操作将被阻塞,系统的可用性无法得到满足。如果采用异步复制,保证了存储系统的可用性,但是无法做到强一致性。
存储系统设计时需要在一致性和可用性之间权衡,在某些场景下,不允许丢失数据,在另外一些场景下,极小的概率丢失部分数据时允许的,可用性更加重要。例如,Oracle数据库的DataGuard复制组件包含三种模式:
●最大保护模式(Maximum Protection):即强同步复制模式,写操作要求主库先将操作日志(数据库的redo/undo日志)同步到至少一个备库才可以返回客户端成功。这种模式保证即使主库出现无法恢复的故障,比如硬盘损坏,也不会丢失数据。
●最大性能模式(Maximum Performance):即异步复制模式,写操作只需要在主库上执行成功就可以返回客户端成功,主库上的后台线程会将重做日志通过异步的方式复制到备库。这种方式保证了性能及可用性,但是可能丢失数据。
●最大可用性模式(Maximum Availability):上述两种模式的折衷。正常情况下相当于最大保护模式,如果主备之间的网络出现故障,切换为最大性能模式。这种模式在一致性和可用性之间做了一个很好的权衡,推荐大家在设计存储系统时使用。