外观
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 | 内存 | 磁盘 | 网络 |
|---|---|---|---|---|
| TiDB | 8 核+ | 16 GB+ | SSD(200 GB+) | 千兆网卡+ |
| TiKV | 8 核+ | 32 GB+ | SSD(500 GB+) | 千兆网卡+ |
| PD | 4 核+ | 8 GB+ | SSD(100 GB+) | 千兆网卡+ |
| TiFlash | 16 核+ | 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 -p2. 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 -p3. 内核参数说明
| 参数 | 说明 | 推荐值 |
|---|---|---|
| net.core.somaxconn | 套接字监听队列的最大长度 | 32768 |
| net.core.netdev_max_backlog | 网络设备接收队列的最大长度 | 16384 |
| net.ipv4.tcp_syncookies | 启用 SYN cookies,防止 SYN 洪水攻击 | 1 |
| net.ipv4.tcp_fin_timeout | TCP 连接关闭超时时间 | 30 |
| net.ipv4.tcp_keepalive_time | TCP 连接保活时间 | 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 03. 文件系统挂载选项说明
| 选项 | 说明 |
|---|---|
| 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
EOF2. 进程数限制
调整系统的最大进程数限制:
bash
cat << EOF >> /etc/sysctl.conf
kernel.pid_max = 4194303
EOF
# 应用配置
sysctl -p网络配置
1. 网络接口配置
确保网络接口配置正确,启用全双工模式:
bash
# 使用 ethtool 查看网络接口状态
ethtool eth0
# 启用全双工模式
ethtool -s eth0 duplex full speed 10002. 关闭防火墙
在生产环境中,建议关闭防火墙或配置适当的防火墙规则:
bash
# 关闭 firewalld(CentOS 7+)
systemctl stop firewalld
systemctl disable firewalld
# 关闭 iptables(CentOS 6)
service iptables stop
chkconfig iptables off3. 关闭 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 ntp2. 配置 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/fstab2. 磁盘调度器
对于 SSD 磁盘,建议使用 none 或 mq-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"
EOF3. 磁盘性能测试
使用 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-daemon2. 配置系统日志
调整系统日志配置,避免日志占用过多磁盘空间:
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 dstat2. 配置系统监控
启用 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 /data2. 配置 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-max3. 验证时间同步
bash
# 查看系统时间
date
# 验证 NTP 同步状态
chronyc sources -v4. 验证磁盘性能
bash
# 查看磁盘挂载选项
mount | grep /data
# 查看磁盘调度器
cat /sys/block/sdb/queue/scheduler常见问题(FAQ)
Q1: 如何检查 TiDB 集群的操作系统配置是否符合要求?
A1: 可以使用 TiUP 工具的 check 命令检查操作系统配置:
bash
tiup cluster check <topology.yaml> --applyQ2: 为什么要关闭 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:分布式监控系统
