Skip to content

TiDB 操作系统配置

TiDB 是一个分布式数据库,运行在 Linux 操作系统上。为了确保 TiDB 集群的性能和稳定性,需要对操作系统进行合理的配置和优化。本章将介绍 TiDB 运行环境的操作系统配置建议。

系统要求

1. 操作系统版本

TiDB 支持以下 Linux 操作系统版本:

  • CentOS / RHEL:7.3 及以上版本
  • Ubuntu:16.04 及以上版本
  • Debian:9.0 及以上版本
  • SUSE Linux Enterprise Server:15 及以上版本

2. 硬件要求

根据 TiDB 组件的不同,硬件要求也有所不同:

组件CPU内存磁盘网络
TiDB8 核+16 GB+SSD(200 GB+)千兆网卡+
TiKV8 核+32 GB+SSD(500 GB+)千兆网卡+
PD4 核+8 GB+SSD(100 GB+)千兆网卡+
TiFlash16 核+64 GB+SSD(1 TB+)万兆网卡+

内核参数配置

1. 基础内核参数

以下是 TiDB 集群推荐的基础内核参数配置:

bash
# 编辑 /etc/sysctl.conf 文件
cat << EOF >> /etc/sysctl.conf
# 网络相关
net.core.somaxconn = 32768
net.core.netdev_max_backlog = 16384
net.core.rmem_default = 8388608
net.core.wmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_slow_start_after_idle = 0

# 文件系统相关
fs.file-max = 1000000

# 内存相关
vm.swappiness = 0
vm.overcommit_memory = 1
EOF

# 应用配置
sysctl -p

2. TiKV 专用内核参数

对于 TiKV 节点,还需要配置以下专用内核参数:

bash
cat << EOF >> /etc/sysctl.conf
# TiKV 专用配置
vm.max_map_count = 1048576
vm.dirty_background_ratio = 5
vm.dirty_ratio = 10
vm.dirty_writeback_centisecs = 500
vm.dirty_expire_centisecs = 5000
EOF

# 应用配置
sysctl -p

3. 内核参数说明

参数说明推荐值
net.core.somaxconn套接字监听队列的最大长度32768
net.core.netdev_max_backlog网络设备接收队列的最大长度16384
net.ipv4.tcp_syncookies启用 SYN cookies,防止 SYN 洪水攻击1
net.ipv4.tcp_fin_timeoutTCP 连接关闭超时时间30
net.ipv4.tcp_keepalive_timeTCP 连接保活时间1200
fs.file-max系统允许打开的最大文件句柄数1000000
vm.swappiness内存交换策略,0 表示尽量不使用交换分区0
vm.overcommit_memory内存过量分配策略,1 表示允许过量分配1
vm.max_map_count进程允许的最大内存映射区域数量1048576
vm.dirty_background_ratio后台写脏页的内存百分比阈值5
vm.dirty_ratio强制写脏页的内存百分比阈值10

文件系统配置

1. 文件系统选择

TiDB 推荐使用以下文件系统:

  • XFS:推荐用于 TiKV 和 PD 节点,性能稳定,支持大文件
  • EXT4:兼容广泛,性能良好,适合 TiDB 节点

2. 文件系统挂载选项

以下是推荐的文件系统挂载选项:

bash
# 编辑 /etc/fstab 文件
/dev/sdb1 /data xfs defaults,noatime,nodiratime,nobarrier,logbufs=8,logbsize=256k 0 0

3. 文件系统挂载选项说明

选项说明
defaults使用默认挂载选项
noatime不更新文件访问时间
nodiratime不更新目录访问时间
nobarrier关闭写屏障,提高写入性能(仅 SSD 推荐)
logbufs=8设置日志缓冲区数量为 8
logbsize=256k设置日志缓冲区大小为 256k

资源限制配置

1. 文件句柄限制

TiDB 集群需要大量的文件句柄,需要调整系统和用户的文件句柄限制:

bash
# 编辑 /etc/security/limits.conf 文件
cat << EOF >> /etc/security/limits.conf
* soft nofile 1000000
* hard nofile 1000000
* soft stack 8192
* hard stack 8192
EOF

# 编辑 /etc/security/limits.d/20-nproc.conf 文件
cat << EOF >> /etc/security/limits.d/20-nproc.conf
* soft nproc unlimited
EOF

2. 进程数限制

