TiDB 学习第 3 天:TIDB 正式环境 TiDB-Ansible 部署

x33g5p2x  于2021-12-19 转载在 其他  
字(6.9k)|赞(0)|评价(0)|浏览(347)

对于生产环境,须使用 TiDB-Ansible 部署 TiDB 集群。Ansible 是一款自动化运维工具,TiDB-Ansible 是 PingCAP 基于 Ansible playbook 功能编写的集群部署工具。本文档介绍如何使用 TiDB-Ansible 部署一个完整的 TiDB 集群。

一、搭建集群前提准备

  • 生产环境中搭建会有硬件检验,最适合的硬件是SSD(固盘)
  • 时间同步
  • 需要严格按照官网上安装,目录的更改涉及到权限的问题
  • 服务器之间内网要通
  • 服务器之间需要配置免密登陆

部署中控机一台:

  • 中控机可以是部署目标机器中的某一台。
  • 推荐安装 CentOS 7.3 及以上版本 Linux 操作系统(默认包含 Python 2.7)。
  • 该机器需开放外网访问,用于下载 TiDB 及相关软件安装包。

二、安装步骤

如果你的部署目标机器时间、时区设置一致,已开启 NTP 服务且在正常同步时间,此步骤可忽略。可参考如何检测 NTP 服务是否正常。

