TiDB 生产集群部署

TiDB 是 PingCAP(平凯星辰)公司设计的开源分布式数据库,结合了传统的 RDBMS 和 NoSQL 的最佳特性。TiDB高度兼容MySQL协议,支持无限的水平扩展,具备强一致性和高可用性。TiDB 的目标是为 OLTP 和 OLAP 场景提供一站式的解决方案。TiDB 适合大数据量接近单机处理的极限、不希望做Sharding、访问模式上没有明显的热点等场景。

准备工作

限制条件

  • 操作系统:由于 TiDB 集群不支持 CentOS Linux 7.9,本文使用 Oracle Linux 8.9
系统名称 适用版本 备注
CentOS Linux 9 or higher 不支持 7.9
Oracle Linux 8.4 or a later 8.x 不支持 9.x
银河麒麟 V10 SP1/SP2/SP3 从 v7.5.5 开始支持 SP3
Ubuntu 20.04 及以上 Ubuntu support is not fully tested, be careful
UOS统信 V20 -
openEuler 22.03 LTS SP1/SP3 -
[root@localhost ~]# cat /etc/oracle-release
Oracle Linux Server release 8.9

[root@localhost ~]# cat /etc/redhat-release 
Red Hat Enterprise Linux release 8.9 (Ootpa)
  • 文件系统:建议使用 ext4 类型文件系统的 NVMe 类型的 SSD 磁盘存储 TiKV 数据文件
  • 挂载参数:挂载磁盘时添加 nodelalloc 和 noatime 参数,nodelalloc 是必选参数,否则 TiUP 安装时检测无法通过;noatime 是可选建议参数
# mkfs.ext4 /dev/nvme0n1p1
# mkdir /data
# mount -o defaults,nodelalloc,noatime /dev/nvme0n1p1 /data
# blkid  #.查看uuid
# echo "UUID=********-****-****-****-************ /data ext4 defaults,nodelalloc,noatime 0 2" >> /etc/fstab
  • 参考:Oracle Linux 8.9 配置ip地址,以 ens160 配置 192.168.31.101 为例:
# nmcli connection show
# nmcli connection modify ens160 ipv4.addresses 192.168.31.101/24
# nmcli connection modify ens160 ipv4.gateway 192.168.31.1
# nmcli connection modify ens160 ipv4.dns "223.5.5.5"
# nmcli connection modify ens160 ipv4.method manual
# nmcli connection modify ens160 connection.autoconnect yes
# nmcli connection up "ens160"

系统初始化

  • [所有节点]-创建专用用户和数据目录,示例 tidb 端口 4000
#.创建专用用户, 密码 Admin_147
cat /etc/group | grep tidb || groupadd tidb
cat /etc/passwd | grep tidb || useradd -g tidb -s /bin/bash -m -d /home/tidb tidb
cat /etc/sudoers | grep "^tidb" || echo "tidb ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
echo "Admin_147" | passwd tidb --stdin > /dev/null

#.这里使用tidb默认端口 4000
global_tidb_port=4000
mkdir -p /data/tidb_${global_tidb_port}/{deploy,data}
chown -R tidb:tidb /data/tidb_${global_tidb_port}
  • [所有节点]-优化系统参数
#.配置时区
timedatectl set-timezone Asia/Shanghai

#.配置时间同步
# yum install -y -q ntp ntpdate && /usr/sbin/ntpdate -u ntp.aliyun.com
systemctl list-unit-files | grep ntpd || chronyc tracking
systemctl list-unit-files | grep chronyd || ntpdate -u ntp.aliyun.com
timedatectl set-ntp true

#.安装基础依赖,其中执行 tiup cluster check 会检查 numactl 是否安装
yum install -y wget net-tools numactl

#.临时关闭iptables
iptables -F

#.关闭防火墙
systemctl stop firewalld.service
systemctl disable firewalld.service