调整系统的最大进程数限制:

bash
cat << EOF >> /etc/sysctl.conf
kernel.pid_max = 4194303
EOF

# 应用配置
sysctl -p

网络配置

1. 网络接口配置

确保网络接口配置正确,启用全双工模式:

bash
# 使用 ethtool 查看网络接口状态
ethtool eth0

# 启用全双工模式
ethtool -s eth0 duplex full speed 1000

2. 关闭防火墙

在生产环境中,建议关闭防火墙或配置适当的防火墙规则:

bash
# 关闭 firewalld(CentOS 7+)
systemctl stop firewalld
systemctl disable firewalld

# 关闭 iptables(CentOS 6)
service iptables stop
chkconfig iptables off

3. 关闭 SELinux

在生产环境中,建议关闭 SELinux:

bash
# 临时关闭 SELinux
setenforce 0

# 永久关闭 SELinux(编辑 /etc/selinux/config 文件)
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

时间同步配置

1. 安装 NTP 服务

确保集群中所有节点的时间同步:

bash
# 安装 chrony(推荐)
yum install -y chrony

# 或安装 ntpd
yum install -y ntp

2. 配置 NTP 服务

编辑 NTP 配置文件,添加可靠的 NTP 服务器:

bash
# 编辑 /etc/chrony.conf 文件
cat << EOF >> /etc/chrony.conf
server ntp1.aliyun.com iburst
server ntp2.aliyun.com iburst
server ntp3.aliyun.com iburst
EOF

# 启动 chrony 服务
systemctl start chronyd
systemctl enable chronyd

# 验证时间同步状态
chronyc sources -v

磁盘配置

1. 磁盘分区

对于 TiKV 节点,建议将数据目录单独挂载到 SSD 磁盘上:

bash
# 使用 fdisk 分区
sudo fdisk /dev/sdb

# 格式化磁盘
sudo mkfs.xfs /dev/sdb1

# 创建挂载目录
sudo mkdir -p /data

# 挂载磁盘
sudo mount /dev/sdb1 /data

# 添加到 /etc/fstab
echo "/dev/sdb1 /data xfs defaults,noatime,nodiratime,nobarrier,logbufs=8,logbsize=256k 0 0" | sudo tee -a /etc/fstab

2. 磁盘调度器

对于 SSD 磁盘,建议使用 nonemq-deadline 调度器:

bash
# 临时设置调度器
echo none > /sys/block/sdb/queue/scheduler

# 永久设置调度器(编辑 /etc/udev/rules.d/60-scheduler.rules 文件)
cate << EOF >> /etc/udev/rules.d/60-scheduler.rules
ACTION=="add|change", KERNEL=="sd*", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="none"
EOF

3. 磁盘性能测试

使用 fio 工具测试磁盘性能:

bash
# 安装 fio
yum install -y fio

# 测试随机写性能
fio -name=randwrite -direct=1 -iodepth=64 -rw=randwrite -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=60 -group_reporting -filename=/data/test

# 测试顺序写性能
fio -name=seqwrite -direct=1 -iodepth=64 -rw=write -ioengine=libaio -bs=128k -size=1G -numjobs=1 -runtime=60 -group_reporting -filename=/data/test

# 测试随机读性能
fio -name=randread -direct=1 -iodepth=64 -rw=randread -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=60 -group_reporting -filename=/data/test

# 清理测试文件
rm /data/test

系统服务配置

1. 关闭不必要的服务

关闭不必要的系统服务,释放系统资源:

bash
# 关闭 postfix
systemctl stop postfix
systemctl disable postfix

# 关闭 cups
systemctl stop cups
systemctl disable cups

# 关闭 avahi-daemon
systemctl stop avahi-daemon
systemctl disable avahi-daemon

2. 配置系统日志

调整系统日志配置,避免日志占用过多磁盘空间:

bash
# 编辑 /etc/rsyslog.conf 文件
cat << EOF >> /etc/rsyslog.conf
# 限制日志大小
$MaxMessageSize 10240

# 配置日志轮转
$FileCreateMode 0644
$DirCreateMode 0755
$Umask 0022
EOF

# 重启 rsyslog 服务
systemctl restart rsyslog

监控和告警

1. 安装监控工具

安装必要的监控工具,便于监控系统状态:

bash
# 安装 sar
yum install -y sysstat

# 安装 iotop
yum install -y iotop

