通过Ansible 安装部署 TiDB 及将 TiDB作为Zabbix 的数据库

时间:2020-12-24 21:43:22

一、TiDB 整体架构

通过Ansible 安装部署 TiDB 及将 TiDB作为Zabbix 的数据库

TiDB 集群主要分为三个组件:

  • TiDB Server

TiDB Server 负责接收 SQL 请求,处理 SQL 相关的逻辑,并通过 PD 找到存储计算所需数据的 TiKV 地址,与 TiKV 交互获取数据,最终返回结果。 TiDB Server 是无状态的,其本身并不存储数据,只负责计算,可以无限水平扩展,可以通过负载均衡组件(如LVS、HAProxy 或 F5)对外提供统一的接入地址。

  • PD Server

Placement Driver (简称 PD) 是整个集群的管理模块,其主要工作有三个: 一是存储集群的元信息(某个 Key 存储在哪个 TiKV 节点);二是对 TiKV 集群进行调度和负载均衡(如数据的迁移、Raft group leader 的迁移等);三是分配全局唯一且递增的事务 ID。

PD 是一个集群,需要部署奇数个节点,一般线上推荐至少部署 3 个节点。

  • TiKV Server

TiKV Server 负责存储数据,从外部看 TiKV 是一个分布式的提供事务的 Key-Value 存储引擎。存储数据的基本单位是 Region,每个 Region 负责存储一个 Key Range (从 StartKey 到 EndKey 的左闭右开区间)的数据,每个 TiKV 节点会负责多个 Region 。TiKV 使用 Raft 协议做复制,保持数据的一致性和容灾。副本以 Region 为单位进行管理,不同节点上的多个 Region 构成一个 Raft Group,互为副本。数据在多个 TiKV 之间的负载均衡由 PD 调度,这里也是以 Region 为单位进行调度。

二、核心特性

  • 水平扩展

无限水平扩展是 TiDB 的一大特点,这里说的水平扩展包括两方面:计算能力和存储能力。TiDB Server 负责处理 SQL 请求,随着业务的增长,可以简单的添加 TiDB Server 节点,提高整体的处理能力,提供更高的吞吐。TiKV 负责存储数据,随着数据量的增长,可以部署更多的 TiKV Server 节点解决数据 Scale 的问题。PD 会在 TiKV 节点之间以 Region 为单位做调度,将部分数据迁移到新加的节点上。所以在业务的早期,可以只部署少量的服务实例(推荐至少部署 3 个 TiKV, 3 个 PD,2 个 TiDB),随着业务量的增长,按照需求添加 TiKV 或者 TiDB 实例。

  • 高可用

高可用是 TiDB 的另一大特点,TiDB/TiKV/PD 这三个组件都能容忍部分实例失效,不影响整个集群的可用性。下面分别说明这三个组件的可用性、单个实例失效后的后果以及如何恢复。

三、TiDB 集群部署

1.节点环境

系统 hostname IP service
redhat7.2 server11 172.25.27.11 TIDB+PD
redhat7.2 server12 172.25.27.12 tikv
redhat7.2 server13 172.25.27.13 tikv
redhat7.2 server14 172.25.27.14 tikv

server11 : Python 2.7.5

2.在中控机上安装 Ansible

使用pip安装

setuptools下载:https://pypi.python.org/packages/source/s/setuptools/setuptools-7.0.tar.gz

pip官网:https://pypi.python.org/pypi/pip
pip下载:https://pypi.python.org/packages/11/b6/abcb525026a4be042b486df43905d6893fb04f05aac21c32c638e939e447/pip-9.0.1.tar.gz#md5=35f01da33009719497f01a4ba69d63c9

[root@server11 ~]# tar -zxf setuptools-7.0.tar.gz 
[root@server11 ~]# ls
anaconda-ks.cfg  setuptools-7.0  setuptools-7.0.tar.gz
[root@server11 ~]# cd setuptools-7.0/
root@server11 setuptools-7.0]# python setup.py install

[root@server11 ~]# tar -zxf pip-9.0.1.tar.gz 
[root@server11 ~]# cd pip-9.0.1/
[root@server11 pip-9.0.1]# python setup.py install

[root@server11 ~]# pip install ansible

安装完成如下图
通过Ansible 安装部署 TiDB 及将 TiDB作为Zabbix 的数据库

3.下载 TiDB-Ansible 至中控机

最新 master 版本下载地址:
https://codeload.github.com/pingcap/tidb-ansible/zip/master

