TiDB 环境与系统配置检查

    生产环境部署,建议使用 EXT4 类型文件系统的 NVME 类型的 SSD 磁盘存储 TiKV 数据文件。这个配置方案为最佳实施方案,其可靠性、安全性、稳定性已经在大量线上场景中得到证实。

    使用 用户登录目标机器,将部署目标机器数据盘格式化成 ext4 文件系统,挂载时添加 nodelallocnoatime 挂载参数。nodelalloc 是必选参数,否则 TiUP 安装时检测无法通过;noatime 是可选建议参数。

    /dev/nvme0n1 数据盘为例,具体操作步骤如下:

    1. 查看数据盘。

      1. Disk /dev/nvme0n1: 1000 GB
    2. 创建分区。

      1. parted -s -a optimal /dev/nvme0n1 mklabel gpt -- mkpart primary ext4 1 -1

      注意:

      使用 lsblk 命令查看分区的设备号:对于 nvme 磁盘,生成的分区设备号一般为 nvme0n1p1;对于普通磁盘(例如 /dev/sdb),生成的的分区设备号一般为 sdb1

    3. 格式化文件系统。

      1. mkfs.ext4 /dev/nvme0n1p1
    4. 查看数据盘分区 UUID。

      本例中 nvme0n1p1 的 UUID 为 c51eb23b-195c-4061-92a9-3fad812cc12f

      1. lsblk -f
      1. NAME FSTYPE LABEL UUID MOUNTPOINT
      2. sda
      3. ├─sda1 ext4 237b634b-a565-477b-8371-6dff0c41f5ab /boot
      4. ├─sda2 swap f414c5c0-f823-4bb1-8fdf-e531173a72ed
      5. └─sda3 ext4 547909c1-398d-4696-94c6-03e43e317b60 /
      6. sr0
      7. nvme0n1
      8. └─nvme0n1p1 ext4 c51eb23b-195c-4061-92a9-3fad812cc12f
    5. 编辑 /etc/fstab 文件,添加 nodelalloc 挂载参数。

      1. vi /etc/fstab
      1. UUID=c51eb23b-195c-4061-92a9-3fad812cc12f /data1 ext4 defaults,nodelalloc,noatime 0 2
    6. 挂载数据盘。

      1. mkdir /data1 && \
      2. mount -a
    7. 执行以下命令,如果文件系统为 ext4,并且挂载参数中包含 nodelalloc,则表示已生效。

      1. mount -t ext4
      1. /dev/nvme0n1p1 on /data1 type ext4 (rw,noatime,nodelalloc,data=ordered)

    检测及关闭系统 swap

    本段介绍 swap 关闭方法。TiDB 运行需要有足够的内存,并且不建议使用 swap 作为内存不足的缓冲,这会降低性能。因此建议永久关闭系统 swap,并且不要使用 swapoff -a 方式关闭,否则重启机器后该操作会失效。

    建议执行以下命令关闭系统 swap:

    1. echo "vm.swappiness = 0">> /etc/sysctl.conf
    2. swapoff -a && swapon -a
    3. sysctl -p

    本段介绍如何关闭目标主机防火墙配置,因为在 TiDB 集群中,需要将节点间的访问端口打通才可以保证读写请求、数据心跳等信息的正常的传输。在普遍线上场景中,数据库到业务服务和数据库节点的网络联通都是在安全域内完成数据交互。如果没有特殊安全的要求,建议将目标节点的防火墙进行关闭。否则建议,将端口信息配置到防火墙服务的白名单中。

    1. 检查防火墙状态(以 CentOS Linux release 7.7.1908 (Core) 为例)

      1. sudo firewall-cmd --state
      2. sudo systemctl status firewalld.service
    2. 关闭防火墙服务

      1. sudo systemctl stop firewalld.service
    3. 关闭防火墙自动启动服务

      1. sudo systemctl disable firewalld.service
    4. 检查防火墙状态

      1. sudo systemctl status firewalld.service

    检测及安装 NTP 服务

    TiDB 是一套分布式数据库系统,需要节点间保证时间的同步,从而确保 ACID 模型的事务线性一致性。目前解决授时的普遍方案是采用 NTP 服务,可以通过互联网中的 pool.ntp.org 授时服务来保证节点的时间同步,也可以使用离线环境自己搭建的 NTP 服务来解决授时。

    采用如下步骤检查是否安装 NTP 服务以及与 NTP 服务器正常同步:

    1. 执行以下命令,如果输出 running 表示 NTP 服务正在运行:

      1. sudo systemctl status ntpd.service
      1. ntpd.service - Network Time Service
      2. Loaded: loaded (/usr/lib/systemd/system/ntpd.service; disabled; vendor preset: disabled)
      3. Active: active (running) since 2017-12-18 13:13:19 CST; 3s ago
    2. 执行 ntpstat 命令检测是否与 NTP 服务器同步:

      注意:

      1. ntpstat
      • 如果输出 synchronised to NTP server,表示正在与 NTP 服务器正常同步:

        1. synchronised to NTP server (85.199.214.101) at stratum 2
        2. time correct to within 91 ms
        3. polling server every 1024 s
      • 以下情况表示 NTP 服务未正常同步:

        1. unsynchronised
      • 以下情况表示 NTP 服务未正常运行:

        1. Unable to talk to NTP daemon. Is it running?

    如果要使 NTP 服务尽快开始同步,执行以下命令。可以将 pool.ntp.org 替换为你的 NTP 服务器:

    如果要在 CentOS 7 系统上手动安装 NTP 服务,可执行以下命令:

    1. sudo yum install ntp ntpdate && \
    2. sudo systemctl start ntpd.service && \
    3. sudo systemctl enable ntpd.service

    在生产系统的 TiDB 中,建议对操作系统进行如下的配置优化:

    1. 关闭透明大页(即 Transparent Huge Pages,缩写为 THP)。数据库的内存访问模式往往是稀疏的而非连续的。当高阶内存碎片化比较严重时,分配 THP 页面会出现较高的延迟。
    2. 为调整 CPU 频率的 cpufreq 模块选用 performance 模式。将 CPU 频率固定在其支持的最高运行频率上,不进行动态调节,可获取最佳的性能。

    采用如下步骤检查操作系统的当前配置,并配置系统优化参数:

    1. 执行以下命令查看透明大页的开启状态。

      1. cat /sys/kernel/mm/transparent_hugepage/enabled
    2. 执行以下命令查看数据目录所在磁盘的 I/O 调度器。假设在 sdb、sdc 两个磁盘上创建了数据目录。

      1. cat /sys/block/sd[bc]/queue/scheduler
      1. noop [deadline] cfq
      2. noop [deadline] cfq

      注意:

      noop [deadline] cfq 表示磁盘的 I/O 调度器使用 deadline,需要进行修改。

    3. 执行以下命令查看磁盘的唯一标识 ID_SERIAL

      1. udevadm info --name=/dev/sdb | grep ID_SERIAL
      1. E: ID_SERIAL=36d0946606d79f90025f3e09a0c1f9e81
      2. E: ID_SERIAL_SHORT=6d0946606d79f90025f3e09a0c1f9e81

      注意:

      如果多个磁盘都分配了数据目录,需要多次执行以上命令,记录所有磁盘各自的唯一标识。

    4. 执行以下命令查看 cpufreq 模块选用的节能策略。

      1. cpupower frequency-info --policy
      1. analyzing CPU 0:
      2. current policy: frequency should be within 1.20 GHz and 3.10 GHz.
      3. The governor "powersave" may decide which speed to use within this range.
    5. 配置系统优化参数。

      • 方法一:使用 tuned(推荐)

        1. 执行 tuned-adm list 命令查看当前操作系统的 tuned 策略。

          1. tuned-adm list
          1. Available profiles:
          2. - balanced - General non-specialized tuned profile
          3. - desktop - Optimize for the desktop use-case
          4. - hpc-compute - Optimize for HPC compute workloads
          5. - latency-performance - Optimize for deterministic performance at the cost of increased power consumption
          6. - network-latency - Optimize for deterministic performance at the cost of increased power consumption, focused on low latency network performance
          7. - network-throughput - Optimize for streaming network throughput, generally only necessary on older CPUs or 40G+ networks
          8. - powersave - Optimize for low power consumption
          9. - throughput-performance - Broadly applicable tuning that provides excellent performance across a variety of common server workloads
          10. - virtual-guest - Optimize for running inside a virtual guest
          11. - virtual-host - Optimize for running KVM guests
          12. Current active profile: balanced

          Current active profile: balanced 表示当前操作系统的 tuned 策略使用 balanced,建议在当前策略的基础上添加操作系统优化配置。

        2. 创建新的 tuned 策略。

          1. mkdir /etc/tuned/balanced-tidb-optimal/
          2. vi /etc/tuned/balanced-tidb-optimal/tuned.conf
          1. [main]
          2. include=balanced
          3. [cpu]
          4. governor=performance
          5. [vm]
          6. transparent_hugepages=never
          7. [disk]
          8. devices_udev_regex=(ID_SERIAL=36d0946606d79f90025f3e09a0c1fc035)|(ID_SERIAL=36d0946606d79f90025f3e09a0c1f9e81)
          9. elevator=noop

          include=balanced 表示在现有的 balanced 策略基础上添加操作系统优化配置。

        3. 应用新的 tuned 策略。

          1. tuned-adm profile balanced-tidb-optimal
      • 方法二:使用脚本方式。如果已经使用 tuned 方法,请跳过本方法。

        1. 注意:

          需安装 grubby 软件包。

          1. grubby --default-kernel
          1. /boot/vmlinuz-3.10.0-957.el7.x86_64
        2. 执行 grubby --update-kernel 命令修改内核配置。

          1. grubby --args="transparent_hugepage=never" --update-kernel /boot/vmlinuz-3.10.0-957.el7.x86_64

          注意:

          --update-kernel 后需要使用实际的默认内核版本。

        3. 执行 grubby --info 命令查看修改后的默认内核配置。

          1. grubby --info /boot/vmlinuz-3.10.0-957.el7.x86_64
          1. index=0
          2. kernel=/boot/vmlinuz-3.10.0-957.el7.x86_64
          3. args="ro crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet LANG=en_US.UTF-8 transparent_hugepage=never"
          4. root=/dev/mapper/centos-root
          5. initrd=/boot/initramfs-3.10.0-957.el7.x86_64.img
        4. 修改当前的内核配置立即关闭透明大页。

          1. echo never > /sys/kernel/mm/transparent_hugepage/defrag
        5. 配置 udev 脚本应用 IO 调度器策略。

          1. vi /etc/udev/rules.d/60-tidb-schedulers.rules
        6. 应用 udev 脚本。

          1. udevadm control --reload-rules
          2. udevadm trigger --type=devices --action=change
        7. 创建 CPU 节能策略配置服务。

          1. cat >> /etc/systemd/system/cpupower.service << EOF
          2. [Unit]
          3. Description=CPU performance
          4. [Service]
          5. Type=oneshot
          6. ExecStart=/usr/bin/cpupower frequency-set --governor performance
          7. [Install]
          8. WantedBy=multi-user.target
          9. EOF
        8. 应用 CPU 节能策略配置服务。

          1. systemctl daemon-reload
          2. systemctl enable cpupower.service
          3. systemctl start cpupower.service
    6. 执行以下命令验证透明大页的状态。

      1. cat /sys/kernel/mm/transparent_hugepage/enabled
      1. always madvise [never]
    7. 执行以下命令验证数据目录所在磁盘的 I/O 调度器。

      1. cat /sys/block/sd[bc]/queue/scheduler
      1. [noop] deadline cfq
      2. [noop] deadline cfq
    8. 执行以下命令查看 cpufreq 模块选用的节能策略。

      1. cpupower frequency-info --policy
      1. analyzing CPU 0:
      2. current policy: frequency should be within 1.20 GHz and 3.10 GHz.
      3. The governor "performance" may decide which speed to use within this range.

    手动配置 SSH 互信及 sudo 免密码

    对于有需求,通过手动配置中控机至目标节点互信的场景,可参考本段。通常推荐使用 TiUP 部署工具会自动配置 SSH 互信及免密登陆,可忽略本段内容。

    1. root 用户依次登录到部署目标机器创建 tidb 用户并设置登录密码。

      1. useradd tidb && \
      2. passwd tidb
    2. 执行以下命令,将 tidb ALL=(ALL) NOPASSWD: ALL 添加到文件末尾,即配置好 sudo 免密码。

      1. visudo
      1. tidb ALL=(ALL) NOPASSWD: ALL
    3. tidb 用户登录到中控机,执行以下命令。将 10.0.1.1 替换成你的部署目标机器 IP,按提示输入部署目标机器 tidb 用户密码,执行成功后即创建好 SSH 互信,其他机器同理。新建的 tidb 用户下没有 .ssh 目录,需要执行生成 rsa 密钥的命令来生成 .ssh 目录。如果要在中控机上部署 TiDB 组件,需要为中控机和中控机自身配置互信。

      1. ssh-keygen -t rsa
      2. ssh-copy-id -i ~/.ssh/id_rsa.pub 10.0.1.1
    4. tidb 用户登录中控机,通过 ssh 的方式登录目标机器 IP。如果不需要输入密码并登录成功,即表示 SSH 互信配置成功。

      1. ssh 10.0.1.1
      1. [tidb@10.0.1.1 ~]$
    5. tidb 用户登录到部署目标机器后,执行以下命令,不需要输入密码并切换到 root 用户,表示 tidb 用户 sudo 免密码配置成功。

      1. sudo -su root
      1. [root@10.0.1.1 tidb]#

    本段主要介绍如果安装 NUMA 工具。在生产环境中,因为硬件机器配置往往高于需求,为了更合理规划资源,会考虑单机多实例部署 TiDB 或者 TiKV。NUMA 绑核工具的使用,主要为了防止 CPU 资源的争抢,引发性能衰退。

    注意:

    • NUMA 绑核是用来隔离 CPU 资源的一种方法,适合高配置物理机环境部署多实例使用。
    • 通过 tiup cluster deploy 完成部署操作,就可以通过 exec 命令来进行集群级别管理工作。
    1. 登录到目标节点进行安装(以 CentOS Linux release 7.7.1908 (Core) 为例)

      1. sudo yum -y install numactl
    2. 通过 TiUP 的 cluster 执行完 exec 命令来完成批量安装

      1. tiup cluster exec --help
      1. Run shell command on host in the tidb cluster
      2. Usage:
      3. cluster exec <cluster-name> [flags]
      4. Flags:
      5. --command string the command run on cluster host (default "ls")
      6. -h, --help help for exec

      将 tidb-test 集群所有目标主机通过 sudo 权限执行安装命令

      1. tiup cluster exec tidb-test --sudo --command "yum -y install numactl"