1、NTP 服务检测:
# 查看ntp时间状态(是否运行)
  sudo systemctl status ntpd.service
  ● ntpd.service - Network Time Service
   Loaded: loaded (/usr/lib/systemd/system/ntpd.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2019-04-01 15:00:39 CST; 29min ago
 Main PID: 3206 (ntpd)
   CGroup: /system.slice/ntpd.service
           └─3206 /usr/sbin/ntpd -u ntp:ntp -g
           
# 开启服务 
   sudo systemctl start ntpd.service        
   
# 开机自启动
  sudo systemctl enable ntpd.service
2、执行 ntpstat 命令,输出 synchronised to NTP server (正在与 NTP server 同步)表示在正常同步:
ntpstat
 synchronised to NTP server (202.108.6.95) at stratum 3 
   time correct to within 74 ms
   polling server every 128 s
3、以下ntp未正常同步
ntpstat
unsynchronised
4、以下情况为 NTP 服务未正常运行
ntpstat
Unable to talk to NTP daemon. Is it running?
5、安装NTP 服务
sudo yum install ntp ntpdate
 sudo systemctl start ntpd.service
 sudo systemctl enable ntpd.service

三、手工配置 ssh 互信及 sudo 免密码

1、创建用户

以 root 用户依次登录到部署目标机器创建 tidb 用户并设置登录密码。

useradd tidb   #添加用户
 passwd tidb    #修改密码
2、配置 sudo 免密
vi sudo  #编辑sudo文件
tidb ALL=(ALL) NOPASSWD: ALL   #添加用户免密

3、配置ssh免密(登陆到用户TiDB中配置免密)

ssh-keygen -t rsa  执行语句一路回车生成秘钥
ssh-copy-id -i ~/.ssh/id_rsa.pub cdh02 -p 53535 #拷贝公钥到cdh02主机中
ssh-copy-id -i ~/.ssh/id_rsa.pub cdh02 -p 53535 #拷贝公钥到cdh03主机中

4、验证

sudo -su root    # 验证sudo免密是否成功

ssh cdh02 -p 53535# 验证ssh免密登陆是否成功

四、依赖和安装包下载

1、安装系统依赖包(中控机中root下)

CentOS 7 系统,执行以下命令:

# yum -y install epel-release git curl sshpass
# yum -y install python-pip
2、在中控机器上下载 TiDB-Ansible

以 tidb 用户登录中控机并进入 /home/tidb 目录,下载自己想要安装的版本,以下是版本对照信息:

TiDB 版本tidb-ansible tag备注
2.0 版本v2.0.10、v2.0.11最新 2.0 稳定版本,可用于生产环境。
2.1 版本v2.1.1 ~ v2.1.6最新 2.1 稳定版本,可用于生产环境(建议)。
3.0 版本v3.0.0-beta、v3.0.0-beta.1目前是 beta 版本,不建议用于生产环境。
latest 版本None包含最新特性,每日更新,不建议用于生产环境。

使用以下命令从 Github TiDB-Ansible 项目上下载 TiDB-Ansible 相应版本,默认的文件夹名称为 tidb-ansible:
注意:部署和升级 TiDB 集群需使用对应的 tidb-ansible 版本,通过改 inventory.ini 文件中的版本来混用可能会产生一些错误

# 登陆到tidb用户下,下载指定 tag 的 tidb-ansible:
 git clone -b $tag https://github.com/pingcap/tidb-ansible.git
# 下载 latest 版本对应的 tidb-ansible:
 git clone https://github.com/pingcap/tidb-ansible.git

注:请务必按文档操作,将 tidb-ansible 下载到 /home/tidb 目录下,权限为 tidb 用户,不能下载到 /root 下,否则会遇到权限问题。

五、安装

以 tidb用户登录中控机,请务必按以下方式通过 pip 安装 Ansible 及其相关依赖的指定版本,否则会有兼容问题。安装完成后,可通过 ansible --version 查看 Ansible 版本。目前 release-2.0、release-2.1 及 master 版本兼容 Ansible 2.4 及 Ansible 2.5 版本,Ansible 及相关依赖版本记录在 tidb-ansible/requirements.txt 文件中

cd /home/tidb/tidb-ansible   # 进入到tidb家目录下
 sudo pip install -r ./requirements.txt  使用pip安装

六、在中控机上配置部署机器

以 tidb 用户登录中控机,将你的部署目标机器 IP 添加到 hosts.ini 文件 [servers] 区块下

cd tidb-ansible/    # 进入到安装目录下
vi hosts.ini        # 编辑hosts文件,将目标机器加入

执行以下命令,按提示输入部署目标机器 root 用户密码。该步骤将在部署目标机器上创建 tidb 用户,并配置 sudo 规则,配置中控机与部署目标机器之间的 ssh 互信。

ansible-playbook -i hosts.ini create_users.yml -u root -k  #自动部署,如果已经手动部署了可以免去这个步骤

ansible-playbook -i hosts.ini deploy_ntp.yml -u tidb -b    # 自动在目标机器上安装ntp服务

七、在部署目标机器上配置 CPUfreq 调节器模式
如果返回 “Not Available”,表示当前系统不支持配置 CPUfreq,跳过该步骤即可。

ansible -i hosts.ini all -m shell -a "cpupower frequency-set --governor performance" -u tidb -p53535  -b 

ansible-playbook -i hosts.ini deploy_ntp.yml -u -p53535 tidb -b

八、在部署目标机器上添加数据盘 ext4 文件系统挂载参数

atime 是可选建议参数。如果你的数据盘已经格式化成 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 文件添加部署服务器资源,
注: 请使用内网 IP 来部署集群,如果部署目标机器 SSH 端口非默认 22 端口,需添加 ansible_port 变量,如: TiDB1 ansible_host=172.16.10.1 ansible_port = 53535

## TiDB Cluster Part
[tidb_servers]
tidb_servers IP:你的 tidb IP

[tikv_servers]
你分配的 tikv IP1
你分配的 tikv IP2
你分配的 tikv IP3
……

[pd_servers]
你分配的 pd IP

[spark_master]
[spark_slaves]

## Monitoring Part
# prometheus and pushgateway servers
[monitoring_servers]
你的主 IP

[grafana_servers]
你的监控界面 IP

# node_exporter and blackbox_exporter servers
[monitored_servers]
你的 IP1
你的 IP2
你的 IP3
……

[alertmanager_servers]
你的主 IP
[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      #默认的文件夹如果没有需要手动创建

## Connection
# ssh via normal user
ansible_user = tidb
ansible_port = 53535 
cluster_name = test-cluster

tidb_version = v2.0.11

# process supervision, [systemd, supervise]
process_supervision = supervise

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,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
2、创建数据目录,配置文件中有体现
# 在/home/tidb/目录下创建deploy文件夹
mkdir deploy
cd deploy
mkdir scripts   #创建scripts文件夹 scripts 目录下一般存放启动 关闭的脚本
3、执行 local_prepare.yml playbook,联网下载 TiDB binary 到中控机:
ansible-playbook local_prepare.yml
4、初始化系统环境,修改内核参数
ansible-playbook bootstrap.yml   # 这一步骤会做系统的硬盘检测,生产环境中必须执行这一步,否则后续会有性能问题
ansible-playbook bootstrap.yml --extra-vars "dev_mode=True"   # 如果只是搭建伪生产环境,可以跳过硬盘检测,直接执行这一句即可
Congrats! All goes well. :-)   # 返回这个信息即为成功
5、部署TiDB集群软件
ansible-playbook deploy.yml    # 一般情况下这一步不需要自己创建文件夹,如果有需要可以自己创建
6、启动TiDB集群
ansible-playbook start.yml
7、测试连接集群

测试连接 TiDB 集群,推荐在 TiDB 前配置负载均衡来对外统一提供 SQL 接口。使用 MySQL 客户端连接测试,TCP 4000 端口是 TiDB 服务默认端口。

mysql -u root -h 你的监控界面 IP -P 4000
8、通过浏览器访问监控平台
地址:http://IP 默认帐号密码是:admin/admin

至此,TIDB 正式环境搭建完成 :)

相关文章