TiDB數據庫從入門到精通系列之一:TiDB數據庫的軟硬件環境要求和系統配置檢查
- 一、軟件和硬件配置要求
- 1.操作系統及平臺要求
- 2.服務器建議配置
- 3.網絡要求
- 4.磁盤空間要求
- 二、TiDB 環境與系統配置檢查
- 1.在 TiKV 部署目標機器上添加數據盤 EXT4 文件系統掛載參數
- 2.設置 TiDB 節點的臨時空間(推薦)
- 3.檢測及關閉目標部署機器的防火墻
- 4.檢測及安裝 NTP 服務
- 5.檢查和配置操作系統優化參數
- 6.執行以下命令驗證透明大頁的狀態
- 7.執行以下命令驗證數據目錄所在磁盤的 I/O 調度器
- 8.執行以下命令查看 cpufreq 模塊選用的節能策略
- 9.執行以下命令修改 sysctl 參數
- 10.執行以下命令配置用戶的 limits.conf 文件
- 三、手動配置 SSH 互信及 sudo 免密碼
- 四、安裝 numactl 工具
一、軟件和硬件配置要求
TiDB 作為一款開源一棧式實時 HTAP 數據庫,可以很好地部署和運行在 Intel 架構服務器環境、ARM 架構的服務器環境及主流虛擬化環境,并支持絕大多數的主流硬件網絡。作為一款高性能數據庫系統,TiDB 支持主流的 Linux 操作系統環境。
1.操作系統及平臺要求
針對不同操作系統和 CPU 架構的組合,TiDB 提供不同級別質量標準的支持。
在以下操作系統以及對應的 CPU 架構組合上,TiDB 可滿足企業級生產質量的要求,產品特性經過全面且系統化的驗證:
2.服務器建議配置
TiDB 支持部署和運行在 Intel x86-64 架構的 64 位通用硬件服務器平臺或者 ARM 架構的硬件服務器平臺。對于開發、測試及生產環境的服務器硬件配置(不包含操作系統 OS 本身的占用)有以下要求和建議:
3.網絡要求
TiDB 作為開源一棧式實時 HTAP 數據庫,其正常運行需要網絡環境提供如下的網絡端口配置要求,管理員可根據實際環境中 TiDB 組件部署的方案,在網絡側和主機側開放相關端口:
4.磁盤空間要求
客戶端 Web 瀏覽器要求
TiDB 提供了基于 Grafana 的技術平臺,對數據庫集群的各項指標進行可視化展現。采用支持 Javascript 的微軟 IE、Google Chrome、Mozilla Firefox 的較新版本即可訪問監控入口。
二、TiDB 環境與系統配置檢查
1.在 TiKV 部署目標機器上添加數據盤 EXT4 文件系統掛載參數
生產環境部署,建議使用 EXT4 類型文件系統的 NVME 類型的 SSD 磁盤存儲 TiKV 數據文件。這個配置方案為最佳實施方案,其可靠性、安全性、穩定性已經在大量線上場景中得到證實。
使用 root 用戶登錄目標機器,將部署目標機器數據盤格式化成 ext4 文件系統,掛載時添加 nodelalloc 和 noatime 掛載參數。nodelalloc 是必選參數,否則 TiUP 安裝時檢測無法通過;noatime 是可選建議參數。
注意
如果你的數據盤已經格式化成 ext4 并掛載了磁盤,可先執行 umount /dev/nvme0n1p1 命令卸載,從編輯 /etc/fstab 文件步驟開始執行,添加掛載參數重新掛載即可。
以 /dev/nvme0n1 數據盤為例,具體操作步驟如下:
1.查看數據盤
fdisk -l
Disk /dev/nvme0n1: 1000 GB
2.創建分區
parted -s -a optimal /dev/nvme0n1 mklabel gpt -- mkpart primary ext4 1 -1
注意
使用 lsblk 命令查看分區的設備號:對于 nvme 磁盤,生成的分區設備號一般為 nvme0n1p1;對于普通磁盤(例如 /dev/sdb),生成的分區設備號一般為 sdb1。
3.格式化文件系統
mkfs.ext4 /dev/nvme0n1p1
4.查看數據盤分區 UUID
本例中 nvme0n1p1 的 UUID 為 c51eb23b-195c-4061-92a9-3fad812cc12f
lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT
sda
├─sda1 ext4 237b634b-a565-477b-8371-6dff0c41f5ab /boot
├─sda2 swap f414c5c0-f823-4bb1-8fdf-e531173a72ed
└─sda3 ext4 547909c1-398d-4696-94c6-03e43e317b60 /
sr0
nvme0n1
└─nvme0n1p1 ext4 c51eb23b-195c-4061-92a9-3fad812cc12f
5.編輯 /etc/fstab 文件,添加 nodelalloc 掛載參數
vi /etc/fstab
UUID=c51eb23b-195c-4061-92a9-3fad812cc12f /data1 ext4 defaults,nodelalloc,noatime 0 2
6.掛載數據盤
mkdir /data1 && \
mount -a
7.執行以下命令,如果文件系統為 ext4,并且掛載參數中包含 nodelalloc,則表示已生效
mount -t ext4
/dev/nvme0n1p1 on /data1 type ext4 (rw,noatime,nodelalloc,data=ordered)
2.設置 TiDB 節點的臨時空間(推薦)
TiDB 的部分操作需要向服務器寫入臨時文件,因此需要確保運行 TiDB 的操作系統用戶具有足夠的權限對目標目錄進行讀寫。如果 TiDB 實例不是以 root 權限啟動,則需要檢查目錄權限并進行正確設置。
-
TiDB 臨時工作區
- 哈希表構建、排序等內存消耗較大的操作可能會向磁盤寫入臨時數據,用來減少內存消耗,提升穩定性。寫入的磁盤位置由配置項 tmp-storage-path 定義。在默認設置下,確保運行 TiDB 的用戶對操作系統臨時文件夾(通常為 /tmp)有讀寫權限。
-
Fast Online DDL 工作區
- 當變量 tidb_ddl_enable_fast_reorg 被設置為 ON(v6.5.0 及以上版本中默認值為 ON)時,會激活 Fast Online DDL,這時部分 DDL 要對臨時文件進行讀寫。臨時文件位置由配置 temp-dir 定義,需要確保運行 TiDB 的用戶對操作系統中該目錄有讀寫權限。以默認目錄 /tmp/tidb 為例:
注意
如果業務中可能存在針對大對象的 DDL 操作,推薦為 temp-dir 配置獨立文件系統及更大的臨時空間。
sudo mkdir /tmp/tidb
如果目錄 /tmp/tidb 已經存在,需確保有寫入權限。
sudo chmod -R 777 /tmp/tidb
3.檢測及關閉目標部署機器的防火墻
本段介紹如何關閉目標主機防火墻配置,因為在 TiDB 集群中,需要將節點間的訪問端口打通才可以保證讀寫請求、數據心跳等信息的正常的傳輸。在普遍線上場景中,數據庫到業務服務和數據庫節點的網絡聯通都是在安全域內完成數據交互。如果沒有特殊安全的要求,建議將目標節點的防火墻進行關閉。否則建議按照端口使用規則,將端口信息配置到防火墻服務的白名單中。
1.檢查防火墻狀態(以 CentOS Linux release 7.7.1908 (Core) 為例)
sudo firewall-cmd --state
sudo systemctl status firewalld.service
2.關閉防火墻服務
sudo systemctl stop firewalld.service
3.關閉防火墻自動啟動服務
sudo systemctl disable firewalld.service
4.檢查防火墻狀態
sudo systemctl status firewalld.service
4.檢測及安裝 NTP 服務
TiDB 是一套分布式數據庫系統,需要節點間保證時間的同步,從而確保 ACID 模型的事務線性一致性。目前解決授時的普遍方案是采用 NTP 服務,可以通過互聯網中的 pool.ntp.org 授時服務來保證節點的時間同步,也可以使用離線環境自己搭建的 NTP 服務來解決授時。
采用如下步驟檢查是否安裝 NTP 服務以及與 NTP 服務器正常同步:
1.執行以下命令,如果輸出 running 表示 NTP 服務正在運行:
sudo systemctl status ntpd.service
ntpd.service - Network Time Service
Loaded: loaded (/usr/lib/systemd/system/ntpd.service; disabled; vendor preset: disabled)
Active: active (running) since 一 2017-12-18 13:13:19 CST; 3s ago
若返回報錯信息 Unit ntpd.service could not be found.,請嘗試執行以下命令,以查看與 NTP 進行時鐘同步所使用的系統配置是 chronyd 還是 ntpd:
sudo systemctl status chronyd.service
chronyd.service - NTP client/server
Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2021-04-05 09:55:29 EDT; 3 days ago
若發現系統既沒有配置 chronyd 也沒有配置 ntpd,則表示系統尚未安裝任一服務。此時,應先安裝其中一個服務,并保證它可以自動啟動,默認使用 ntpd。
如果你使用的系統配置是 chronyd,請直接執行步驟 3。
2.執行 ntpstat 命令檢測是否與 NTP 服務器同步:
注意Ubuntu 系統需安裝 ntpstat 軟件包。
ntpstat
如果輸出 synchronised to NTP server,表示正在與 NTP 服務器正常同步:
synchronised to NTP server (85.199.214.101) at stratum 2
time correct to within 91 ms
polling server every 1024 s
以下情況表示 NTP 服務未正常同步:
unsynchronised
以下情況表示 NTP 服務未正常運行:
Unable to talk to NTP daemon. Is it running?
3.執行 chronyc tracking 命令查看 Chrony 服務是否與 NTP 服務器同步。
chronyc tracking
如果該命令返回結果為 Leap status : Normal,則代表同步過程正常。
Reference ID : 5EC69F0A (ntp1.time.nl)
Stratum : 2
Ref time (UTC) : Thu May 20 15:19:08 2021
System time : 0.000022151 seconds slow of NTP time
Last offset : -0.000041040 seconds
RMS offset : 0.000053422 seconds
Frequency : 2.286 ppm slow
Residual freq : -0.000 ppm
Skew : 0.012 ppm
Root delay : 0.012706812 seconds
Root dispersion : 0.000430042 seconds
Update interval : 1029.8 seconds
Leap status : Normal
如果該命令返回結果如下,則表示同步過程出錯:
Leap status : Not synchronised
如果該命令返回結果如下,則表示 Chrony 服務未正常運行:
506 Cannot talk to daemon
如果要使 NTP 服務盡快開始同步,執行以下命令。可以將 pool.ntp.org 替換為你的 NTP 服務器:
sudo systemctl stop ntpd.service && \
sudo ntpdate pool.ntp.org && \
sudo systemctl start ntpd.service
如果要在 CentOS 7 系統上手動安裝 NTP 服務,可執行以下命令:
sudo yum install ntp ntpdate && \
sudo systemctl start ntpd.service && \
sudo systemctl enable ntpd.service
5.檢查和配置操作系統優化參數
在生產系統的 TiDB 中,建議對操作系統進行如下的配置優化:
- 關閉透明大頁(即 Transparent Huge Pages,縮寫為 THP)。數據庫的內存訪問模式往往是稀疏的而非連續的。當高階內存碎片化比較嚴重時,分配 THP 頁面會出現較高的延遲。
- 將存儲介質的 I/O 調度器設置為 noop。對于高速 SSD 存儲介質,內核的 I/O 調度操作會導致性能損失。將調度器設置為 noop 后,內核不做任何操作,直接將 I/O 請求下發給硬件,以獲取更好的性能。同時,noop 調度器也有較好的普適性。
- 為調整 CPU 頻率的 cpufreq 模塊選用 performance 模式。將 CPU 頻率固定在其支持的最高運行頻率上,不進行動態調節,可獲取最佳的性能。
采用如下步驟檢查操作系統的當前配置,并配置系統優化參數:
1.執行以下命令查看透明大頁的開啟狀態。
cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never
注意
[always] madvise never 表示透明大頁處于啟用狀態,需要關閉。
2.執行以下命令查看數據目錄所在磁盤的 I/O 調度器。假設在 sdb、sdc 兩個磁盤上創建了數據目錄。
cat /sys/block/sd[bc]/queue/scheduler
noop [deadline] cfq
noop [deadline] cfq
注意
noop [deadline] cfq 表示磁盤的 I/O 調度器使用 deadline,需要進行修改。
執行以下命令查看磁盤的唯一標識 ID_SERIAL。
udevadm info --name=/dev/sdb | grep ID_SERIAL
E: ID_SERIAL=36d0946606d79f90025f3e09a0c1f9e81
E: ID_SERIAL_SHORT=6d0946606d79f90025f3e09a0c1f9e81
注意
如果多個磁盤都分配了數據目錄,需要多次執行以上命令,記錄所有磁盤各自的唯一標識。
4.執行以下命令查看 cpufreq 模塊選用的節能策略。
cpupower frequency-info --policy
analyzing CPU 0:
current policy: frequency should be within 1.20 GHz and 3.10 GHz.The governor "powersave" may decide which speed to use within this range.
注意
The governor “powersave” 表示 cpufreq 的節能策略使用 powersave,需要調整為 performance 策略。如果是虛擬機或者云主機,則不需要調整,命令輸出通常為 Unable to determine current policy。
5.配置系統優化參數
使用 tuned(推薦)
a.執行 tuned-adm list 命令查看當前操作系統的 tuned 策略。
tuned-adm list
Available profiles:
- balanced - General non-specialized tuned profile
- desktop - Optimize for the desktop use-case
- hpc-compute - Optimize for HPC compute workloads
- latency-performance - Optimize for deterministic performance at the cost of increased power consumption
- network-latency - Optimize for deterministic performance at the cost of increased power consumption, focused on low latency network performance
- network-throughput - Optimize for streaming network throughput, generally only necessary on older CPUs or 40G+ networks
- powersave - Optimize for low power consumption
- throughput-performance - Broadly applicable tuning that provides excellent performance across a variety of common server workloads
- virtual-guest - Optimize for running inside a virtual guest
- virtual-host - Optimize for running KVM guests
Current active profile: balanced
Current active profile: balanced 表示當前操作系統的 tuned 策略使用 balanced,建議在當前策略的基礎上添加操作系統優化配置。
b.創建新的 tuned 策略。
mkdir /etc/tuned/balanced-tidb-optimal/
vi /etc/tuned/balanced-tidb-optimal/tuned.conf
[main]
include=balanced[cpu]
governor=performance[vm]
transparent_hugepages=never[disk]
devices_udev_regex=(ID_SERIAL=36d0946606d79f90025f3e09a0c1fc035)|(ID_SERIAL=36d0946606d79f90025f3e09a0c1f9e81)
elevator=noop
include=balanced 表示在現有的 balanced 策略基礎上添加操作系統優化配置。
c.應用新的 tuned 策略。
tuned-adm profile balanced-tidb-optimal
6.執行以下命令驗證透明大頁的狀態
cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
7.執行以下命令驗證數據目錄所在磁盤的 I/O 調度器
cat /sys/block/sd[bc]/queue/scheduler
[noop] deadline cfq
[noop] deadline cfq
8.執行以下命令查看 cpufreq 模塊選用的節能策略
cpupower frequency-info --policy
analyzing CPU 0:
current policy: frequency should be within 1.20 GHz and 3.10 GHz.The governor "performance" may decide which speed to use within this range.
9.執行以下命令修改 sysctl 參數
echo "fs.file-max = 1000000">> /etc/sysctl.conf
echo "net.core.somaxconn = 32768">> /etc/sysctl.conf
echo "net.ipv4.tcp_tw_recycle = 0">> /etc/sysctl.conf
echo "net.ipv4.tcp_syncookies = 0">> /etc/sysctl.conf
echo "vm.overcommit_memory = 1">> /etc/sysctl.conf
sysctl -p
10.執行以下命令配置用戶的 limits.conf 文件
cat << EOF >>/etc/security/limits.conf
tidb soft nofile 1000000
tidb hard nofile 1000000
tidb soft stack 32768
tidb hard stack 32768
EOF
三、手動配置 SSH 互信及 sudo 免密碼
對于有需求,通過手動配置中控機至目標節點互信的場景,可參考本段。通常推薦使用 TiUP 部署工具會自動配置 SSH 互信及免密登錄,可忽略本段內容。
1.以 root 用戶依次登錄到部署目標機器創建 tidb 用戶并設置登錄密碼
useradd tidb && \
passwd tidb
2.執行以下命令,將 tidb ALL=(ALL) NOPASSWD: ALL 添加到文件末尾,即配置好 sudo 免密碼
visudo
tidb ALL=(ALL) NOPASSWD: ALL
3.以 tidb 用戶登錄到中控機,執行以下命令。將 10.0.1.1 替換成你的部署目標機器 IP,按提示輸入部署目標機器 tidb 用戶密碼,執行成功后即創建好 SSH 互信,其他機器同理。新建的 tidb 用戶下沒有 .ssh 目錄,需要執行生成 rsa 密鑰的命令來生成 .ssh 目錄。如果要在中控機上部署 TiDB 組件,需要為中控機和中控機自身配置互信。
ssh-keygen -t rsa
ssh-copy-id -i ~/.ssh/id_rsa.pub 10.0.1.1
4.以 tidb 用戶登錄中控機,通過 ssh 的方式登錄目標機器 IP。如果不需要輸入密碼并登錄成功,即表示 SSH 互信配置成功。
ssh 10.0.1.1
[tidb@10.0.1.1 ~]$
5.以 tidb 用戶登錄到部署目標機器后,執行以下命令,不需要輸入密碼并切換到 root 用戶,表示 tidb 用戶 sudo 免密碼配置成功。
sudo -su root
[root@10.0.1.1 tidb]#
四、安裝 numactl 工具
本段主要介紹如何安裝 NUMA 工具。在生產環境中,因為硬件機器配置往往高于需求,為了更合理規劃資源,會考慮單機多實例部署 TiDB 或者 TiKV。NUMA 綁核工具的使用,主要為了防止 CPU 資源的爭搶,引發性能衰退。
注意:
- NUMA 綁核是用來隔離 CPU 資源的一種方法,適合高配置物理機環境部署多實例使用。
- 通過 tiup cluster deploy 完成部署操作,就可以通過 exec 命令來進行集群級別管理工作。
安裝 NUMA 工具有兩種方法:
方法 1:登錄到目標節點進行安裝(以 CentOS Linux release 7.7.1908 (Core) 為例)。
sudo yum -y install numactl
方法 2:通過 tiup cluster exec 在集群上批量安裝 NUMA。
使用 TiUP 安裝 TiDB 集群,參考使用 TiUP 部署 TiDB 集群完成 tidb-test 集群的部署。如果本地已有集群,可跳過這一步。
tiup cluster deploy tidb-test v6.1.0 ./topology.yaml --user root [-p] [-i /home/root/.ssh/gcp_rsa]
執行 tiup cluster exec 命令,以 sudo 權限在 tidb-test 集群所有目標主機上安裝 NUMA。
tiup cluster exec tidb-test --sudo --command "yum -y install numactl"