[root@server11 ~]# unzip tidb-ansible-master.zip 
[root@server11 ~]# cd tidb-ansible-master/
[root@server11 tidb-ansible-master]# ls ##各个文件的说明
ansible.cfg: ansible 配置文件
inventoty.ini: 组和主机的相关配置
conf: TiDB 相关配置模版
group_vars: 相关变量配置
scripts: grafana 监控 json 模版
local_prepare.yml: 用来下载相关安装包
bootstrap.yml: 初始化集群各个节点
deploy.yml: 在各个节点安装 TiDB 相应服务
roles: ansible tasks 的集合
start.yml: 启动所有服务
stop.yml: 停止所有服务
unsafe_cleanup_data.yml: 清除数据
unsafe_cleanup.yml: 销毁集群

4.分配 TiDB 集群资源

[root@server11 tidb-ansible-master]# vim inventory.ini

# TiDB Cluster Part
[tidb_servers]
172.25.27.11

[tikv_servers]
172.25.27.12
172.25.27.13
172.25.27.14

[pd_servers]
172.25.27.11

[spark_master]

[spark_slaves]

# Monitoring Part
[monitoring_servers]
172.25.27.11

[grafana_servers]
172.25.27.11

5.部署 TiDB 集群

[root@server11 tidb-ansible-master]# ansible-playbook local_prepare.yml ##下载 master 版本的 binary 到中控机
[root@server11 tidb-ansible-master]# ansible-playbook bootstrap.yml -k ##初始化目标机器的系统环境,修改内核参数(需要中控机可以免密登陆其他的目标机)

附:ssh 免密登录

[root@server11 tidb-ansible-master]# ssh-keygen -t rsa
##一路回车
[root@server11 tidb-ansible-master]# cd ~/.ssh/
[root@server11 .ssh]# ssh-copy-id 172.25.27.12
[root@server11 .ssh]# ssh-copy-id 172.25.27.13
[root@server11 .ssh]# ssh-copy-id 172.25.27.14
[root@server11 .ssh]# scp -p id_rsa server12:~/.ssh/
[root@server11 .ssh]# scp -p id_rsa server13:~/.ssh/
[root@server11 .ssh]# scp -p id_rsa server14:~/.ssh/

通过Ansible 安装部署 TiDB 及将 TiDB作为Zabbix 的数据库

成功后如下图
通过Ansible 安装部署 TiDB 及将 TiDB作为Zabbix 的数据库

[root@server11 tidb-ansible-master]# ansible-playbook deploy.yml ##部署 TiDB 集群

通过Ansible 安装部署 TiDB 及将 TiDB作为Zabbix 的数据库

TASK [check_config_dynamic : Preflight check - fail when NTP service is not running or ntpstat is not synchronised to NTP server] ********************
fatal: [172.25.27.14]: FAILED! => {"changed": false, "cmd": "ntpstat | grep -w synchronised | wc -l", "delta": "0:00:00.119750", "end": "2017-10-12 23:38:24.277361", "failed": true, "failed_when_result": true, "rc": 0, "start": "2017-10-12 23:38:24.157611", "stderr": "/bin/bash: ntpstat: command not found", "stderr_lines": ["/bin/bash: ntpstat: command not found"], "stdout": "0", "stdout_lines": ["0"]}
fatal: [172.25.27.12]: FAILED! => {"changed": false, "cmd": "ntpstat | grep -w synchronised | wc -l", "delta": "0:00:00.140235", "end": "2017-10-12 23:38:23.683206", "failed": true, "failed_when_result": true, "rc": 0, "start": "2017-10-12 23:38:23.542971", "stderr": "/bin/bash: ntpstat: command not found", "stderr_lines": ["/bin/bash: ntpstat: command not found"], "stdout": "0", "stdout_lines": ["0"]}
fatal: [172.25.27.13]: FAILED! => {"changed": false, "cmd": "ntpstat | grep -w synchronised | wc -l", "delta": "0:00:00.149001", "end": "2017-10-12 23:38:24.083223", "failed": true, "failed_when_result": true, "rc": 0, "start": "2017-10-12 23:38:23.934222", "stderr": "/bin/bash: ntpstat: command not found", "stderr_lines": ["/bin/bash: ntpstat: command not found"], "stdout": "0", "stdout_lines": ["0"]}
fatal: [172.25.27.11]: FAILED! => {"changed": false, "cmd": "ntpstat | grep -w synchronised | wc -l", "delta": "0:00:00.203400", "end": "2017-10-12 23:38:24.150001", "failed": true, "failed_when_result": true, "rc": 0, "start": "2017-10-12 23:38:23.946601", "stderr": "/bin/bash: ntpstat: command not found", "stderr_lines": ["/bin/bash: ntpstat: command not found"], "stdout": "0", "stdout_lines": ["0"]}
    to retry, use: --limit @/root/tidb-ansible-master/retry_files/deploy.retry