#.优化ulimit
ulimit -n 1000000
sed -i '/^tidb/d' /etc/security/limits.conf
echo "tidb soft nofile 1000000" >> /etc/security/limits.conf
echo "tidb hard nofile 1000000" >> /etc/security/limits.conf
echo "tidb soft stack 655350" >> /etc/security/limits.conf
echo "tidb hard stack 655350" >> /etc/security/limits.conf
echo "tidb soft core unlimited" >> /etc/security/limits.conf
echo "tidb hard core unlimited" >> /etc/security/limits.conf
cat /etc/security/limits.conf | grep "^tidb"

#.关闭selinux
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
setenforce 0

#.临时关闭透明大页
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
sed -i '/transparent_hugepage/d' /etc/rc.d/rc.local
echo 'echo never > /sys/kernel/mm/transparent_hugepage/defrag' >> /etc/rc.d/rc.local
echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.d/rc.local

#.永久关闭透明大页
cp /etc/default/grub /etc/default/grub.$(date +%Y%m%d%H%M%S)
cat /etc/default/grub | grep transparent_hugepage || sed -i 's/rhgb quiet/rhgb quiet transparent_hugepage=never/g' /etc/default/grub 
grub2-mkconfig -o /etc/grub2.cfg 

#.关闭系统swap
sed -i '/^vm.swappiness/d' /etc/sysctl.conf
echo "vm.swappiness = 0" >> /etc/sysctl.conf
/sbin/sysctl -p /etc/sysctl.conf > /dev/null 2>&1
swapoff -a

#.优化内核参数
sed -i '/^fs.file-max/d' /etc/sysctl.conf
sed -i '/^net.core.somaxconn/d' /etc/sysctl.conf
sed -i '/^net.ipv4.tcp_syncookies/d' /etc/sysctl.conf
sed -i '/^vm.overcommit_memory/d' /etc/sysctl.conf
sed -i '/^vm.min_free_kbytes/d' /etc/sysctl.conf
echo "fs.file-max = 6815744" >> /etc/sysctl.conf
echo "net.core.somaxconn = 32768" >> /etc/sysctl.conf
echo "net.ipv4.tcp_syncookies = 0" >> /etc/sysctl.conf
echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf
echo "vm.min_free_kbytes = 1048576" >> /etc/sysctl.conf
/sbin/sysctl -p /etc/sysctl.conf > /dev/null 2>&1

根据规划修改组件参数

  • 资源规划,以3台机器为例(可以把任一节点作为管理节点,示例选择节点1):
ip地址 配置 存储与网络 组件
192.168.31.101 4C-16GB-60GB SSD, 万兆网卡 pd,tidb,tikv,tiflash,monitoring,grafana,alertmanager
192.168.31.102 4C-8GB-60GB SSD, 万兆网卡 pd,tidb,tikv,tiflash
192.168.31.103 4C-8GB-60GB SSD, 万兆网卡 pd,tidb,tikv

👉 注:TiFlash是PingCAP开发的一种分布式列存储引擎,它对聚合计算(带group by的语句)的加速特别明显,能轻松比TiKV+索引的方式快2-10倍。

  • [管理节点]-根据规划修改组件参数
#.全局参数
global_tidb_port=4000               #.全局tidb服务端口,比如4000
global_block_cache=4GB              #.全局配置block-cache,建议物理内存的50%

