概述
对于生产环境,须使用 TiDB-Ansible 部署 TiDB 集群。如果只是用于测试 TiDB 或体验 TiDB 的特性,建议使用 Docker Compose 在单机上快速部署 TiDB 集群 。
Ansible 是一款自动化运维工具,TiDB-Ansible是 PingCAP 基于 Ansible playbook 功能编写的集群部署工具。本文档介绍如何使用 TiDB-Ansible 部署一个完整的 TiDB 集群。
准备机器
在中控机上安装系统依赖包
# yum -y install epel-release git curl sshpass
# yum -y install python-pip
在中控机上创建 tidb 用户,并生成 ssh key
以 root 用户登录中控机,执行以下命令
创建 tidb 用户
# useradd -m -d /home/tidb tidb
设置 tidb 用户密码
# passwd tidb
配置 tidb 用户 sudo 免密码,将 tidb ALL=(ALL) NOPASSWD: ALL 添加到文件末尾即可。
# visudo
tidb ALL=(ALL) NOPASSWD: ALL
生成 ssh key: 执行 su 命令从 root 用户切换到 tidb 用户下。
# su - tidb
创建 tidb 用户 ssh key, 提示 Enter passphrase 时直接回车即可。执行成功后,ssh 私钥文件为/home/tidb/.ssh/id_rsa , ssh 公钥文件为 /home/tidb/.ssh/id_rsa.pub 。
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/tidb/.ssh/id_rsa):
Created directory '/home/tidb/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/tidb/.ssh/id_rsa.
Your public key has been saved in /home/tidb/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:eIBykszR1KyECA/h0d7PRKz4fhAeli7IrVphhte7/So tidb@172.16.10.49
The key's randomart image is:
+---[RSA 2048]----+
|=+o+.o. |
|o=o+o.oo |
| .O.=.= |
| . B.B + |
|o B * B S |
| * + * + |
| o + . |
| o E+ . |
|o ..+o. |
+----[SHA256]-----+
在中控机器上下载 TiDB-Ansible
以 tidb 用户登录中控机并进入 /home/tidb 目录。使用以下命令从 Github TiDB-Ansible 项目上下载 TiDB-Ansible 相应分支,默认的文件夹名称为 tidb-ansible 。
$ git clone -b release-2.0 https://github.com/pingcap/tidb-ansible.git
在中控机器上安装 Ansible 及其依赖
以 tidb 用户登录中控机,请务必按以下方式通过 pip 安装 Ansible 及其相关依赖的指定版本,否则会有兼容问题。安装完成后,可通过 ansible --version 查看 Ansible 版本。Ansible 及相关依赖版本记录在 tidb-ansible/requirements.txt 文件中。
$ cd /home/tidb/tidb-ansible
$ sudo pip install -r ./requirements.txt
$ ansible --version
ansible 2.6.6
在中控机上配置部署机器 ssh 互信及 sudo 规则
以 tidb 用户登录中控机,将你的部署目标机器 IP 添加到 hosts.ini 文件 [servers] 区块下。
$ cd /home/tidb/tidb-ansible
$ vi hosts.ini
[servers]
10.10.2.241
10.10.2.242
10.10.2.243
10.10.2.244
10.10.2.245
10.10.2.246
[all:vars]
username = tidb
ntp_server = pool.ntp.org
执行以下命令,按提示输入部署目标机器 root 用户密码。该步骤将在部署目标机器上创建 tidb 用户,并配置 sudo 规则,配置中控机与部署目标机器之间的 ssh 互信。
$ ansible-playbook -i hosts.ini create_users.yml -u root -k
在部署目标机器上安装 NTP 服务
如果你的部署目标机器时间、时区设置一致,已开启 NTP 服务且在正常同步时间,此步骤可忽略。可参考如何检测 NTP 服务是否正常。
该步骤将在部署目标机器上使用系统自带软件源联网安装并启动 NTP 服务,服务使用安装包默认的 NTP server 列表,见配置文件 /etc/ntp.conf 中 server 参数,如果使用默认的 NTP server,你的机器需要连接外网。 为了让 NTP 尽快开始同步,启动 NTP 服务前,系统会 ntpdate hosts.ini 文件中的ntp_server 一次,默认为 pool.ntp.org ,也可替换为你的 NTP server。
以 tidb 用户登录中控机,执行以下命令:
$ cd /home/tidb/tidb-ansible
$ ansible-playbook -i hosts.ini deploy_ntp.yml -u tidb -b
在部署目标机器上配置 CPUfreq 调节器模式
为了让 CPU 发挥最大性能,请将 CPUfreq 调节器模式设置为 performance 模式。
你可以查看使用 CPUFREQ 调控器文档, 了解更多 CPUFREQ 相关信息。
你可以通过 cpupower 命令查看系统支持的调节器模式:
# cpupower frequency-info --governors
analyzing CPU 0:
available cpufreq governors: performance powersave
本例中系统支持设置 performance 和 powersave 模式。如果返回 “Not Available”,表示当前系统不支持配置 CPUfreq,跳过该步骤即可。
# cpupower frequency-info --governors
analyzing CPU 0:
available cpufreq governors: Not Available
你可以通过 cpupower 命令查看系统当前的 CPUfreq 调节器模式:
# cpupower frequency-info --policy
analyzing CPU 0:
current policy: frequency should be within 1.20 GHz and 3.20 GHz.
The governor "powersave" may decide which speed to use
within this range.
本例中当前配置是 powersave 模式,你可以通过以下命令设置为 performance 模式。
# cpupower frequency-set --governor performance
你也可以通过以下命令在部署目标机器上批量设置:
$ ansible -i hosts.ini all -m shell -a "cpupower frequency-set --governor performance" -u tidb -b
在部署目标机器上添加数据盘 ext4 文件系统挂载参数
部署目标机器数据盘请格式化成 ext4 文件系统,挂载时请添加 nodelalloc 和 noatime 挂载参数。 nodelalloc是必选参数,否则 Ansible 安装时检测无法通过,noatime 是可选建议参数。
如果你的数据盘已经格式化成 ext4 并挂载,可先执行 umount 命令卸载,从编辑 /etc/fstab 文件步骤开始执行,添加挂载参数重新挂载即可。
# umount /dev/nvme0n1
下面以 /dev/nvme0n1 数据盘为例:
查看数据盘
# fdisk -l
Disk /dev/nvme0n1: 1000 GB
创建分区表
# parted -s -a optimal /dev/nvme0n1 mklabel gpt -- mkpart primary ext4 1 -1
格式化文件系统
# mkfs.ext4 /dev/nvme0n1
查看数据盘分区 UUID,本例中 nvme0n1 的 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 ext4 c51eb23b-195c-4061-92a9-3fad812cc12f
编辑 /etc/fstab 文件,添加 nodelalloc 挂载参数
# vi /etc/fstab
UUID=c51eb23b-195c-4061-92a9-3fad812cc12f /data1 ext4 defaults,nodelalloc,noatime 0 2
挂载数据盘
# mkdir /data1
# mount -a
执行以下命令,如果文件系统为 ext4,并且挂载参数中包含 nodelalloc 表示生效:
# mount -t ext4
/dev/nvme0n1 on /data1 type ext4 (rw,noatime,nodelalloc,data=ordered)
分配机器资源,编辑 inventory.ini 文件
以 tidb 用户登录中控机, inventory.ini 文件路径为 /home/tidb/tidb-ansible/inventory.ini 。
注: 请使用内网 IP 来部署集群,如果部署目标机器 SSH 端口非默认 22 端口,需添加 ansible_port 变量,如:ansible_port=60022
标准 TiDB 集群需要 6 台机器:
2 个 TiDB 节点
3 个 PD 节点
3 个 TiKV 节点,第一台 TiDB 机器同时用作监控机
默认情况下,单台机器上只需部署一个 TiKV 实例。如果你的 TiKV 部署机器 CPU 及内存配置是部署建议的两倍或以上,并且拥有两块 SSD 硬盘或单块容量超 2T 的 SSD 硬盘,可以考虑部署两实例,但不建议部署两个以上实例。
## TiDB Cluster Part
[tidb_servers]
10.10.2.241
10.10.2.242
[tikv_servers]
10.10.2.244
10.10.2.245
10.10.2.246
[pd_servers]
10.10.2.241
10.10.2.242
10.10.2.243
[spark_master]
[spark_slaves]
## Monitoring Part
# prometheus and pushgateway servers
[monitoring_servers]
10.10.2.243
[grafana_servers]
10.10.2.243
# node_exporter and blackbox_exporter servers
[monitored_servers]
10.10.2.243
[alertmanager_servers]
10.10.2.243
[kafka_exporter_servers]
## Binlog Part
[pump_servers:children]
tidb_servers
[drainer_servers]
## Group variables
[pd_servers:vars]
# location_labels = ["zone","rack","host"]
## Global variables
[all:vars]
#deploy_dir = /home/tidb/deploy
deploy_dir = /data
## Connection
# ssh via normal user
ansible_user = tidb
ansible_port= 60022
cluster_name = test-cluster
tidb_version = v2.0.8
# process supervision, [systemd, supervise]
process_supervision = systemd
timezone = Asia/Shanghai
enable_firewalld = False
# check NTP service
enable_ntpd = True
set_hostname = False
## binlog trigger
enable_binlog = False
# zookeeper address of kafka cluster for binlog, example:
# zookeeper_addrs = "192.168.0.11:2181,192.168.0.12:2181,192.168.0.13:2181"
zookeeper_addrs = ""
# kafka cluster address for monitoring, example:
# kafka_addrs = "192.168.0.11:9092,192.168.0.12:9092,192.168.0.13:9092"
kafka_addrs = ""
# store slow query log into seperate file
enable_slow_query_log = False
# enable TLS authentication in the TiDB cluster
enable_tls = False
# KV mode
deploy_without_tidb = False
# Optional: Set if you already have a alertmanager server.
# Format: alertmanager_host:alertmanager_port
alertmanager_target = ""
grafana_admin_user = "admin"
grafana_admin_password = "admin"
### Collect diagnosis
collect_log_recent_hours = 2
enable_bandwidth_limit = True
# default: 10Mb/s, unit: Kbit/s
collect_bandwidth_limit = 10000
部署任务
ansible-playbook 执行 Playbook 时默认并发为 5,部署目标机器较多时可添加 -f 参数指定并发,如ansible-playbook deploy.yml -f 10
1、确认 tidb-ansible/inventory.ini 文件中 ansible_user = tidb ,本例使用 tidb 用户作为服务运行用户,配置如下:
ansible_user 不要设置成 root 用户, tidb-ansible 限制了服务以普通用户运行。
## Connection
# ssh via normal user
ansible_user=tidb
执行以下命令如果所有 server 返回 tidb 表示 ssh 互信配置成功。
$ansible -i inventory.ini all -m shell -a 'whoami'
执行以下命令如果所有 server 返回 root 表示 tidb 用户 sudo 免密码配置成功。
$ansible -i inventory.ini all -m shell -a 'whoami' -b
执行 local_prepare.yml playbook,联网下载 TiDB binary 到中控机:
$ansible-playbook local_prepare.yml
初始化系统环境,修改内核参数
$ansible-playbook bootstrap.yml
部署 TiDB 集群软件
$ansible-playbook deploy.yml
注 :Grafana Dashboard 上的 Report 按钮可用来生成 PDF 文件,此功能依赖 fontconfig 包和英文字体。如需使用该功能,登录 grafana_servers 机器,用以下命令安装:
$ sudo yum install fontconfig open-sans-fonts
启动 TiDB 集群
$ansible-playbook start.yml
测试集群
测试连接 TiDB 集群,推荐在 TiDB 前配置负载均衡来对外统一提供 SQL 接口。
使用 MySQL 客户端连接测试,TCP 4000 端口是 TiDB 服务默认端口。
$mysql -u root -h 10.10.2.241 -P 4000
通过浏览器访问监控平台。
地址:http://10.10.2.243:3000 默认帐号密码是: admin / admin