Ansible 是一款自动化运维工具,TiDB-Ansible 是 PingCAP 基于 Ansible playbook 功能编写的集群部署工具。使用 TiDB-Ansible 可以快速部署一个完整的 TiDB 集群。
1.以 root 用户登录中控机
[root@tidb ~]# yum -y install epel-release git curl sshpass
[root@tidb ~]# yum -y install python-pip
2.在中控机上创建 tidb 用户,并生成 ssh key,用于实现集群机器免密码登陆
[root@tidb ~]# useradd -m -d /home/tidb tidb
[root@tidb ~]# passwd tidb
3.配置 tidb 用户 sudo 免密码,将 tidb ALL=(ALL) NOPASSWD: ALL 添加到文件末尾即可。
[root@tidb ~]# visudo
tidb ALL=(ALL) NOPASSWD: ALL
4.从 root 用户切换到 tidb 用户下,创建 tidb 用户 ssh key, 提示 Enter passphrase 时直接回车即可。执行成功后,ssh 私钥文件为 /home/tidb/.ssh/id_rsa, ssh 公钥文件为 /home/tidb/.ssh/id_rsa.pub
[root@tidb ~]# su - tidb
[user@tidb ~]$ ssh-keygen -t rsa
..
Enter passphrase (empty for no passphrase): //直接回车
Enter same passphrase again: //直接回车
...
+---[RSA 2048]----+
|=+o+.o. |
|o=o+o.oo |
| .O.=.= |
| . B.B + |
|o B * B S |
| * + * + |
| o + . |
| o E+ . |
|o ..+o. |
+----[SHA256]-----+
4.在中控机器上下载 TiDB-Ansible
以 tidb 用户登录中控机并进入 /home/tidb 目录。下载 2.0 GA 版本:
[user@tidb ~]$ git clone -b release-2.0 https://github.com/pingcap/tidb-ansible.git
注:请务必按文档操作,将 tidb-ansible 下载到 /home/tidb 目录下,权限为 tidb 用户,不要下载到 /root 下,否则会遇到权限问题。
5.在中控机器上安装 Ansible 及其依赖
[user@tidb ~]$ cd /home/tidb/tidb-ansible
[user@tidb ~]$ sudo pip install -r ./requirements.txt
[user@tidb ~]$ ansible --version
ansible 2.5.0
6.在中控机上配置部署机器 ssh 互信及 sudo 规则
以 tidb 用户登录中控机,将你的部署目标机器 IP 添加到 hosts.ini 文件 [servers] 区块下。
[user@tidb ~]$ cd /home/tidb/tidb-ansible
[user@tidb ~]$ vi hosts.ini
[servers]
172.16.10.1
172.16.10.2
172.16.10.3
172.16.10.4
172.16.10.5
172.16.10.6
[all:vars]
username = tidb
ntp_server = pool.ntp.org
7.执行以下命令,按提示输入部署目标机器 root 用户密码。该步骤将在部署目标机器上创建 tidb 用户,并配置 sudo 规则,配置中控机与部署目标机器之间的 ssh 互信。
[user@tidb ~]$ ansible-playbook -i hosts.ini create_users.yml -u root -k //记得输入root的密码
8.为集群机器安装NTP服务
[user@tidb ~]$ cd /home/tidb/tidb-ansible
[user@tidb ~]$ ansible-playbook -i hosts.ini deploy_ntp.yml -u tidb -b
注:如果无法执行,也可手动在集群机上按装服务,因自动安装后,ntp服务因冲突,有可以无法启动,还要到每台虚拟机上手动处理
9.分配机器资源,编辑 inventory.ini 文件
9.1.以 tidb 用户登录中控机,inventory.ini 文件路径为 /home/tidb/tidb-ansible/inventory.ini。
9.2.配置集群列表,方便批量部署
[user@tidb ~]$ vi /home/tidb/tidb-ansible/inventory.ini
[tidb_servers]
172.16.10.1
172.16.10.2
[pd_servers]
172.16.10.1
172.16.10.2
172.16.10.3
[tikv_servers]
172.16.10.4
172.16.10.5
172.16.10.6
[monitoring_servers]
172.16.10.1
[grafana_servers]
172.16.10.1
[monitored_servers]
172.16.10.1
172.16.10.2
172.16.10.3
172.16.10.4
172.16.10.5
172.16.10.6
9.3.部署目录调整,还是在inventory.ini文件里面,部署目录通过 deploy_dir 变量控制,默认全局变量已设置为 /home/tidb/deploy,对所有服务生效。如为某一服务单独设置部署目录,可在配置服务主机列表时配置主机变量,以 TiKV 节点为例,其他服务类推,请务必添加第一列别名,以免服务混布时混淆。
## Global variables
[all:vars]
deploy_dir = /data1/deploy //也可直接设成这样,所有机器都会默认把数据放到这里,因tikv是挂载了data1,相当于放天扩展盘上
TiKV1-1 ansible_host=172.16.10.4 deploy_dir=/data1/deploy
TiKV1-2 ansible_host=172.16.10.5 deploy_dir=/data1/deploy
TiKV1-3 ansible_host=172.16.10.6 deploy_dir=/data1/deploy
9.4.部署时用户名:确认 tidb-ansible/inventory.ini 文件中 ansible_user = tidb,本例使用 tidb 用户作为服务运行用户,ansible_user 不要设置成 root 用户,tidb-ansbile 限制了服务以普通用户运行。
## Connection
# ssh via normal user
ansible_user = tidb
10.开始自动部署:使用tidb帐号登录
10.1.执行以下命令如果所有 server 返回 tidb 表示 ssh 互信配置成功。
[root@tidb ~]# su - tidb
[user@tidb ~]$ ansible -i inventory.ini all -m shell -a 'whoami'
10.2.执行以下命令如果所有 server 返回 root 表示 tidb 用户 sudo 免密码配置成功。
[user@tidb ~]$ ansible -i inventory.ini all -m shell -a 'whoami' -b
10.3.执行 local_prepare.yml playbook,联网下载 TiDB binary 到中控机:
[user@tidb ~]$ ansible-playbook local_prepare.yml
10.4.初始化系统环境,修改内核参数
[user@tidb ~]$ ansible-playbook bootstrap.yml
10.5.部署 TiDB 集群软件
[user@tidb ~]$ ansible-playbook deploy.yml
10.6.启动 TiDB 集群
ansible-playbook start.yml
11.测试集群
通过浏览器访问监控平台。
地址:http://172.16.10.1:3000 默认帐号密码是:admin/admin
注:安装时的报错处理
提示:Ansible FAILED! => playbook: bootstrap.yml; TASK: check_system_optional : Preflight check - Check TiDB server's CPU; message: {"changed": false, "msg": "This machine does not have sufficient CPU to run TiDB, at least 8 cores."}
处理方法:
vim bootstrap.yml 修改该文件 并注释掉以下的内容
- name: check system
hosts: all
any_errors_fatal: true
roles:
- check_system_necessary
# - { role: check_system_optional, when: not dev_mode } 这里注销掉
如果是非SSD 测试的话 ,最好将如下的内容注释掉
- name: tikv_servers machine benchmark
hosts: tikv_servers
gather_facts: false
roles:
# - { role: machine_benchmark, when: not dev_mode } 这里注销掉
提示:Ansible FAILED! => playbook: deploy.yml; TASK: check_system_dynamic : Preflight check - NTP service; message: {"changed": false, "msg": "Make sure NTP service is running and ntpstat is synchronised to NTP server. See https://github.com/pingcap/docs/blob/master/op-guide/ansible-deployment.md#how-to-check-whether-the-ntp-service-is-normal ."}
处理方法:
Centos7 默认有个chronyd服务设置为开机自启动,这个服务导致ntp无法开启自启动
systemctl status chronyd //查看服务
systemctl disable chronyd.service //开启的话关掉它
systemctl enable ntpd.service //把NTP 开机自启动
ntpstat //查看ntp状态
提示:Ansible FAILED! => playbook: deploy.yml; TASK: check_system_dynamic : Preflight check - Check swap; message: {"changed": false, "msg": "Swap is on, for best performance, turn swap off"}
处理方法:
free -m //查询 SWAP 分区设置
cat /etc/fstab //查看交互分区
swapoff /mnt/swap //交换区可能有些不一样
NameHost IP Services
node1 172.16.10.1 PD1, TiDB1
node2 172.16.10.2 PD2, TiDB2
node3 172.16.10.3 PD3
node4 172.16.10.4 TiKV1
node5 172.16.10.5 TiKV2
node6 172.16.10.6 TiKV3
集群虚拟机设置工作
所有工作在root权限下进行
1.配hostName主机名.
[root@tidb ~]# hostnamectl set-hostname xx主机名xx //永久性的修改主机名称,重启后能保持修改后的。
2.配IP地址
2.1.centos 7?没有ipconfig?改为? ip addr
[root@tidb ~]# ip addr
2.2.默认ipv6需自已配合下静态IP
[root@tidb ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0 //(每个人不一样,自已查)
TYPE=Ethernet
BOOTPROTO=static
#配置静态IP,网关,子网掩码
IPADDR=192.168.0.88
NETMASK=255.255.255.0
GATEWAY=192.168.0.1
#取消networkmanager 管理
NM_CONTROLLED=no
#启用IPV4
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
NAME=eth0
UUID=ed246b2b-cc49-4785-a675-feebf70440e7 //(每个网卡不一样,如果是虚拟机复制的话,用[root@tidb ~]# uuidgen ens33 命令生成一个新的uuid并填入)
DEVICE=eth0
ONBOOT=yes
#指定DNS
DNS1=8.8.8.8
DNS2=202.96.128.166
2.3.重启网络配置,使新IP生效
[root@tidb ~]# service network restart
3.安装NTP同步服务器时间
3.1.在 CentOS 7 系统上执行以下命令,可手工安装 NTP 服务:
[root@tidb ~]# sudo yum install ntp ntpdate
[root@tidb ~]# sudo systemctl start ntpd.service
[root@tidb ~]# sudo systemctl enable ntpd.service
3.2.执行以下命令输出 running 表示 NTP 服务正在运行:
[root@tidb ~]# sudo systemctl status ntpd.service
● ntpd.service - Network Time Service
Loaded: loaded (/usr/lib/systemd/system/ntpd.service; disabled; vendor preset: disabled)
Active: active (running) since 一 2017-12-18 13:13:19 CST; 3s ago
3.3.使用以下命令可使 NTP 服务尽快开始同步,pool.ntp.org 可替换为你的 NTP server:
[root@tidb ~]# sudo systemctl stop ntpd.service
[root@tidb ~]# sudo ntpdate pool.ntp.org
[root@tidb ~]# sudo systemctl start ntpd.service
注:安装错误时处理
[root@tidb ~]# su - root
[root@tidb ~]# yum clean all
[root@tidb ~]# yum distro-sync
[root@tidb ~]# yum update
不行的话,再试一下
[root@tidb ~]# yum install yum-utils
[root@tidb ~]# package-cleanup --dupes
[root@tidb ~]# package-cleanup --cleandupes
3.4.Centos7 默认有个chronyd服务设置为开机自启动,这个服务导致ntp无法开启自启动
[root@tidb ~]# systemctl status chronyd //查看服务
[root@tidb ~]# systemctl disable chronyd.service //开启的话关掉它
[root@tidb ~]# systemctl enable ntpd.service //把NTP 开机自启动
ntpstat //查看ntp状态
4.手工配置 ssh 互信及 sudo 免密码
4.1.设置帐号
[root@tidb ~]# useradd tidb
[root@tidb ~]# passwd tidb
4.2.执行以下命令,将 tidb ALL=(ALL) NOPASSWD: ALL 添加到文件末尾,即配置好 sudo 免密码。
[root@tidb ~]# visudo
tidb ALL=(ALL) NOPASSWD: ALL
4.3.中控机与集群机进行互信,以 tidb 用户登录到中控机,执行以下命令
[tidb@中控机 ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub 172.16.10.1
[tidb@中控机 ~]$ ssh 172.16.10.1 //不需要输入密码并登录成功,表示 ssh 互信配置成功。
5.关闭swap分区
[root@tidb ~]# free -m //查询 SWAP 分区设置
[root@tidb ~]# cat /etc/fstab //查看交互分区
[root@tidb ~]# swapoff /mnt/swap //交换区可能有些不一样
[root@tidb ~]# vi /etc/fstab //查看交互分区
# /dev/mapper/centos-swap swap swap defaults 0 0 //关掉交换分区
6.将linux集群虚拟机进行复制,复制出多台机器出来,修改IP地址及HostName,用于存储的三个机器需挂载存储盘
7.在部署目标机器上添加数据盘 ext4 文件系统挂载参数(只针对TiKV)
7.1.部署目标机器数据盘请格式化成 ext4 文件系统,挂载时请添加 nodelalloc 和 noatime 挂载参数。nodelalloc 是必选参数,否则 Ansible 安装时检测无法通过,noatime 是可选建议参数。
# fdisk -l //查看数据盘
# parted -s -a optimal /dev/硬盘名 mklabel gpt -- mkpart primary ext4 1 -1 //硬盘名为 fdisk 查出的存储盘,因各人不同
# mkfs.ext4 /dev/硬盘名
7.2.查看数据盘分区 UUID
# lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT
sda
├─sda1 ext4 237b634b-a565-477b-8371-6dff0c41f5ab /boot
├─sda2 swap f414c5c0-f823-4bb1-8fdf-e531173a72ed
硬盘名 ext4 c51eb23b-195c-4061-92a9-3fad812cc12f
7.3.编辑 /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)