如切如磋,如琢如磨
yugabytedb之DocDB复制层
以下文章借鉴于官网https://docs.yugabyte.com/latest/architecture/docdb-replication/
Yugabytedb的同步复制借鉴于Google Spanner,异步复制借鉴于传统的RDBMS数据库,比如Oracle,mysql,PostgreSQL。
下面的章节描述了DocDB中的复制是如何工作的,DocDB表中的数据被划分成多个tablet。默认每个tablet使用Raft算法进行同步复制。Yugabytedb还包含两种其他的异步复制策略:
xCluster replication:数据在不同的Yugabytedb集群之间异步复制--单向复制(主从)或跨两个集群的双向复制。
Read replicas:集群内的异步复制。
下面详细说明每种复制策略的工作机制,首先介绍默认的同步复制策略
表被自动的划分为tablets,tablet peers之间保持强一致,不同YB-TServer上的tablet peers组成一个Raft组,用于Leader选举、故障检测和WAL日志复制。
tablet启动时发生的第一件事情是使用Raft协议选择一个tablet peer作为leader。该leader负责处理客户的写入请求。它将用户写入的内容转换到DocDB文档存储层,并使用Raft协议在tablet peer之间进行复制以实现强一致性。
DocDB更新的内容集合取决于用户发起的写操作,包括锁定一组key以建立严格的更新顺序,以及在读-修改-写的情况下,选择性的读取要修改和更新的旧值。Raft日志用于确保tablet的状态机在tablet peer之间进行复制,即使在遇到故障或成员变更时,也能严格排序并保证正确性,这一点对于实现强一致性至关重要。
一旦Raft日志被复制到多数派tablet peer上并在多数派tablet上成功持久化,写入操作就可以应用到DocDB的文档存储层,随后用于读取操作。一旦写入操作在DocDB的文档存储层持久化成功,就可以从Raft日志中清除Raft日志。这些操作是在后台执行的,对前台操作没有任何影响。
集群中的复制
数据副本可以跨多个容错域放置。让我们看看如何通过使用多区域部署的示例在集群中实现跨容错域的复制,其中有三个区域,复制系数假定为3。
多区域部署
在多区域部署的情况下,使用Raft算法跨多个区域,复制节点中每个tablet中的数据。属于给定tablet行的所有读写查询都应该由tablet的leader处理,如下图所示:
作为Raft复制的一部分,每个tablet peer首先选择一个负责读写操作的tablet leader。tablet leader在哪个区域由用户指定的数据放置策略决定。上述场景的放置策略是确保稳定的状态下,每个区域具有相同数量的tablet leader。下图显示了示例场景中tablet peer的分布情况。
容忍一个分区故障
一旦区域发生故障,Yugabytedb就会假定该区域中的所有节点同时不可用,这导致三分之一的tablet不能服务任何请求,另外三分之二的tablet不受影响,下图显示了区域中tablet出现故障的情况: