原文来源:https://tidb.net/blog/df9caf7d
【是否原创】否
【作者】@seiang
【首发渠道链接】http://www.seiang.com/?p=1185
最近是沉迷于 TiDB,无法自拔,从 TiDB 集群部署到集群压测、高可用测试、再到参数调优,最后到线上业务从 MySQL 迁移到 TiDB,整个过程下来,感觉整个学习成本还是比较高,不管是 TiDB 还是分布式数据库,要学习的内容还是非常的多。本文主要分享生产环境部署 TiDB v5.0.3 版本集群过程,供大家参考学习。
废话不多说,直接开整~
一、TiDB 集群拓扑规划
| 实例 | 个数 | IP || ———————————- | – | ———— || TiDB | 3 | 10.30.128.1 || | | 10.30.128.2 || | | 10.30.128.3 || PD | 3 | 10.30.128.1 || | | 10.30.128.2 || | | 10.30.128.3 || TiKV | 5 | 10.30.128.4 || | | 10.30.128.5 || | | 10.30.128.6 || | | 10.30.128.7 || | | 10.30.128.8 || Tiflash | 1 | 10.30.128.9 || Monitoring & Grafana&alertmanager | 1 | 10.30.128.10 || 中控 | 1 | 10.30.128.11 |
** 说明:**TiDB Server 节点和 PD 采用混合部署方式,如果资源足够,可以考虑单独部署;
二、TiDB 环境与系统配置检查
1. 在 TiKV 部署目标机器上添加数据盘 EXT4 文件系统挂载参数
生产环境部署,建议使用 EXT4 类型文件系统的 NVME 类型的 SSD 磁盘存储 TiKV 数据文件。
2. 检测及关闭系统 swap
TiDB 运行需要有足够的内存,并且不建议使用 swap 作为内存不足的缓冲,这会降低性能。因此建议永久关闭系统 swap,并且不要使用 swapoff -a 方式关闭,否则重启机器后该操作会失效。
建议执行以下命令关闭系统 swap:
echo "vm.swappiness = 0">> /etc/sysctl.conf
swapoff -a
sysctl -p
复制代码
3. 检测及安装 NTP 服务
TiDB 是一套分布式数据库系统,需要节点间保证时间的同步,从而确保 ACID 模型的事务线性一致性。
4. 检查和配置操作系统优化参数
在生产系统的 TiDB 中,建议对操作系统进行如下的配置优化:
(1)关闭透明大页(即 Transparent Huge Pages,缩写为 THP)。 数据库的内存访问模式往往是稀疏的而非连续的。当高阶内存碎片化比较严重时,分配 THP 页面会出现较高的延迟。
执行以下命令查看透明大页的开启状态。
cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never 表示透明大页处于启用状态,需要关闭。
复制代码
关闭透明大页
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
复制代码
(2)将存储介质的 I/O 调度器设置为 noop。 对于高速 SSD 存储介质,内核的 I/O 调度操作会导致性能损失。将调度器设置为 noop 后,内核不做任何操作,直接将 I/O 请求下发给硬件,以获取更好的性能。同时,noop 调度器也有较好的普适性。
执行以下命令查看数据目录所在磁盘的 I/O 调度器。
cat /sys/block/sd[bc]/queue/scheduler
复制代码
noop [deadline] cfq 表示磁盘的 I/O 调度器使用 deadline,需要进行修改。
执行以下命令验证数据目录所在磁盘的 I/O 调度器。
cat /sys/block/sd[bc]/queue/scheduler
复制代码
(3)为调整 CPU 频率的 cpufreq 模块选用 performance 模式。 将 CPU 频率固定在其支持的最高运行频率上,不进行动态调节,可获取最佳的性能。
执行以下命令查看 cpufreq 模块选用的节能策略。
cpupower frequency-info --policy
analyzing CPU 0:
Unable to determine current policy
复制代码
如果是虚拟机或者云主机,则不需要调整,命令输出通常为 Unable to determine current policy。
创建 CPU 节能策略配置服务。
cat >> /etc/systemd/system/cpupower.service << EOF
[Unit]
Description=CPU performance
[Service]
Type=oneshot
ExecStart=/usr/bin/cpupower frequency-set --governor performance
[Install]
WantedBy=multi-user.target
EOF
复制代码
执行以下命令修改 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
复制代码
执行以下命令配置用户的 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
复制代码
5. 安装 numactl 工具
在生产环境中,因为硬件机器配置往往高于需求,为了更合理规划资源,会考虑单机多实例部署 TiDB 或者 TiKV。NUMA 绑核工具的使用,主要为了防止 CPU 资源的争抢,引发性能衰退。
6. SSH 互信及 sudo 免密码
(1)以 root 用户依次登录到部署目标机器创建 tidb 用户并设置登录密码。
useradd tidb && echo 'tidb' | passwd --stdin tidb
复制代码
(2)执行以下命令,将 tidb ALL=(ALL) NOPASSWD: ALL 添加到文件末尾,即配置好 sudo 免密码。
visudo
tidb ALL=(ALL) NOPASSWD: ALL
复制代码
(3)以 tidb 用户登录到中控机,执行以下命令。按提示输入部署目标机器 tidb 用户密码,执行成功后即创建好 SSH 互信,其他机器同理。新建的 tidb 用户下没有 .ssh 目录,需要执行生成 rsa 密钥的命令来生成 .ssh 目录。
如果要在中控机上部署 TiDB 组件,需要为中控机和中控机自身配置互信。
ssh-keygen
ssh-copy-id -i ~/.ssh/id_rsa.pub 10.30.xx.xx
复制代码
(4)以 tidb 用户登录中控机,通过 ssh 的方式登录目标机器 IP。如果不需要输入密码并登录成功,即表示 SSH 互信配置成功。
(5)以 tidb 用户登录到部署目标机器后,执行以下命令,不需要输入密码并切换到 root 用户,表示 tidb 用户 sudo 免密码配置成功。
三、集群部署
1. 拓扑模板
集群初始化配置文件可以通过 TiUP 工具在中控机上面创建 YAML 格式配置文件 topology.yaml:
(1)配置文件
# # Global variables are applied to all deployments and used as the default value of
# # # the deployments if a specific deployment value is missing.
global:
user: "tidb"
ssh_port: 22
deploy_dir: "/data/tidb-deploy"
data_dir: "/data/tidb-data"
monitored:
node_exporter_port: 9100
blackbox_exporter_port: 9115
server_configs:
tidb:
log.slow-threshold: 300
tikv:
readpool.storage.use-unified-pool: false
readpool.coprocessor.use-unified-pool: true
pd:
replication.enable-placement-rules: true
tiflash:
profiles.default.max_memory_usage: 0
profiles.default.max_memory_usage_for_all_queries: 0
pd_servers:
- host: 10.30.128.1
- host: 10.30.128.2
- host: 10.30.128.3
tidb_servers:
- host: 10.30.128.1
- host: 10.30.128.2
- host: 10.30.128.3
tikv_servers:
- host: 10.30.128.4
- host: 10.30.128.5
- host: 10.30.128.6
- host: 10.30.128.7
- host: 10.30.128.8
tiflash_servers:
- host: 10.30.128.9
data_dir: /data/tiflash/data
deploy_dir: /data/tiflash/deploy
monitoring_servers:
- host: 10.30.128.10
grafana_servers:
- host: 10.30.128.10
alertmanager_servers:
- host: 10.30.128.10
复制代码
2. 使用 TiUP 部署 TiDB 集群
(1)离线部署 TiUP 组件
在 官方下载页面 选择对应版本的 TiDB server 离线镜像包(包含 TiUP 离线组件包)
(2)部署离线环境 TiUP 组件
将离线包发送到目标集群的中控机后,执行以下命令安装 TiUP 组件:
tar xzvf tidb-community-server-${version}-linux-amd64.tar.gz && \"
sh tidb-community-server-${version}-linux-amd64/local_install.sh && \"
source /home/tidb/.bash_profile
复制代码
local_install.sh 脚本会自动执行 tiup mirror set tidb-community-server-version−linux−amd64命令将当前镜像地址设置为tidb−community−server−{version}-linux-amd64。
(3)执行部署命令
执行 deploy 命令前,先使用 check 及 check –apply 命令,检查和自动修复集群存在的潜在风险:
tiup cluster check ./topology.yaml --user tidb
tiup cluster check ./topology.yaml --apply --user tidb
复制代码
然后执行 deploy 命令部署 TiDB 集群:
tiup cluster deploy tidb-prod001 v5.0.3 ./topology.yaml --user tidb
复制代码
预期日志结尾输出会有 Deployed cluster tidb-prod001
successfully 关键词,表示部署成功。
(5)查看 TiUP 管理的集群情况
$ tiup cluster list
Starting component `cluster`: /home/tidb/.tiup/components/cluster/v1.5.2/tiup-cluster list
Name User Version Path PrivateKey
---- ---- ------- ---- ----------
tidb-prod001 tidb v5.0.3 /home/tidb/.tiup/storage/cluster/clusters/tidb-prod001 /home/tidb/.tiup/storage/cluster/clusters/tidb-prod001/ssh/id_rsa
复制代码
(6)启动集群
$ tiup cluster start tidb-prod001
复制代码
预期结果输出 Started cluster tidb-prod001
successfully 标志启动成功。
(7)查看集群的运行状态
(8)验证集群运行状态
a、通过 http://10.30.128.10:3000/ 登录 Grafana 监控,默认用户名及密码为 admin/admin
点击 Overview 监控页面检查 TiDB 端口和负载监控信息。
b、登录数据库执行简单 DML/DDL 操作和查询 SQL 语句
mysql -u root -h 10.30.128.1 -P 4000
mysql> select tidb_version()\"G
*************************** 1. row ***************************
tidb_version(): Release Version: v5.0.3
Edition: Community
Git Commit Hash: 0b5c1546892b3b4195485303c70f30492c4b1d71
Git Branch: heads/refs/tags/v5.0.3
UTC Build Time: 2021-07-01 15:45:42
GoVersion: go1.13
Race Enabled: false
TiKV Min Version: v3.0.0-60965b006877ca7234adaced7890d7b029ed1306
Check Table Before Drop: false
1 row in set (0.00 sec)
复制代码
部署的流程大概就先介绍怎么多吧,后续会不阶段的分享一些 TiDB 相关知识以及一些问题处理方法等,当然也会和 MySQL 进行对比,SQL 语法,执行计划、优化器、事务等等;
最后,也欢迎大家关注作者的微信公众号:
评论