使用Ansible 部署TiDB集群

0.509字数 2504阅读 454

概述

        对于生产环境,须使用 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

推荐阅读更多精彩内容