有报错,提示ntpstat 命令找不到,安装ntp

[root@server11 tidb-ansible-master]# yum install -y ntp.x86_64

通过Ansible 安装部署 TiDB 及将 TiDB作为Zabbix 的数据库
通过Ansible 安装部署 TiDB 及将 TiDB作为Zabbix 的数据库

fatal: [172.25.27.12]: FAILED! => {"changed": false, "cmd": "ntpstat | grep -w synchronised | wc -l", "delta": "0:00:00.140509", "end": "2017-10-12 23:54:33.367572", "failed": true, "failed_when_result": true, "rc": 0, "start": "2017-10-12 23:54:33.227063", "stderr": "", "stderr_lines": [], "stdout": "0", "stdout_lines": ["0"]}

fatal: [172.25.27.14]: FAILED! => {"changed": false, "cmd": "ntpstat | grep -w synchronised | wc -l", "delta": "0:00:00.147472", "end": "2017-10-12 23:42:55.134237", "failed": true, "failed_when_result": true, "rc": 0, "start": "2017-10-12 23:42:54.986765", "stderr": "Unable to talk to NTP daemon. Is it running?", "stderr_lines": ["Unable to talk to NTP daemon. Is it running?"], "stdout": "0", "stdout_lines": ["0"]}

又有报错,提示 ntpstat | grep -w synchronised | wc -l 为 false,
Unable to talk to NTP daemon , 查看ntpd服务状态,开启ntpd服务

[root@server11 tidb-ansible-master]# ntpstat 
unsynchronised
   polling server every 64 s