# 安装 htop
yum install -y htop

# 安装 dstat
yum install -y dstat

2. 配置系统监控

启用 sysstat 服务,收集系统性能数据:

bash
# 编辑 /etc/sysconfig/sysstat 文件
cat << EOF >> /etc/sysconfig/sysstat
HISTORY=7
INTERVAL=10
EOF

# 启动 sysstat 服务
systemctl start sysstat
systemctl enable sysstat

安全配置

1. 创建专用用户

为 TiDB 集群创建专用用户,避免使用 root 用户运行服务:

bash
# 创建 tidb 用户
groupadd -r tidb
useradd -r -g tidb -s /bin/false tidb

# 修改数据目录权限
chown -R tidb:tidb /data

2. 配置 SSH 密钥认证

配置 SSH 密钥认证,禁用密码登录,提高安全性:

bash
# 生成 SSH 密钥
ssh-keygen -t rsa -b 4096 -C "tidb@example.com"

# 复制 SSH 密钥到其他节点
ssh-copy-id tidb@node2

# 编辑 /etc/ssh/sshd_config 文件
cat << EOF >> /etc/ssh/sshd_config
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no
EOF

# 重启 SSH 服务
systemctl restart sshd

配置验证

1. 验证内核参数

bash
# 查看内核参数
sysctl -a | grep -E "net.core.somaxconn|net.ipv4.tcp_syncookies|fs.file-max"

2. 验证文件句柄限制

bash
# 查看当前用户的文件句柄限制
ulimit -n

# 查看系统文件句柄限制
cat /proc/sys/fs/file-max

3. 验证时间同步

bash
# 查看系统时间
date

# 验证 NTP 同步状态
chronyc sources -v

4. 验证磁盘性能

bash
# 查看磁盘挂载选项
mount | grep /data

# 查看磁盘调度器
cat /sys/block/sdb/queue/scheduler

常见问题(FAQ)

Q1: 如何检查 TiDB 集群的操作系统配置是否符合要求?

A1: 可以使用 TiUP 工具的 check 命令检查操作系统配置:

bash
tiup cluster check <topology.yaml> --apply

Q2: 为什么要关闭 SELinux 和防火墙?

A2: SELinux 和防火墙可能会影响 TiDB 集群的网络通信和文件访问。在生产环境中,可以根据实际情况配置适当的 SELinux 策略和防火墙规则,或者直接关闭它们以避免不必要的问题。

Q3: 如何调整 TiKV 节点的磁盘 I/O 性能?

A3: 可以通过以下方法调整 TiKV 节点的磁盘 I/O 性能:

  • 使用 SSD 磁盘
  • 配置合理的文件系统挂载选项
  • 调整内核的脏页写入参数
  • 使用合适的磁盘调度器
  • 调整 TiKV 的 storage.io-rate-limit 参数

Q4: 为什么要设置 vm.swappiness=0?

A4: 设置 vm.swappiness=0 可以让操作系统尽量不使用交换分区,避免因为内存交换导致的性能下降。TiDB 集群需要大量的内存,使用交换分区会严重影响性能。

Q5: 如何验证 NTP 时间同步是否正常?

A5: 可以使用以下命令验证 NTP 时间同步状态:

  • chronyc sources -v(使用 chrony 服务)
  • ntpq -p(使用 ntpd 服务)
  • timedatectl status(查看系统时间状态)

Q6: 如何调整系统的最大文件句柄数?

A6: 可以通过以下方法调整系统的最大文件句柄数:

  • 修改 /etc/security/limits.conf 文件,设置用户的软限制和硬限制
  • 修改 /proc/sys/fs/file-max 文件,设置系统的最大文件句柄数
  • 执行 ulimit -n value 命令,临时调整当前 shell 的文件句柄限制

Q7: 为什么要使用 XFS 文件系统?

A7: XFS 文件系统具有以下优点:

  • 支持大文件和大分区
  • 高性能的 I/O 操作
  • 良好的扩展性
  • 稳定可靠
  • 适合存储 TiKV 的大量小文件

Q8: 如何监控操作系统的性能?

A8: 可以使用以下工具监控操作系统的性能:

  • sar:收集和报告系统活动
  • iotop:监控磁盘 I/O 活动
  • htop:交互式进程查看器
  • dstat:综合系统资源监控工具
  • Prometheus + Grafana:分布式监控系统