tidb-in-action

1.2.3.2.1 集群环境资源需求

本文介绍在 Kubernetes 上部署 TiDB 集群的软硬件环境需求。

1. 软件版本要求

软件名称 版本
Docker Docker CE 18.09.6
Kubernetes v1.12.5+
CentOS CentOS 7.6,内核要求为 3.10.0-957 或之后版本

2. 内核参数设置

配置项 设置值
net.core.somaxconn 32768
vm.swappiness 0
net.ipv4.tcp_syncookies 0
net.ipv4.ip_forward 1
fs.file-max 1000000
fs.inotify.max_user_watches 1048576
fs.inotify.max_user_instances 1024
net.ipv4.conf.all.rp_filter 1
net.ipv4.neigh.default.gc_thresh1 80000
net.ipv4.neigh.default.gc_thresh2 90000
net.ipv4.neigh.default.gc_thresh3 100000

同时还需要关闭每个部署 Kubernetes 节点的 swap,执行如下命令:

swapoff -a

执行如下命令检查 swap 是否已经关闭:

free -m

如果执行命令后输出显示 swap 一列全是 0,则表明 swap 已经关闭。

此外,为了永久性地关闭 swap,还需要将 /etc/fstab 中 swap 相关的条目全部删除。

在上述内容都设置完成后,还需要检查是否给机器配置了 SMP IRQ Affinity,也就是将各个设备对应的中断号分别绑定到不同的 CPU 上,以防止所有中断请求都落在同一个 CPU 上而引发性能瓶颈。对于 TiDB 集群来说,网卡处理包的速度对集群的吞吐率影响很大。因此下文主要描述如何将网卡中断号绑定到特定的 CPU 上,充分利用多核的优势来提高集群的吞吐率。首先可以通过以下命令来查看网卡对应的中断号:

cat /proc/interrupts|grep <iface-name>|awk '{print $1,$NF}'

以上命令输出的第一列是中断号,第二列是设备名称。如果是多队列网卡,上面的命令会显示多行信息,网卡的每个队列对应一个中断号。通过以下命令可以查看该中断号被绑定到哪个 CPU 上:

cat /proc/irq/<ir_num>/smp_affinity

上面命令输出 CPU 序号对应的十六进制值。输出结果欠直观。具体计算方法可参见 SMP IRQ Affinity 文档。

cat /proc/irq/<ir_num>/smp_affinity_list

上面命令输出 CPU 序号对应的十进制值,输出结果较为直观。

如果多队列网卡对应的所有中断号都已被绑定到不同的 CPU 上,那么该机器的 SMP IRQ Affinity 配置是正确的。如果中断号都落在同一个 CPU 上,则需要进行调整。调整的方式有以下两种:

上文所描述的是处理多队列网卡和多核心的场景。单队列网卡和多核的场景则有不同的处理方式。在这种场景下,可以使用 RPS/RFS 在软件层面模拟实现硬件的网卡多队列功能 (RSS)。此时不能使用方法一所述的 irqbalance 服务,而是通过使用方法二提供的脚本来设置 RPS。RFS 的配置可以参考这里

3. 硬件和部署要求

与使用 binary 方式部署 TiDB 集群一致,要求选用 Intel x86-64 架构的 64 位通用硬件服务器,使用万兆网卡。关于 TiDB 集群在物理机上的具体部署需求,参考 TiDB 软件和硬件环境建议配置

对于服务器 disk、memory、CPU 的选择要根据对集群的容量规划以及部署拓扑来定。线上 Kubernetes 集群部署为了保证高可用,一般需要部署三个 master 节点、三个 etcd 节点以及若干个 worker 节点。同时,为了充分利用机器资源,master 节点一般也充当 worker 节点(也就是 master 节点上也可以调度负载)。通过 kubelet 设置预留资源来保证机器上的系统进程以及 Kubernetes 的核心进程在工作负载很高的情况下仍然有足够的资源来运行,从而保证整个系统的稳定。

下面按 3 Kubernetes master + 3 etcd + 若干 worker 节点部署方案进行分析。Kubernetes 的多 master 节点高可用部署可参考官方文档

4. Kubernetes 系统资源要求

5. TiDB 集群资源需求

TiDB 分布式数据库由 PD、TiKV、TiDB 三个组件组成,在做容量规划的时候一般按照可以支持多少套 TiDB 集群来算。这里按照标准的 TiDB 集群(3 个 PD + 3 个 TiKV + 2 个 TiDB)来算,下面是对每个组件规划的一种建议:

6. TiDB 集群规划示例

通过上面的分析,这里给出一个支持部署 5 套规模为 3 个 PD + 3 个 TiKV + 2 个 TiDB 集群的例子,其中 PD 配置为 2C 4GB,TiDB 配置为 8C 32GB,TiKV 配置为 8C 32GB。Kubernetes 节点有 7 个,其中有 3 个节点既是 master 又是 worker 节点,另外 4 个是纯 worker 节点。各节点上部署组件情况如下:

从上面的分析来看,要支持 5 套 TiDB 集群容量共需要 7 台物理机,其中 3 台为 master 兼 worker 节点,其余 4 台为 worker 节点,机器配置需求如下:

使用上面的机器配置,除去各个组件占用的资源外,还有比较多的预留资源。如果要考虑加监控和日志组件,则可以用同样的方法去规划需要采购的机器类型以及配置。

另外,在生产环境的使用上尽量不要在 master 节点部署 TiDB 实例,或者尽可能少地部署 TiDB 实例。这里的主要考虑点是网卡带宽,因为 master 节点网卡满负荷工作会影响到 worker 节点和 master 节点之间的心跳信息汇报,导致比较严重的问题。