跨越大陆边界的 TiDB 分布式设置

distributed setup for TiDB over continental borders

我们计划在欧洲和澳大利亚使用 TiDB 进行分布式设置。

有没有人对这种分布式设置有一些经验?

这里是 TiDB 开发者。

根据您的描述,您的场景是long-distancecross-data中心场景。在这种情况下,您需要了解在这种部署中您的读写延迟将在很大程度上取决于数据中心之间的延迟。

一个比较合理的部署是,如果你的工作负载主要在欧洲,同时需要强一致性和高可用,那么可以选择欧洲2个IDC,澳大利亚1个IDC来部署TiDB,并且您的应用程序应该部署在欧洲。因为对于 TiDB 来说,一次写入需要大部分副本都写入成功。该场景下写延迟为:

latency = min(latency(IDC1, IDC2), latency(IDC2, IDC3), latency(IDC1, IDC3)) 

以下是针对不同场景的一些部署建议和比较:

1. 3-DC部署解决方案

TiDB、TiKV、PD分布在3个DC中

优点:
所有副本分布在 3 个 DC 中。即使一个 DC 宕机,其他 2 个 DC 也会在合理的时间内(大多数情况下在 20s 内)发起 leader 选举并恢复服务,并且不会丢失数据。有关详细信息,请参见下图:

缺点:
性能受到网络延迟的极大限制。
对于写入,所有数据都必须复制到至少 2 个数据中心。因为 TiDB 使用 2-phase commit 写,写延迟至少是两个 DC 之间网络延迟的两倍。
如果 leader 与发出读请求的 TiDB 节点不在同一个 DC 中,读性能也会受到影响。
每个 TiDB 事务都需要从 PD leader 获取 TimeStamp Oracle (TSO)。所以如果 TiDB 和 PD leader 不在同一个数据中心,事务的性能也会受到网络延迟的影响,因为每个有写请求的事务都必须获得两次 TSO。

优化:
如果不是三个 DC 都需要为应用程序提供服务,可以将所有请求分派到一个 DC,并配置调度策略将所有 TiKV Region leader 和 PD leader 迁移到同一个 DC,就像我们在下面的测试。这样无论是获取 TSO 还是读取 TiKV Region 都不会受到 DC 之间网络延迟的影响。如果这个DC宕机了,PD leader和Region leader会在其他存活的DC中自动选举出来,你只需要将请求切换到仍然在线的DC上即可。

2。 2城3DC部署方案
该方案与之前的3-DC部署方案类似,可以认为是基于业务场景的优化。不同的是,同城2个数据中心之间距离较近,延迟很低。在这种情况下,我们可以将请求分派到同城的两个 DC,并配置 TiKV leader 和 PD leader 在同城的 2 个 DC。

与3-DC部署相比,2城3-DC部署有以下优势:

  1. 更好的写入性能
  2. 更好地利用资源,因为 2 个 DC 可以为应用程序提供服务。
  3. 即使一台DC宕机,TiDB集群依然可用,不会丢失数据。

但是缺点是如果同城2个DC宕机,概率比2城2个DC宕机的概率高,TiDB集群不可用,部分数据会迷路。

3。 2-DC+Binlog同步部署方案

2-DC+Binlog同步与MySQLMaster-Slave方案类似。 2 套完整的 TiDB 集群(每套 TiDB 集群包括 TiDB、PD 和 TiKV)部署在 2 个数据中心,一个作为 Master,一个作为 Slave。一般情况下,Master DC处理所有请求,写入Master DC的数据通过Binlog异步写入Slave DC。

如果Master DC宕机,请求可以切换到slave集群。类似于MySQL,一些数据可能会丢失。但与MySQL不同的是,该方案可以保证同一个数据中心内的高可用:如果数据中心内部分节点宕机,不会影响在线业务,不需要人工操作,因为集群会自动re-elect领导提供服务

我们的一些生产用户也采用了 2-DC multi-active 解决方案,这意味着:

  1. 应用请求被分离并分派到2个DC。
  2. 每个 DC 有 1 个集群,每个集群有两个数据库:一个 Master 数据库服务于部分应用程序请求,一个 Slave 数据库服务于一个t 作为其他 DC 的 Master 数据库的备份。写入Master数据库的数据通过Binlog同步到另一台DC的Slave数据库,形成备份循环。

请注意,对于2-DC+Binlog同步方案,数据是通过Binlog异步复制的。如果2个DC之间的网络延迟过高,Slave集群中的数据会远远落后于Master集群。如果Master集群宕机,会丢失部分数据,不能保证5分钟内丢失数据。

HA 和 DR 的总体分析

对于3-DC部署方案和3-DC in 2 cities方案,我们可以保证集群自动恢复,无需人为干预,数据强一致,即使3中任意一个DC下降。所有的调度策略都是为了调整性能,但在发生中断的情况下,可用性是第一优先级而不是性能。

对于2-DC+Binlog同步的方案,我们可以保证集群自动恢复,不需要人为干预,即使Master集群内的部分节点宕机,数据也是强一致的。当整个Master集群宕机时,需要手动切换到Slave,部分数据会丢失。丢失的数据量取决于网络延迟,由网络状况决定。

关于如何实现高性能的建议

如前所述,在 3-DC 场景中,网络延迟对性能非常关键。由于延迟高,一个事务(10读1写)需要100ms,单线程只能达到10TPS。

这个table是我们Sysbench测试的结果(3个IDC,2个US-West和1个US-East):

| threads |     tps |      qps |
|--------:|--------:|---------:|
|       1 |    9.43 |   122.64 |
|       4 |   36.38 |   472.95 |
|      16 |  134.57 |  1749.39 |
|      64 |  517.66 |  6729.55 |
|     256 | 1767.68 | 22979.87 |
|     512 | 2307.36 | 29995.71 |
|    1024 | 2406.29 | 31281.71 |
|    2048 | 2256.27 | 29331.45 |

相对于之前推荐的将 TiKV Region leader 调度在一个 DC 内的部署,PD leader 的优先级设置 pd-ctl member leader_priority pd1 2 将 PD leader 设置在同一个 DC 内TiKV Region leader,避免获取 TSO 的网络延迟过高。

基于此,我们得出结论,如果你想要更高的 TPS,你应该在你的应用程序中使用更多的并发。

我们推荐以下解决方案:

  1. 添加更多具有相同配置的 TiDB 实例以进一步测试以利用 TiDB 的可扩展性。
  2. 为避免 cross-DC 事务提交请求导致的性能损失,考虑将每个事务的工作负载从 10 reads + 1 write 更改为 100 reads + 10 writes 以获得更高的 QPS。

关于HA的问题,答案是leader的DC挂了,不需要人工操作。这是因为即使 Leader 的 DC 发生故障并且 Leader 被锁定在一个 DC 中,由于 Raft 共识算法,大多数副本仍然存活并且在失败后会选举一个新的 Leader。这个过程是自动的,不需要人工干预。该服务仍然可用,不会受到影响,只是性能略有下降。