TiDB多活方案

网友投稿 824 2022-10-20

TiDB多活方案

TiDB多活方案

作者: 代晓磊_Mars

TiDB的多活一直是各个将TiDB用到核心场景的互联网公司都在努力实现的高可用方案。为了实现分布式数据库的可用性要求,通常采用多中心部署方案,以保证高可用和容灾能力。多中心部署方案包括同城主备集群,同城双中心,同城三中心、两地三中心等多种部署模式。

同城多中心方案一般硬性要求:

(1)数据中心距离在 50 km 以内,通常位于同一个城市或两个相邻城市

(2)数据中心间的网络采用2条光纤专线连接,并且要求延迟小于 1.5 ms,并且长期稳定运行

(3)双专线且带宽大于 10 Gbps。

在讲多活之前先给大家普及几个概念:

RPO:Recovery Point Objective,数据恢复点目标,也就是说业务能容忍数据丢失量,核心业务一般要求RPO=0。RTO:Recovery Time Objective,恢复时间目标,也就是说业务能接受的最大不可用时间,一般都要求RTO<30s。Muti-raft:raft是分布式一致性算法,tikv的底层多个region副本(默认3副本)是通过日志复制来实现数据同步,并且靠多个raft group(成员有“身份”)来投票来获得leader/follwer身份,tikv的数据写入是靠raft group中的多数节点写入成功才算成功。

所以在多活的场景中的建议:

服务器容灾:至少提供 3 台服务器来避免单host宕机导致的集群不可用。机架容灾:至少提供 3 个机柜来避免单机柜(rack)故障导致的集群不可用。机房容灾:至少提供 3 个数据中心来避免单数据中心(DataCenter)故障导致的集群不可用。城市容灾:至少规划 3 个城市来避免单城市灾难引发的集群不可用。

注:这也是俗话说的鸡蛋不要放在一个篮子里的原因。

主备集群

这里主要提到的是基于TiCDC的同城、跨城的数据同步。

这些对于所有核心tidb都放在同一个机房的公司,如果机房孤岛或者其他灾害问题,业务无法及时恢复。所以说TiDB集群的主备集群需求是重要的需求。TiCDC作为TiDB生态中重要的一环,通过ticdc cluster实时拉取tikv的changelog并且应用到下游集群,从而实现了同城/跨城的主备集群数据同步,有了主备集群,一是可以将部分不需要太实时的读取流量切到备用集群,来缓解主TIDB集群的读取压力。二是一旦核心机房有问题,备用集群就可以立即接管服务,因为经过了ticdc这层同步中间件,所以RPO受主库写入情况,以及ticdc sink速度的限制,存在 RPO!=0的情况,RTO肯定是能做到小于30s的,因为这个只是探测和切换的时间是由自动脚本或者监控来控制,所以可以实现主集群不可用时的及时切换。

PS:本文主要讲基于Placement-rule的多中心方案,所以这种“异步复制”的ticdc工具就不展开讲了,如果大家有想对TiCDC更加深入的了解,去年我写过一篇:​​TiCDC应用场景解析​​ 的文章,大家可以跳转详细看看。

下面要讲的几套多城多活方案,都是基于Placement-Rule配置实现的同一套TiDB跨多城/多数据中心的部署架构。

同城双中心

其实在TiDB 4.0版本就出现了使用Placement rule来配置的集群(这套同城双中心的方案官方没有放出来),不过在TiDB的5.4版本出现了一种基于自适应同步(即 Data Replication Auto Synchronous,简称 DR Auto-Sync)同城两中心部署方案,下面主要介绍下这个自适应同步方案架构。

部署架构

通过查看上面的集群部署架构图:

(1)这套架构将一套TiDB集群部署在同一个城市的2个IDC机房(注意要满足硬性要求),一个是主数据中心(PRIMAY IDC),一个是从数据中心(DR DC)

(2)集群采用 4 副本模式,其中主数据中心放 2 个 Voter 副本,从数据中心中放 1 个 Voter 副本 + 1 个 Learner 副本,也就是3个voter和1个没有投票资格的Learner,并且Leader在主数据中心

(3)自适应同步,TIDB集群的复制模式可以自动在sync/async/sync-recover三种状态之间自适应切换。