[root@server11 tidb-ansible-master]# systemctl status ntpd
● ntpd.service - Network Time Service
   Loaded: loaded (/usr/lib/systemd/system/ntpd.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
[root@server11 tidb-ansible-master]# systemctl start ntpd

[root@server11 tidb-ansible-master]# ntpstat 
synchronised to NTP server (85.199.214.100) at stratum 2 
   time correct to within 222 ms
   polling server every 64 s
[root@server11 tidb-ansible-master]# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
-mirror.datacent 80.50.231.226    2 u   26  256  377  223.180  -21.088   3.898
+61-216-153-105. 211.22.103.158   3 u   46  256   37   96.086    5.925   9.806
+61-216-153-107. 211.22.103.158   3 u   22  256  377   97.342    7.489   3.961
*ntp8.flashdance 193.11.166.20    2 u  107  256  277  220.683    2.635   7.015

通过Ansible 安装部署 TiDB 及将 TiDB作为Zabbix 的数据库

通过Ansible 安装部署 TiDB 及将 TiDB作为Zabbix 的数据库
还有错误,找找原因:
通过Ansible 安装部署 TiDB 及将 TiDB作为Zabbix 的数据库

TASK [check_config_dynamic : Preflight check - Fail if this machine lacks sufficient RAM.] ***********************************************************
fatal: [172.25.27.13]: FAILED! => {"changed": false, "failed": true, "msg": "This machine does not have sufficient RAM to run TiDB."}
fatal: [172.25.27.12]: FAILED! => {"changed": false, "failed": true, "msg": "This machine does not have sufficient RAM to run TiDB."}
fatal: [172.25.27.14]: FAILED! => {"changed": false, "failed": true, "msg": "This machine does not have sufficient RAM to run TiDB."}

找到原因了,fail when NTP service is not running or ntpstat is not synchronised to NTP server
我给的内存为512,增大内存,再来

历经磨难,终于成功!!
通过Ansible 安装部署 TiDB 及将 TiDB作为Zabbix 的数据库

6.启动 TiDB 集群

[root@server11 tidb-ansible-master]# ansible-playbook start.yml ##启动 TiDB 集群
[root@server4 ~]# mysql -u root -h 172.25.27.11 -P 4000
        ##用 MySQL 客户端连接至 TiDB 集群(TiDB 服务的默认端口是 4000)

通过Ansible 安装部署 TiDB 及将 TiDB作为Zabbix 的数据库

通过Ansible 安装部署 TiDB 及将 TiDB作为Zabbix 的数据库

通过浏览器访问监控平台
地址:http://172.15.27.11:3000 默认帐号密码是:admin/admin
通过Ansible 安装部署 TiDB 及将 TiDB作为Zabbix 的数据库
通过Ansible 安装部署 TiDB 及将 TiDB作为Zabbix 的数据库

四、TiDB 基本操作

1.创建、查看和删除数据库

使用 CREATE DATABASE 语句创建数据库。语法如下:

CREATE DATABASE db_name [options];

例如,要创建一个名为 samp_db 的数据库,可使用以下语句:

CREATE DATABASE IF NOT EXISTS samp_db;

使用 SHOW DATABASES 语句查看数据库:

SHOW DATABASES;

使用 DROP DATABASE 语句删除数据库,例如:

DROP DATABASE samp_db;

2.创建、查看和删除表

使用 CREATE TABLE 语句创建表。语法如下:

CREATE TABLE table_name column_name data_type constraint;

例如:

CREATE TABLE person ( number INT(11), name VARCHAR(255), birthday DATE );

如果表已存在,添加 IF NOT EXISTS 可防止发生错误:

CREATE TABLE IF NOT EXISTS person ( number INT(11), name VARCHAR(255), birthday DATE );

使用 SHOW CREATE 语句查看建表语句。例如:

SHOW CREATE table person;

使用 SHOW FULL COLUMNS 语句查看表的列。 例如:

SHOW FULL COLUMNS FROM person;

使用 DROP TABLE 语句删除表。例如:

DROP TABLE person;

或者

DROP TABLE IF EXISTS person;

使用 SHOW TABLES 语句查看数据库中的所有表。例如:

SHOW TABLES FROM samp_db;

五、将 Zabbix 的数据库设置为 TiDB

1.zabbix安装

详细请参考我的另一篇博客:图文讲解Zabbix 分布式监控平台安装过程

[root@server11 php]# ls
nginx-1.12.0.tar.gz  php-bcmath-5.4.16-36.el7_1.x86_64.rpm  php-mbstring-5.4.16-36.el7_1.x86_64.rpm
[root@server11 php]# yum install -y php-bcmath-5.4.16-36.el7_1.x86_64.rpm php-mbstring-5.4.16-36.el7_1.x86_64.rpm
[root@server11 el7]# yum install -y zabbix-agent-3.2.6-1.el7.x86_64.rpm zabbix-server-mysql-3.2.6-1.el7.x86_64.rpm zabbix-web-3.2.6-1.el7.noarch.rpm zabbix-web-mysql-3.2.6-1.el7.noarch.rpm fping-3.10-1.el7.x86_64.rpm iksemel-1.4-2.el7.centos.x86_64.rpm

软件安装完成后,进行以下步骤

2.TiDB 配置

对 TiDB 作以下配置,将 zabbix server 的数据导入TiDB 中。

[root@server11 ~]# yum install -y mariadb ##安装 mariadb 软件,即 MySQL 客户端
[root@server11 ~]# mysql -u root -h 172.25.27.11 -P 4000
MySQL [(none)]> create database zabbix character set utf8 collate utf8_bin;
MySQL [(none)]> grant all privileges on zabbix.* to zabbix@localhost identified by 'redhat';
MySQL [(none)]> quit
[root@server11 ~]# zcat /usr/share/doc/zabbix-server-mysql-3.2.*/create.sql.gz | mysql -u root -h 172.25.27.11 -P 4000 zabbix

通过Ansible 安装部署 TiDB 及将 TiDB作为Zabbix 的数据库

3.Zabbix server 的配置文件

编辑 Zabbix server 的配置文件,修改内容如下:

[root@server11 ~]# vim /etc/zabbix/zabbix_server.conf

DBName=zabbix
DBUser=zabbix
DBPassword=redhat
DBPort=4000

[root@server11 ~]# systemctl start zabbix-server.service 
[root@server11 ~]# systemctl start httpd.service

4.Zabbix 的测试

在浏览器中输入 ”http://172.25.27.11/zabbix” , 看zabbix 能否正常安装。
通过Ansible 安装部署 TiDB 及将 TiDB作为Zabbix 的数据库
通过Ansible 安装部署 TiDB 及将 TiDB作为Zabbix 的数据库
将Zabbix数据库设置为 TiDB 成功。

六、小结

此次TiDB的安装,遇到诸多问题,一开始的时候也是晕头转向,不知道怎么解决,尤其在执行 deploy.yml 部署 TiDB 集群时出现的错误,一开始我也是有点浮躁的,没有认真看他的错误提示,也不知到去哪里看log,而是直接去百度搜索,然而发现百度上根本没有这样的相关问题,所以在这块卡了好久。后来静下来仔细分析的时候,发现原来错误提示给了我们很多信息,发现问题所在后就针对性的解决,困难就这样被克服了。在以后的学习与工作中,肯定还会遇到很多各种各样的问题,要时刻提醒自己不能浮躁,一个清醒的大脑就是trouble的最大克星。