#.根据规划修改组件参数
node_ip_1=192.168.31.101
node_ip_2=192.168.31.102
node_ip_3=192.168.31.103
node_ssh_port_1=22
node_ssh_port_2=${node_ssh_port_1}
node_ssh_port_3=${node_ssh_port_1}
monitored_node_port_1=9100
monitored_blackbox_port_1=9115
pd_client_port_1=2379
pd_client_port_2=${pd_client_port_1}
pd_client_port_3=${pd_client_port_1}
pd_peer_port_1=2380
pd_peer_port_2=${pd_peer_port_1}
pd_peer_port_3=${pd_peer_port_1}
tidb_port_1=${global_tidb_port}
tidb_port_2=${global_tidb_port}
tidb_port_3=${global_tidb_port}
tidb_status_port_1=10080
tidb_status_port_2=${tidb_status_port_1}
tidb_status_port_3=${tidb_status_port_1}
tikv_port_1=20160
tikv_port_2=${tikv_port_1}
tikv_port_3=${tikv_port_1}
tikv_status_port_1=20180
tikv_status_port_2=${tikv_status_port_1}
tikv_status_port_3=${tikv_status_port_1}
tiflash_tcp_port_1=9000
tiflash_tcp_port_2=${tiflash_tcp_port_1}
tiflash_service_port_1=3930
tiflash_service_port_2=${tiflash_service_port_1}
tiflash_proxy_port_1=20170
tiflash_proxy_port_2=${tiflash_proxy_port_1}
tiflash_proxy_status_port_1=20292
tiflash_proxy_status_port_2=${tiflash_proxy_status_port_1}
tiflash_metrics_port_1=8234
tiflash_metrics_port_2=${tiflash_metrics_port_1}
monitoring_port_1=9090
monitoring_ng_port_1=12020
grafana_web_port_1=3000
alertma_web_port_1=9093
alertma_web_cluster_port_1=9094
  • [管理节点]-替换部署脚本中的参数
#.生成一个demo配置以供语法参考
# tiup cluster template > /tmp/tmp_topology_demo.yaml

#.作者自定义的模板(依据规划的3节点集群)
curl http://iso.sqlfans.cn/tidb/config/topology_cluster.yaml > /tmp/tmp_topology_prod.yaml

