[转帖]三节点混合部署的最佳实践

节点,混合,部署,最佳,实践 · 浏览次数 : 0

小编点评

## TiDB 三台混合部署建议 **概述:** * 在性能要求不高且需要控制成本的场景下,可以考虑混合部署 TiDB、TiKV 和 PD。 * 本文以 TPC-C 5000 Warehouse 数据为测试用例,展示了在三台物理机上混合部署 TiDB、TiKV 和 PD 的参数调整建议。 **主要参数调整:** 1. **readpool.unified.max-thread-count:** 控制了读取线程池的大小,在混合部署中需要根据可用资源调整该值。 2. **server.grpc-concurrency:** 控制了 grpc 连接线程的数量,在混合部署中可通过设置多个 grpc 进程来提高性能。 3. **storage.scheduler-worker-pool-size:** 控制了 TiKV 后台任务的并发数量,需要根据机器 CPU 数进行限制。 4. **gc.max_write_bytes_per_sec:** 限制了后台 compaction 任务的磁盘流量,在混合部署中可通过调整该值来避免性能抖动。 5. **tidb_hash_join_concurrency、tidb_index_lookup_join_concurrency:** 控制了 Go 进程中的 hash 和索引查找并发数量,需要根据性能需求进行调整。 **其他建议:** * 在配置参数之前,建议先进行性能测试,以确定最适合的设置值。 * 可通过监控集群性能,实时调整参数以优化性能。 **注意:** * 此建议仅供参考,具体参数的设置需要根据实际场景进行调整。 * 在进行参数调整之前,请确保备份配置文件,以防意外丢失。

正文

https://docs.pingcap.com/zh/tidb/stable/three-nodes-hybrid-deployment#%E5%8F%82%E6%95%B0%E8%B0%83%E6%95%B4

 

在对性能要求不高且需要控制成本的场景下,将 TiDB、TiKV、PD 混合部署在三台机器上是一个可行的方案。

本文以 TPC-C 作为工作负载,提供一些在三节点混合部署场景下部署和参数调整的建议。

部署环境和测试方法

三台物理机,每台机器有 16 个 CPU 核心且内存为 32 GB。每节点(台机器)上混合部署 1 TiDB (实例)+ 1 TiKV (实例)+ 1 PD(实例)。

由于 PD 和 TiKV 都会存储信息到磁盘,磁盘的写入读取延迟会直接影响到 PD 和 TiKV 的服务延迟,为了防止 PD 和 TiKV 对磁盘资源的争抢导致相互影响,推荐 PD 和 TiKV 采用不同的磁盘。

在 TiUP bench 中使用 TPC-C 5000 Warehouse 数据,每次以 terminals 参数为 128 的并发度测试 12 小时。主要观察集群性能的稳定性指标。

下图是默认参数配置下,12 小时内集群的 QPS 监控,可以看倒有比较明显的抖动。

QPS with default config

调整参数后,稳定性得到了改善。

QPS with modified config

参数调整

上图中出现抖动的主要原因是,默认的线程池和后台任务资源分配针对的是资源比较充足的机器。在混合部署的场景下,因为可用资源需要被多个组件共享,所以需要通过配置参数进行限制。

本次测试最终采用的配置如下:

tikv: readpool.unified.max-thread-count: 6 server.grpc-concurrency: 2 storage.scheduler-worker-pool-size: 2 gc.max-write-bytes-per-sec: 300K rocksdb.max-background-jobs: 3 rocksdb.max-sub-compactions: 1 rocksdb.rate-bytes-per-sec: “200M” tidb: performance.max-procs: 8

接下来会分别介绍这几个参数的意义和调整方法。

TiKV 线程池大小配置

本节的配置项会调整一些与前台业务有关的线程池的资源配比。缩减这些线程池会损失一些性能,但在混合部署场景下可用资源有限,本身也难以达到很高的性能,所以选择牺牲一小部分性能去换取整体的稳定性。

可以先以默认配置为基础运行一次实际负载的测试,观察各线程池的实际使用量,再修改这些配置项,缩减利用率不高的线程池大小。

