3.8 跨机房部署
在分布式系统中,跨机房问题一直都是老大难问题。机房之间的网络延时较大,且不稳定。跨机房问题主要包含两个方面:数据同步以及服务切换。跨机房部署方案有三个:集群整体切换、单个集群跨机房、Paxos选主副本。下面分别介绍。
1.集群整体切换
集群整体切换是最为常见的方案。如图3-10所示,假设某系统部署在两个机房:机房1和机房2。两个机房保持独立,每个机房部署单独的总控节点,且每个总控节点各有一个备份节点。当总控节点出现故障时,能够自动将机房内的备份节点切换为总控节点继续提供服务。另外,两个机房部署了相同的副本数,例如数据分片A在机房1存储的副本为A11和A12,在机房2存储的副本为A21和A22。在某个时刻,机房1为主机房,机房2为备机房。
图 3-10 集群整体切换
机房之间的数据同步方式可能为强同步或者异步。如果采用异步模式,那么,备机房的数据总是落后于主机房。当主机房整体出现故障时,有两种选择:要么将服务切换到备机房,忍受数据丢失的风险;要么停止服务,直到主机房恢复为止。因此,如果数据同步为异步,那么,主备机房切换往往是手工的,允许用户根据业务的特点选择“丢失数据”或者“停止服务”。
如果采用强同步模式,那么,备机房的数据和主机房保持一致。当主机房出现故障时,除了手工切换,还可以采用自动切换的方式,即通过分布式锁服务检测主机房的服务,当主机房出现故障时,自动将备机房切换为主机房。
2.单个集群跨机房
上一种方案的所有主副本只能同时存在于一个机房内,另二种方案是将单个集群部署到多个机房,允许不同数据分片的主副本位于不同的机房,如图3-11所示。每个数据分片在机房1和机房2,总共包含4个副本,其中A1、B1、C1是主副本,A1和B1在机房1,C1在机房2。整个集群只有一个总控节点,它需要同机房1和机房2的所有工作节点保持通信。当总控节点出现故障时,分布式锁服务将检测到,并将机房2的备份节点切换为总控节点。
图 3-11 单个集群跨机房
如果采用这种部署方式,总控节点在执行数据分布时,需要考虑机房信息,也就是说,尽量将同一个数据分片的多个副本分布到多个机房,从而防止单个机房出现故障而影响正常服务。
3.Paxos选主副本
在前两种方案中,总控节点需要和工作节点之间保持租约(lease),当工作节点出现故障时,自动将它上面服务的主副本切换到其他工作节点。
如果采用Paxos协议选主副本,那么,每个数据分片的多个副本构成一个Paxos复制组。如图3-12所示,B1、B2、B3、B4构成一个复制组,某一时刻B1为复制组的主副本,当B1出现故障时,其他副本将尝试切换为主副本,Paxos协议保证只有一个副本会成功。这样,总控节点与工作节点之间不再需要保持租约,总控节点出现故障也不会对工作节点产生影响。
图 3-12 Paxos选主副本
Google后续开发的系统,包括Google Megastore以及Spanner,都采用了这种方式。它的优点在于能够降低对总控节点的依赖,缺点在于工程复杂度太高,很难在线下模拟所有的异常情况。