#.替换部署脚本中的参数
sed -i "s/global_tidb_port/${global_tidb_port}/" /tmp/tmp_topology_prod.yaml
sed -i "s/global_block_cache/${global_block_cache}/" /tmp/tmp_topology_prod.yaml
sed -i "s/node_ip_1/${node_ip_1}/" /tmp/tmp_topology_prod.yaml
sed -i "s/node_ip_2/${node_ip_2}/" /tmp/tmp_topology_prod.yaml
sed -i "s/node_ip_3/${node_ip_3}/" /tmp/tmp_topology_prod.yaml
sed -i "s/node_ssh_port_1/${node_ssh_port_1}/" /tmp/tmp_topology_prod.yaml
sed -i "s/node_ssh_port_2/${node_ssh_port_2}/" /tmp/tmp_topology_prod.yaml
sed -i "s/node_ssh_port_3/${node_ssh_port_3}/" /tmp/tmp_topology_prod.yaml
sed -i "s/monitored_node_port_1/${monitored_node_port_1}/" /tmp/tmp_topology_prod.yaml
sed -i "s/monitored_blackbox_port_1/${monitored_blackbox_port_1}/" /tmp/tmp_topology_prod.yaml
sed -i "s/pd_client_port_1/${pd_client_port_1}/" /tmp/tmp_topology_prod.yaml
sed -i "s/pd_client_port_2/${pd_client_port_2}/" /tmp/tmp_topology_prod.yaml
sed -i "s/pd_client_port_3/${pd_client_port_3}/" /tmp/tmp_topology_prod.yaml
sed -i "s/pd_peer_port_1/${pd_peer_port_1}/" /tmp/tmp_topology_prod.yaml
sed -i "s/pd_peer_port_2/${pd_peer_port_2}/" /tmp/tmp_topology_prod.yaml
sed -i "s/pd_peer_port_3/${pd_peer_port_3}/" /tmp/tmp_topology_prod.yaml
sed -i "s/tidb_port_1/${tidb_port_1}/" /tmp/tmp_topology_prod.yaml
sed -i "s/tidb_port_2/${tidb_port_2}/" /tmp/tmp_topology_prod.yaml
sed -i "s/tidb_port_3/${tidb_port_3}/" /tmp/tmp_topology_prod.yaml
sed -i "s/tidb_status_port_1/${tidb_status_port_1}/" /tmp/tmp_topology_prod.yaml
sed -i "s/tidb_status_port_2/${tidb_status_port_2}/" /tmp/tmp_topology_prod.yaml
sed -i "s/tidb_status_port_3/${tidb_status_port_3}/" /tmp/tmp_topology_prod.yaml
sed -i "s/tikv_port_1/${tikv_port_1}/" /tmp/tmp_topology_prod.yaml
sed -i "s/tikv_port_2/${tikv_port_2}/" /tmp/tmp_topology_prod.yaml
sed -i "s/tikv_port_3/${tikv_port_3}/" /tmp/tmp_topology_prod.yaml
sed -i "s/tikv_status_port_1/${tikv_status_port_1}/" /tmp/tmp_topology_prod.yaml
sed -i "s/tikv_status_port_2/${tikv_status_port_2}/" /tmp/tmp_topology_prod.yaml
sed -i "s/tikv_status_port_3/${tikv_status_port_3}/" /tmp/tmp_topology_prod.yaml
sed -i "s/tiflash_tcp_port_1/${tiflash_tcp_port_1}/" /tmp/tmp_topology_prod.yaml
sed -i "s/tiflash_tcp_port_2/${tiflash_tcp_port_2}/" /tmp/tmp_topology_prod.yaml
sed -i "s/tiflash_service_port_1/${tiflash_service_port_1}/" /tmp/tmp_topology_prod.yaml
sed -i "s/tiflash_service_port_2/${tiflash_service_port_2}/" /tmp/tmp_topology_prod.yaml
sed -i "s/tiflash_proxy_port_1/${tiflash_proxy_port_1}/" /tmp/tmp_topology_prod.yaml
sed -i "s/tiflash_proxy_port_2/${tiflash_proxy_port_2}/" /tmp/tmp_topology_prod.yaml
sed -i "s/tiflash_proxy_status_port_1/${tiflash_proxy_status_port_1}/" /tmp/tmp_topology_prod.yaml
sed -i "s/tiflash_proxy_status_port_2/${tiflash_proxy_status_port_2}/" /tmp/tmp_topology_prod.yaml
sed -i "s/tiflash_metrics_port_1/${tiflash_metrics_port_1}/" /tmp/tmp_topology_prod.yaml
sed -i "s/tiflash_metrics_port_2/${tiflash_metrics_port_2}/" /tmp/tmp_topology_prod.yaml
sed -i "s/monitoring_port_1/${monitoring_port_1}/" /tmp/tmp_topology_prod.yaml
sed -i "s/monitoring_ng_port_1/${monitoring_ng_port_1}/" /tmp/tmp_topology_prod.yaml
sed -i "s/grafana_web_port_1/${grafana_web_port_1}/" /tmp/tmp_topology_prod.yaml
sed -i "s/alertma_web_port_1/${alertma_web_port_1}/" /tmp/tmp_topology_prod.yaml
sed -i "s/alertma_web_cluster_port_1/${alertma_web_cluster_port_1}/" /tmp/tmp_topology_prod.yaml
cat /tmp/tmp_topology_prod.yaml

部署集群

  • [管理节点]-离线安装 TiDB 社区版 8.5.2
su - tidb
wget -c https://download.pingcap.org/tidb-community-server-v8.5.2-linux-amd64.tar.gz
# wget -c http://oss.sqlfans.cn/tidb/tidb-community-server-v8.5.2-linux-amd64.tar.gz
tar zxvf tidb-community-server-v8.5.2-linux-amd64.tar.gz
sh ./tidb-community-server-v8.5.2-linux-amd64/local_install.sh
source /home/tidb/.bash_profile
tiup list
  • [管理节点]-创建配置文件
cat /tmp/tmp_topology_prod.yaml > /home/tidb/topology.yaml
cat /home/tidb/topology.yaml | grep "host"
  • [管理节点]-检查环境