在默认的同步模式(sync)下,Raft来保证从数据中心中至少有一个副本保持跟主数据中心同步,这样的情况下,如果主数据中心不可用(2个 Voter 都不可用),这时raft是没法选出 Leader的,这至少数据不丢(RPO=0),因为从数据中心有最新的数据,只是如果要把从数据中心当作新主来使用时需要tikv-ctl来恢复,这个时候恢复时间就不好评估了(RTO>N),关于如何恢复?参考我之前的写过的:​​TiDB集群恢复之TiKV集群不可用​​。如果从机房网络故障时,超过PD参数wait-store-timeout(默认60s),主从中心间的数据同步就会切换到async(异步复制模式),在这种情况下,raft算法优先保证主数据中心的2个副本写入(Voter的多数派写入成功,事务可以提交),从数据中心靠异步复制获取的不是最新的数据。这是主机房读写都正常(RPO=0 & RTO=0)当从机房网络故障恢复时,主从数据中心的同步由异步切换到sync-recover(恢复同步),此时不保证 DR 与 PRIMARY 完全同步,随着恢复的进行,从region会不断的将状态汇报给 PD,当 TiKV 的所有 Region 都完成了同步复制模式的切换,PD 将集群复制状态切换为 sync。

特点:

(1)同城双中心,在同步模式下能实现RPO=0,如果从数据中心不可用,不影响(RTO=0)

(2)在非同步模式下,如果主数据中心不可用,不能实现RPO=0,RTO也不可控可能分钟或者小时,需要tikv-ctl工具来操作将从数据中心多久提升为主数据中心。

同城三中心

同城三中心方案应该是当前最常规的高可用方案,需要同城有三个机房或者云厂商的三个可用区,数据中心间的数据同步通过内部的raft复制协议完成。同城三数据中心可同时对外进行读写服务,实现了任意中心发生故障不影响可用性。

简易架构图

通过查看上面的集群部署架构图:

(1)这套架构将一套TiDB集群部署在同一个城市的3个IDC机房,所有数据中心都有tidb/pd/tikv,所有的数据中心都可以接受读写服务。

(2)集群采用默认 3 副本即可,并且3个数据中心都有region的Leader/Follower副本。基于raft的多数派写入逻辑,至少有2个数据中心有最新的数据,所以任何一个数据中心不可用,不会产生任何数据丢失 (RPO = 0),但是在不可用数据中心的Leader副本会触发raft的leader选举,该选举新Leader有一定的时间,差不多在在30s内,所以RTO<30s。

(3)该架构受机房间网络的速率、稳定性等硬性条件关联紧密,比较适合读多写少,或者对写入不“敏感”的业务。就算数据中心延迟稳定在1.5ms内,数据写入需要保证多数派写入的情况下,肯定会发生跨数据中心的写入,这时写入延迟肯定大于基本的网络延迟:1.5*2=3ms,所以写入敏感的业务慎用;对于读取场景,如果请求的region leader在另外的数据中心,也会受网络延迟影响,读取按照具体的业务场景也可以选择follower/steal read。

集群架构特点:

所有数据的副本分布在三个数据中心,具备高可用和容灾能力,读写性能受数据中心之间网络延迟的影响较大,所以同城三中心的架构需要适配具体的业务场景来应用。

两地三中心

两地三中心是以本地的2个读写数据中心、异地灾备中心的高可用容灾方案,相比同城多中心方案,两地三中心可以应对城市级自然灾害,具有跨城级高可用能力。

下图为集群部署架构图,具体如下:

通过查看上面的集群部署架构图:

(1)集群采用两地三中心部署方式,分别为北京 IDC1机房(本地读写机房),北京 IDC2机房(本地读写机房),西安 IDC3机房(异地灾备机房);所有数据中心都部署tidb/pd/tikv。

(2)集群采用 5 副本模式,其中 IDC1 和 IDC2 分别放 2 个副本,IDC3 放 1 个副本,可以通过PD调度实现所有的Leader region都在北京的2个读写数据中心,所以读写都在北京本地,读写性能跟同城三中心类似,取决于数据中心间的网络情况,西安的数据中心只有follower节点,还保留了一份异步的数据。

(3)副本间通过 Raft 协议保证数据的一致性和高可用,对用户完全透明。

集群架构特点:

(1)本地两中心可同时对外提供服务,资源利用率更高。

(2)可保证任一数据中心失效后,不发生数据丢失(RPO=0),可用性也可以在分钟级别恢复(RTO分钟级)。

(3)如果本地两中心不可用,那就剩下西安的数据中心,由于raft的配置,西安的数据中心可能没有获取到最新的数据,也就是说不能保证RPO=0,因为多数的副本不可用,集群不可用,所以RTO的时间也是借助tikv-ctl实现数据恢复后的总时长。

(4)两地三中心需设置 5 副本,数据冗余度增加,增加硬盘空间成本。

总结

如果只有同城双机房,本人使用过基于ticdc的主备方案,真正意义上的多活,还是同城三中心。

注:本文主要参考TiDB集群已有方案,文中多图都来自于tidb官网

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Python weppy- 全栈的 Python Web 框架
下一篇:Hibernate OGM- NoSQL的持久层框架
相关文章

 发表评论

暂时没有评论,来抢沙发吧~