一、TiDB 整体架构
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
安装完成如下图
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/
成功后如下图
[root@server11 tidb-ansible-master]# ansible-playbook deploy.yml ##部署 TiDB 集群
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
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
还有错误,找找原因:
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,增大内存,再来
历经磨难,终于成功!!
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)
通过浏览器访问监控平台
地址:http://172.15.27.11:3000 默认帐号密码是:admin/admin
四、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
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 能否正常安装。
将Zabbix数据库设置为 TiDB 成功。
六、小结
此次TiDB的安装,遇到诸多问题,一开始的时候也是晕头转向,不知道怎么解决,尤其在执行 deploy.yml 部署 TiDB 集群时出现的错误,一开始我也是有点浮躁的,没有认真看他的错误提示,也不知到去哪里看log,而是直接去百度搜索,然而发现百度上根本没有这样的相关问题,所以在这块卡了好久。后来静下来仔细分析的时候,发现原来错误提示给了我们很多信息,发现问题所在后就针对性的解决,困难就这样被克服了。在以后的学习与工作中,肯定还会遇到很多各种各样的问题,要时刻提醒自己不能浮躁,一个清醒的大脑就是trouble的最大克星。