#.检查主机参数是否合标准, 密码输入 Admin_147
tiup cluster check /home/tidb/topology.yaml --user tidb -p

#.遇到如下Fail, 作者忽略, 后面貌似不影响
# 192.168.31.102  disk  Fail  multiple components tikv:/data/tidb_4000/data/tikv-20160,tiflash:/data/tidb_4000/data/tiflash-9000 are using the same partition 192.168.31.102:/ as data dir

#.对异常参数提供修复方式, 权限不足的项请手动修复, 确保所有项 pass
tiup cluster check /home/tidb/topology.yaml --apply --user tidb -p

#.检查磁盘性能
tiup cluster check /home/tidb/topology.yaml --enable-disk --user tidb -p
  • [管理节点]-部署集群,并设置服务自启动,示例集群版本 v8.5.2,名称为 tidb_test
#.初始化集群, 是否继续输入 y
tiup cluster deploy tidb_test v8.5.2 /home/tidb/topology.yaml --user tidb -p

#.启动集群, 保存一下 tidb 服务 root 初始密码
tiup cluster start tidb_test --init

#.检查集群状态
tiup cluster list
tiup cluster display tidb_test

#.设置组件服务随主机自启动
tiup cluster enable tidb_test

  • [任一节点]:登录测试,所有监听了 4000 端口的 tidb_servers 节点均可登录
#.安装mysql客户端
sudo yum install -y -q mysql

#.登录测试,密码请参考初始化过程的输出内容
mysql -h 127.0.0.1 -P 4000 -u root -p

mysql> select tidb_version();
mysql> select user,host from mysql.user;
mysql> alter user 'root'@'%' identified by 'Admin_147';
mysql> flush privileges;
mysql> exit;

#.使用root密码登录
mysql -h 127.0.0.1 -P 4000 -u root -pAdmin_147 -e "select version();"
  • [任一节点]:建库测试,示例 在节点1创建 tidb_101、在节点2创建 tidb_102、在节点3上确认2个库已创建

👉 注:tidb集群中任一部署了 tidb_servers 组件(监听 4000 端口)的节点均可以操作数据库

mysql -h 192.168.31.101 -P 4000 -u root -pAdmin_147 -e "create database if not exists tidb_101;"
mysql -h 192.168.31.102 -P 4000 -u root -pAdmin_147 -e "create database if not exists tidb_102;"
mysql -h 192.168.31.103 -P 4000 -u root -pAdmin_147 -e "show databases like 'tidb%';"

附录

修改控制台默认密码

  • 登录如下控制台,修改初始密码,示例管理节点ip为 192.168.31.101
web控制台 url地址 初始账密 建议账密
Grafana http://192.168.31.101:3000 admin/admin admin/Admin_147
Prometheus http://192.168.31.101:9090 -/- -/-
TiDB 控制台 http://192.168.31.102:2379/dashboard root/空 root/Admin_147

集群信息

如何销毁集群和卸载

  • 关于集群的销毁,下面以 tidb_test 为例:
#.查看集群列表
tiup cluster list
tiup cluster display tidb_test

#.将集群升级到指定版本
# tiup cluster upgrade <集群名> <v8.5.2>
# tiup cluster upgrade tidb_test v8.5.2

#.重命名集群
# tiup cluster rename <集群名> <新的集群名>
# tiup cluster rename tidb_test tidb_test_deleted
tiup cluster list

#.关闭集群
tiup cluster stop tidb_test

#.销毁集群会关闭服务,清空集群数据(数据目录和部署目录),且无法恢复
tiup cluster stop tidb_test -y
tiup cluster clean tidb_test --all -y
tiup cluster destroy tidb_test -y
  • 待所有集群全部销毁之后,在root用户下删除 tidb 账号和目录即可完成卸载
#.在root用户下执行
userdel -r tidb
Copyright © www.sqlfans.cn 2021 - 2026 All Right Reserved更新时间: 2026-07-27 12:20:35

results matching ""

    No results matching ""