MIT6.824/lecture-09-more-replication-craq/9.7-lian-fu-zhi-de-pei-zhi-guan-li-qi-configuration-manager.md
2022-01-25 02:41:31 +00:00

6.4 KiB
Raw Permalink Blame History

9.7 链复制的配置管理器Configuration Manager

(接上一节最后)

所以Chain Replication并不能抵御网络分区也不能抵御脑裂。在实际场景中这意味它不能单独使用。Chain Replication是一个有用的方案但是它不是一个完整的复制方案。它在很多场景都有使用但是会以一种特殊的方式来使用。总是会有一个外部的权威External Authority来决定谁是活的谁挂了并确保所有参与者都认可由哪些节点组成一条链这样在链的组成上就不会有分歧。这个外部的权威通常称为Configuration Manager。

Configuration Manager的工作就是监测节点存活性一旦Configuration Manager认为一个节点挂了它会生成并送出一个新的配置在这个新的配置中描述了链的新的定义包含了链中所有的节点HEAD和TAIL。Configuration Manager认为挂了的节点或许真的挂了也或许没有但是我们并不关心。因为所有节点都会遵从新的配置内容所以现在不存在分歧了。

现在只有一个角色Configuration Manager在做决定它不可能否认自己所以可以解决脑裂的问题。

当然你是如何使得一个服务是容错的不否认自己同时当有网络分区时不会出现脑裂呢答案是Configuration Manager通常会基于Raft或者Paxos。在CRAQ的场景下它会基于Zookeeper。而Zookeeper本身又是基于类似Raft的方案。

所以你的数据中心内的设置通常是你有一个基于Raft或者Paxos的Configuration Manager它是容错的也不会受脑裂的影响。之后通过一系列的配置更新通知Configuration Manager将数据中心内的服务器分成多个链。比如说Configuration Manager决定链A由服务器S1S2S3组成链B由服务器S4S5S6组成。

Configuration Manager通告给所有参与者整个链的信息所以所有的客户端都知道HEAD在哪TAIL在哪所有的服务器也知道自己在链中的前一个节点和后一个节点是什么。现在单个服务器对于其他服务器状态的判断完全不重要。假如第二个节点真的挂了在收到新的配置之前HEAD需要不停的尝试重发请求。节点自己不允许决定谁是活着的谁挂了。

这种架构极其常见这是正确使用Chain Replication和CRAQ的方式。在这种架构下像Chain Replication一样的系统不用担心网络分区和脑裂进而可以使用类似于Chain Replication的方案来构建非常高速且有效的复制系统。比如在上图中我们可以对数据分片Sharding每一个分片都是一个链。其中的每一个链都可以构建成极其高效的结构来存储你的数据进而可以同时处理大量的读写请求。同时我们也不用太担心网络分区的问题因为它被一个可靠的非脑裂的Configuration Manager所管理。

学生提问为什么存储具体数据的时候用Chain Replication而不是Raft

Robert教授这是一个非常合理的问题。其实数据用什么存并不重要。因为就算我们这里用了Raft我们还是需要一个组件在产生冲突的时候来做决策。比如说数据如何在我们数百个复制系统中进行划分。如果我需要一个大的系统我需要对数据进行分片需要有个组件来决定数据是如何分配到不同的分区。随着时间推移这里的划分可能会变化因为硬件可能会有增减数据可能会变多等等。Configuration Manager会决定以A或者B开头的key在第一个分区以C或者D开头的key在第二个分区。至于在每一个分区我们该使用什么样的复制方法Chain ReplicationPaxos还是Raft不同的人有不同的选择有些人会使用Paxos比如说Spanner我们之后也会介绍。在这里不使用Paxos或者Raft是因为Chain Replication更加的高效因为它减轻了Leader的负担这或许是一个非常关键的问题。

某些场合可能更适合用Raft或者Paxos因为它们不用等待一个慢的副本。而当有一个慢的副本时Chain Replication会有性能的问题因为每一个写请求需要经过每一个副本只要有一个副本变慢了就会使得所有的写请求处理变慢。这个可能非常严重比如说你有1000个服务器因为某人正在安装软件或者其他的原因任意时间都有几个服务器响应比较慢。每个写请求都受限于当前最慢的服务器这个影响还是挺大的。然而对于Raft如果有一个副本响应速度较慢Leader只需要等待过半服务器而不用等待所有的副本。最终所有的副本都能追上Leader的进度。所以Raft在抵御短暂的慢响应方面表现的更好。一些基于Paxos的系统也比较擅长处理副本相距较远的情况。对于Raft和Paxos你只需要过半服务器确认所以不用等待一个远距离数据中心的副本确认你的操作。这些原因也使得人们倾向于使用类似于Raft和Paxos这样的选举系统而不是Chain Replication。这里的选择取决于系统的负担和系统要实现的目标。

不管怎样,配合一个外部的权威机构这种架构,我不确定是不是万能的,但的确是非常的通用。

学生提问如果Configuration Manger认为两个服务器都活着但是两个服务器之间的网络实际中断了会怎样

Robert教授对于没有网络故障的环境总是可以假设计算机可以通过网络互通。对于出现网络故障的环境可能是某人踢到了网线一些路由器被错误配置了或者任何疯狂的事情都可能发生。所以因为错误的配置你可能陷入到这样一个情况中Chain Replication中的部分节点可以与Configuration Manager通信并且Configuration Manager认为它们是活着的但是它们彼此之间不能互相通信。

这是这种架构所不能处理的情况。如果你希望你的系统能抵御这样的故障。你的Configuration Manager需要更加小心的设计它需要选出不仅是它能通信的服务器同时这些服务器之间也能相互通信。在实际中任意两个节点都有可能网络不通。