readpool.unified.max-thread-count

该参数默认取值为机器线程数的 80%,因为是混合部署场景,你需要手动计算并指定该值。可以先设置成期望 TiKV 使用的 CPU 线程数的 80%。

server.grpc-concurrency

该参数默认为 4。因为现有部署方案的 CPU 资源有限,实际请求数也不会很多。可以把该参数值调低,后续观察监控面板保持其使用率在 80% 以下即可。

本次测试最后选择设置该参数值为 2,通过 gRPC poll CPU 面板观察,利用率正好在 80% 左右。

gRPC Pool CPU

storage.scheduler-worker-pool-size

在 TiKV 检测到机器 CPU 数大于或等于 16 时,该参数值默认为 8。CPU 数小于 16 时,该参数值默认为 4。它主要用于将复杂的事务请求转化为简单的 key-value 读写。但是 scheduler 线程池本身不进行任何写操作。

一般来说该线程池的利用率保持在 50% - 75% 之间是比较好的。和 gRPC 线程池情况类似,混合部署时该参数默认取值偏大,资源利用不充分。本次测试最后选择取值为 2,通过 Scheduler worker CPU 面板观察,利用率比较符合最佳实践。

Scheduler Worker CPU

TiKV 后台任务资源配置

除前台任务之外,TiKV 上还会持续地有后台任务进行数据整理和过期数据的清除。默认配置为这些后台任务分配了比较多的资源以应对大流量的写入。

混合部署场景下,默认配置就不是很合适了,需要通过以下参数对这些后台任务地资源使用量进行限制。

rocksdb.max-background-jobs 和 rocksdb.max-sub-compactions

RocksDB 线程池是进行 Compact 和 Flush 任务的线程池,默认大小为 8。这明显超出了实际可以使用的资源,需要限制。rocksdb.max-sub-compactions 是单个 compaction 任务的子任务并发数,默认值为 3,在写入流量不大的情况下可以进行限制。

这次测试最终将 rocksdb.max-background-jobs 设置为 3,将 rocksdb.max-sub-compactions 设置为 1。在 12 小时的 TPC-C 负载下没有发生 Write Stall,根据实际负载进行这两项参数的优化时,可以逐步调低这两个配置,并通过监控观察。

  • 如果遇到了 Write Stall,可以先调大 rocksdb.max-background-jobs 的取值。
  • 如果还是存在问题,可将 rocksdb.max-sub-compactions 设置为 2 或者 3。

rocksdb.rate-bytes-per-sec

该参数用于限制后台 compaction 任务的磁盘流量。默认配置下没有进行任何限制。为了避免 compaction 挤占前台服务资源,可以根据硬盘的顺序读写速度进行调整,为正常的服务保留足够多的磁盘带宽。

类似 compaction 线程池的调整方法,调整该参数值后,也根据是否存在 Write Stall 来判断取值是否合理。

gc.max_write_bytes_per_sec

因为 TiDB 使用的是 MVCC 的模型,TiKV 还需要周期性地在后台清除旧版本的数据。当可用资源有限的时候,这个操作会引起周期性的性能抖动。可以用 gc.max_write_bytes_per_sec 来限制这一操作的资源使用。

GC Impact

除了在配置文件中设置该参数之外,还可以通过 tikv-ctl 动态调节,为调整该参数提供便利:

tiup ctl:v<CLUSTER_VERSION> tikv --host=${ip:port} modify-tikv-config -n gc.max_write_bytes_per_sec -v ${limit}
 
注意

对于更新频繁的业务场景,限制 GC 流量可能会导致 MVCC 版本堆积,进而影响读取性能。所以这个参数的取值需要进行多次尝试,在性能抖动和性能衰退之间找一个比较平衡的取值。

TiDB 参数调整

一般通过系统变量调整 TiDB 执行算子的优化参数,例如 tidb_hash_join_concurrencytidb_index_lookup_join_concurrency 等。

本测试中没有对这些参数进行调整。如果实际的业务负载测试中,出现执行算子消耗过多 CPU 资源的情况,可以针对业务场景对特定的算子资源使用量进行限制。这部分内容可以参考 TiDB 系统变量文档

