参考文章:TiDB-Ansible 部署方案
(注意,官方版本最新版本,已经不推荐使用ansible部署方案,推荐使用tiup来部署,不过前期大部分准备工作都是一样的,只是换了一种操作命令工具,tiup操作指南:使用 TiUP 部署 TiDB 集群)
很早就想亲手搭一下tidb集群,昨天搞了一下午结果失败了(因为自己买的机器配置太低,还有自己配置环境的时候有些配置没配好),今天把之前的机器删掉又重新申请机器按照文档把所有的步骤重新走了一遍,总算成功了。
一 准备机器
首先看一下官方的配置要求:TiDB 软件和硬件环境建议配置 , 官方配置要求很高(当然价格也很高,没钱啊),而我的目的只是熟悉搭建流程所以配置都是申请的最低的。
申请三台一样的配置,不论从机器数量还是机器配置都没有达到官方的要求(官方的要求价格太高),因此部署过程中有有些检测过不了(需要注释掉一些检测,后面会说到)。
二 环境准备
因为昨天搞了一下午最后失败了,总结起来有些地方还是要注意的。
1 不同的机器要在同一个内网里
有些刚申请的机器只有公网ip没有内网ip(昨天我申请的就没有配置内网ip),所有的机器之间内网互通,申请机器的时候所有的机器要在同一个机房里,如果没有配置内网ip,则需要配置内网ip。配置完成后通过判断内网ip是否在同一个局域网里。
2 主机的hostname要改成不一样的
昨天申请的机器都是默认的hostname,导致三台机器hostname一样,最后系统检测的时候没有通过,否则会报以下错误
ERROR MESSAGE SUMMARY *************************************************************************************************************************************************
[140.82.14.110]: Ansible FAILED! => playbook: deploy.yml; TASK: check_system_dynamic : Preflight check - Does every node in cluster have different hostname; message: {"changed": false, "msg": "hostnames of all nodes in cluster: [vultr, vultr, vultr]\n"}
3 把所有的机器的ssh登录密码改成一样的(后面会用到)
4 挂载数据盘
部署目标机器数据盘请格式化成 ext4 文件系统,挂载时请添加 nodelalloc 和 noatime 挂载参数。nodelalloc
是必选参数,否则 Ansible 安装时检测无法通过,noatime 是可选建议参数。这一步官方的不知是部署过程中去做的,第一次我也是这么弄的,但是第二次我感觉这一步还是放在部署之前全部搞定比较好。官方最少需要200g的ssd(必须是ssd,否则检测不通过),由于vultr扩展ssd价格较高所以我只申请了25g的ssd。
1) 如果你的数据盘已经格式化成 ext4 并挂载,可先执行 umount
命令卸载,从编辑 /etc/fstab
文件步骤开始执行,添加挂载参数重新挂载即可(由于我的是新挂载的磁盘所以不用这一步)。
$ umount /dev/vdb
(vdb 为你的数据盘的设备名称,我的为vdb)
2)创建分区表
$ parted -s -a optimal /dev/vdb mklabel gpt -- mkpart primary ext4 1 -1
(vdb 为你的数据盘的设备名称,我的为vdb)
3) 格式化文件系统
$ mkfs.ext4 /dev/vdb
(vdb 为你的数据盘的设备名称,我的为vdb)
执行lsblk -f查看数据盘分区 UUID,本例中 vdb 的 UUID 为 f3f9c0ef-318e-400d-a3d5-1cd41a6ecb5a 。
$ lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT
sr0
vda
└─vda1 ext4 75a6bfa1-37ee-4775-9349-210bfec16df8 /
vdb ext4 f3f9c0ef-318e-400d-a3d5-1cd41a6ecb5a
4)编辑 /etc/fstab
文件,添加 nodelalloc
挂载参数
$ vi /etc/fstab
UUID=f3f9c0ef-318e-400d-a3d5-1cd41a6ecb5a /data1 ext4 defaults,nodelalloc,noatime 0 2
5)挂载数据盘
$ mkdir /data1
$ mount -a
执行以下命令,如果文件系统为 ext4,并且挂载参数中包含 nodelalloc 表示生效:
三 部署tidb集群
1 在中控机上安装系统依赖包,以 root
用户登录中控机
$ yum -y install epel-release git curl sshpass
$ yum -y install python2-pip
2 在中控机上创建 tidb 用户,并生成 ssh key
1)创建 tidb
用户
$ useradd -m -d /home/tidb tidb
2)设置 tidb
用户密码
$ passwd tidb
3) 配置 tidb
用户 sudo 免密码,将 tidb ALL=(ALL) NOPASSWD: ALL
添加到文件末尾即可。
$ visudo
tidb ALL=(ALL) NOPASSWD: ALL
4) 生成 ssh key: 执行 su
命令从 root
用户切换到 tidb
用户下。
$ su - tidb
5) 创建 tidb 用户 ssh key, 提示 Enter passphrase 时直接回车即可。执行成功后,ssh 私钥文件为 /home/tidb/.ssh/id_rsa, ssh 公钥文件为 /home/tidb/.ssh/id_rsa.pub。执行下面命令,提示输入信息回车即可
$ ssh-keygen -t rsa
3 在中控机器上下载 TiDB-Ansible
1)下载指定版本 的 tidb-ansible,最好把tidb-ansible下载到tidb目录下(我们此时登录用户是tidb目录,官方所有的操作都是tidb用户,为了避免权限问题最好把tidb-ansible下载到tidb目录下)
$ cd /home/tidb
$ git clone -b v2.1.8 https://github.com/pingcap/tidb-ansible.git
2)以 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
$ sudo pip install -r ./requirements.txt
$ ansible --version
4 在中控机上配置部署机器 ssh 互信及 sudo 规则
1) 以 tidb 用户登录中控机,将你的部署目标机器 IP 添加到 hosts.ini 文件 [servers] 区块下。
下面的ip地址为你所有机器的内网ip地址,192.168.0.100,192.168.0.101,192.168.0.101为我所有机器配置的内网ip地址,机器之间是可以通过这些ip相互访问的。
$ cd /home/tidb/tidb-ansible
$ vi hosts.ini
[servers]
192.168.0.100
192.168.0.101
192.168.0.101
[all:vars]
username = tidb
ntp_server = pool.ntp.org
2) 执行以下命令,按提示输入部署目标机器 root
用户密码。该步骤将在部署目标机器上创建 tidb
用户,并配置 sudo 规则,配置中控机与部署目标机器之间的 ssh 互信。
这里会提示输入所有机器的ssh登录密码,直接输入即可,这也是上面提到把所有的机器ssh密码改成一样的原因。
$ ansible-playbook -i hosts.ini create_users.yml -u root -k
5 在部署目标机器上安装 NTP 服务
如果你的部署目标机器时间、时区设置一致,已开启 NTP 服务且在正常同步时间,此步骤可忽略。该步骤将在部署目标机器上使用系统自带软件源联网安装并启动 NTP 服务,服务使用安装包默认的 NTP server 列表,见配置文件 /etc/ntp.conf
中 server 参数,如果使用默认的 NTP server,你的机器需要连接外网。 为了让 NTP 尽快开始同步,启动 NTP 服务前,系统会 ntpdate hosts.ini
文件中的 ntp_server
一次,默认为 pool.ntp.org
,也可替换为你的 NTP server。
$ cd /home/tidb/tidb-ansible
$ ansible-playbook -i hosts.ini deploy_ntp.yml -u tidb -b
执行完最好到机器上看一看ntp服务是否正常,我昨天就是因为ntp服务异常导致最后集群部署失败。
1)执行以下命令输出 running
表示 NTP 服务正在运行:
$ 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
2) 执行 ntpstat 命令,输出 synchronised to NTP server(正在与 NTP server 同步)表示在正常同步:
$ ntpstat
synchronised to NTP server (85.199.214.101) at stratum 2
time correct to within 91 ms
polling server every 1024 s
3)以下情况表示 NTP 服务未正常同步:
$ ntpstat
unsynchronised
4) 以下情况表示 NTP 服务未正常运行:
$ ntpstat
Unable to talk to NTP daemon. Is it running?
在 CentOS 7 系统上执行以下命令,可手工安装 NTP 服务:
$ sudo yum install ntp ntpdate
$ sudo systemctl start ntpd.service
$ sudo systemctl enable ntpd.service
6 在部署目标机器上配置 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
7 分配机器资源,编辑 inventory.ini 文件
以 tidb
用户登录中控机,inventory.ini
文件路径为 /home/tidb/tidb-ansible/inventory.ini
。
标准 TiDB 集群需要 6 台机器:
- 2 个 TiDB 节点
- 3 个 PD 节点
- 3 个 TiKV 节点,第一台 TiDB 机器同时用作监控机
默认情况下,单台机器上只需部署一个 TiKV 实例。如果你的 TiKV 部署机器 CPU 及内存配置是部署建议的两倍或以上,并且拥有两块 SSD 硬盘或单块容量超 2T 的 SSD 硬盘,可以考虑部署两实例,但不建议部署两个以上实例。
这里出于成本的考虑我并没有达到官方的配置,但是可以说明问题,不过由于配置的问题,部署过程中可能会有一些问题,下面会说。把inventory.ini中的服务器相关的配置改为自己的配置192.168.0.100,192.168.0.101,192.168.0.102为我的机器的内网ip,其他的可以使用默认的配置,生产环境中最好按照官方文档的配置要求和部署规范来做,官方文档一定仔仔细细要看一遍==>
官方部署文档
。
## TiDB Cluster Part
[tidb_servers]
192.168.0.100
192.168.0.101
[tikv_servers]
192.168.0.100
192.168.0.101
192.168.0.102
[pd_servers]
192.168.0.100
192.168.0.101
192.168.0.102
[spark_master]
[spark_slaves]
[lightning_server]
[importer_server]
## Monitoring Part
# prometheus and pushgateway servers
[monitoring_servers]
192.168.0.100
[grafana_servers]
192.168.0.100
# node_exporter and blackbox_exporter servers
[monitored_servers]
192.168.0.100
192.168.0.101
192.168.0.102
[alertmanager_servers]
192.168.0.100
部署目录通过 deploy_dir
变量控制,默认全局变量已设置为 /home/tidb/deploy
,对所有服务生效。如数据盘挂载目录为 /data1
,可设置为 /data1/deploy
,/data1是数据盘的挂载目录,
样例如下:
$ Global variables
[all:vars]
deploy_dir = /data1/deploy
确认 tidb-ansible/inventory.ini
文件中 ansible_user = tidb
,本例使用 tidb
用户作为服务运行用户,ansible_user
不要设置成 root
用户,tidb-ansible
限制了服务以普通用户运行配置如下:
## Connection
# ssh via normal user
ansible_user = tidb
8 部署任务
1) 执行以下命令如果所有 server 返回 tidb
表示 ssh 互信配置成功。
$ ansible -i inventory.ini all -m shell -a 'whoami'
2) 执行以下命令如果所有 server 返回 root
表示 tidb
用户 sudo 免密码配置成功。
$ ansible -i inventory.ini all -m shell -a 'whoami' -b
3) 执行 local_prepare.yml
playbook,联网下载 TiDB binary 到中控机:
$ ansible-playbook local_prepare.yml
4) 初始化系统环境,修改内核参数
$ ansible-playbook bootstrap.yml
这里由于我的配置不够:cpu核心数(我的为单核心,官方需要8核心)。磁盘空间太小,内存太小等等会检测不通过,所以需要修改bootstrap.yml文件把检测任务注释掉,真正的生产环境中最痛通过所有的检测,否则会有性能问题。
- name: check system
hosts: all
any_errors_fatal: true
roles:
- check_system_static
# - { role: check_system_optional, when: not dev_mode|default(false) }
- name: tikv_servers machine benchmark
hosts: tikv_servers
gather_facts: false
roles:
# - { role: machine_benchmark, when: not dev_mode|default(false) }
5)部署 TiDB 集群软件
$ ansible-playbook deploy.yml
6) 启动 TiDB 集群
$ ansible-playbook start.yml
四 测试集群
使用 MySQL 客户端连接测试,TCP 4000 端口是 TiDB 服务默认端口。
mysql -u root -h ip_addres -P 4000
这里的ip_addres可以是t任意一个启动tidb_servers的ip地址(对应的外网ip),我的inventory.ini中tidb_servers部署的机器配置如下:
[tidb_servers]
192.168.0.100
192.168.0.101
[tikv_servers]
192.168.0.100
192.168.0.101
192.168.0.102
[pd_servers]
192.168.0.100
192.168.0.101
192.168.0.102
因此我可以用192.168.0.100,192.168.0.101这两台机器的任意一个外网ip连接(这根tidb的架构有关,tidb大致分为三层,tidb_servers,tikv_servers,pd_servers,tidb_servers负责客户端以及sql层的处理,tikv_servers负责数据的单机存储,pd_servers负责分布式和集群的管理和处理,当然这里只是说个大概,具体的是相当复杂的一部分内容).
在具体的生产环境中我们需要在tidb_servers前面配置负载均衡来对外统一提供 SQL 接口,或者通过域名绑定tidb_servers的所有ip,然后通过域名访问tidb,最终通过域名解析来达到此目的。
五 监控tidb集群
上面的部署成功后,所有监控相关的服务也都部署完毕,TiDB 集群监控官方文档中单独部署不再需要我们去做。直接 通过浏览器访问监控平台。地址:http://172.16.10.1(这里为中控机的外网ip):3000
默认帐号密码是:admin
/admin登录即可。登陆后
1在侧边栏菜单中,点击 Data Source,点击 Add data source,配置如下,注释掉的部分为中控机的外网ip
2 导入 Grafana 面板
1)把中控机上t/home/tidb/tidb-ansible/scripts下的tikv_pull.json,pd.json,tidb.json三个文件下载到本地(官方文档里有一个下载地址但是不知道为什么没有tikv_pull.json,估计是版本的问题),然后依次做以下操作。
2) 点击侧边栏的 Grafana 图标。
3) 点击 Upload .json File 上传对应的 JSON 文件
4) 点击 Load。
5) 选择一个 Prometheus 数据源。
6) 点击 Import,Prometheus 面板即导入成功。
3 查看组件 metrics
在顶部菜单中,点击 New dashboard,选择要查看的面板(以下是我刚刚导入的三个面板),选择要看的即可看到tidb每个组件的运行状态和处理详情相关的非常清楚直观的图标信息。
这里展示其中很少的几个内容
1 Cluster-TIDB的事务处理相关的数据的展示。
2 Cluster-TIKV
tikv集群概要
tikv集群raft操作信息