performance.max-procs

该参数控制着整个 Go 进程能使用的 CPU 核心数量,默认情况下为当前机器或者 cgroups 的 CPU 数量。

Go 运行时会定期使用一定比例的线程进行 GC 等后台工作。在混合部署模式下,如果不对这一参数进行限制,GC 等后台操作会过多占用 CPU 资源。

与[转帖]三节点混合部署的最佳实践相似的内容:

[转帖]三节点混合部署的最佳实践

https://docs.pingcap.com/zh/tidb/stable/three-nodes-hybrid-deployment#%E5%8F%82%E6%95%B0%E8%B0%83%E6%95%B4 在对性能要求不高且需要控制成本的场景下,将 TiDB、TiKV、PD 混合部署在三台机

[转帖]zookeeper三节点集群搭建

https://www.jianshu.com/p/1dcfbf45383b 下载zookeeper Apache源 http://archive.apache.org/dist/zookeeper/zookeeper-3.4.7/ wget http://archive.apache.org/di

[转帖]Redis 7.0 三节点哨兵(Sentinel)高可用 环境搭建手册

2022-06-17 16:253480原创Redis 本文链接:https://www.cndba.cn/dave/article/108088 1 哨兵高可用架构说明 Redis 最早的高可用方案是主从复制,但这种方案存在一个问题,就是当主库宕机后,从库不会自动切成主库,需要人工干预。 所有在主

[转帖]consul 多节点/单节点集群搭建

https://www.cnblogs.com/valiantjiang/p/15004565.html 三节点配置 下载安装包 mkdir /data/consul mkdir /data/consul/data curl -SLO https://github.com/consul/1.9.5/

[转帖]Kafka高可用 — KRaft集群搭建

Apache Kafka Raft 是一种共识协议,它的引入是为了消除 Kafka 对 ZooKeeper 的元数据管理的依赖,被社区称之为 Kafka Raft metadata mode,简称 KRaft 模式。本文介绍了KRaft模式及三节点的 KRaft 集群搭建。 1 KRaft介绍 KR

[转帖]Kafka高可用 — KRaft集群搭建

Apache Kafka Raft 是一种共识协议,它的引入是为了消除 Kafka 对 ZooKeeper 的元数据管理的依赖,被社区称之为 Kafka Raft metadata mode,简称 KRaft 模式。本文介绍了KRaft模式及三节点的 KRaft 集群搭建。 1 KRaft介绍 KR

[转帖]Linux 调优篇:虚拟化调优(hugepage 大页内存)* 叁

一. 大页(HugePages)概念 Hugepage的引入二. hugepages相关概念三.Regular Pages 与 HugePages a、Regular Pages b、Huge Pages四. hugepage 优点五.调优方法 5.1 在Host侧查看各个numa节点上的大页分配情

【转帖】Linux 调优篇:虚拟化调优(hugepage 大页内存)* 叁

一. 大页(HugePages)概念 Hugepage的引入二. hugepages相关概念三.Regular Pages 与 HugePages a、Regular Pages b、Huge Pages四. hugepage 优点五.调优方法 5.1 在Host侧查看各个numa节点上的大页分配情

[转帖]国产服务器CPU架构与行业研究报告(节选三)

https://zhuanlan.zhihu.com/p/510768926 ​ 已认证帐号 已关注 2 人赞同了该文章 目录 1 服务器与CPU技术综述1.1 服务器综述1.1.1 服务器的发展历史1.1.2 服务器的组成1.1.3 服务器的分类1.1.4 服务器集群与冗余技术1.1.5 虚拟化技

[转帖]服务端性能测试

https://www.jianshu.com/p/b192fda09c02 一、软件性能测试目标 软件性能测试的目的主要有以下三点: 1. 评价系统当前性能,判断系统是否满足预期的性能需求。 2. 寻找软件系统可能存在的性能问题,定位性能瓶颈并解决问题。 3. 判定软件系统的性能表现,预见系统负载