title | category |
---|---|
快速入门指南 |
deployment |
TiDB 是开源分布式 SQL 数据库,结合了传统的 RDBMS 和 NoSQL 的最佳特性。TiDB 兼容 MySQL,支持无限的水平扩展,具备强一致性和高可用性。TiDB 的目标是为在线事务和分析提供一站式的解决方案。
本指南为您介绍如何使用 TiDB-Ansible 快速部署一个 TiDB 集群,并了解 TiDB 的基本操作和管理。
本节具体介绍如何部署一个 TiDB 集群。一个 TiDB 集群由不同的模块组成,包括:TiDB 服务器、TiKV 服务器、Placement Driver (PD) 服务器。
架构图如下所示:
开始部署前,需准备如下环境:
-
符合下列要求的一台中控机
-
Python 2.6 或 Python 2.7
-
Python Jinja2 2.7.2 和 MarkupSafe 0.11 安装包。可使用以下命令进行安装:
pip install Jinja2==2.7.2 MarkupSafe==0.11
-
可通过 SSH 登录目标节点,支持密码登录和 SSH authorized_key 登录。
-
-
符合下列要求的目标节点若干
- 机器 4 台以上。TiKV 至少 3 个实例,而且不要将 TiKV 与 TiDB 或 PD 模块部署在同一台机器上。详见部署建议。
- 操作系统:
- CentOS 7.0 及以上版本
- X86_64 架构 (AMD64)
- 内核版本 3.10 及以上
- Ext4 文件系统
- 机器之间互通网络。部署时关闭防火墙和 iptables,部署完成后再开启。
- 所有机器的时间和时区设置一致,有 NTP 服务可以同步正确时间。
- 一个可从中控机登录的远程用户帐号,以通过 SSH 连接托管节点。普通用户帐号需要有 sudo 权限。
- Python 2.6 或 Python 2.7
注:中控机可以是目标节点中的某一台,该机器需开放外网访问,用于下载 binary。
在 CentOS 7.3 平台上安装 Ansible 2.3 及以上版本:
yum install epel-release
yum update
yum install ansible
可使用 ansible --version
命令查看版本信息。
更多详细信息,参见 Ansible 文档。
从 GitHub TiDB-Ansible 项目上下载最新 master 版本或点击下载。
将下载下来的文件解压缩,默认的文件夹名称为 tidb-ansible-master
。该文件夹包含用 TiDB-Ansible 来部署 TiDB 集群所需要的所有文件。
标准的 TiDB 集群需要 6 台机器:
- 2 个 TiDB 实例
- 3 个 PD 实例,其中一个 PD 实例负责监控。
- 3 个 TiKV 实例
集群拓扑结构如下:
Name | Host IP | Services |
---|---|---|
node1 | 172.16.10.1 | PD1, TiDB1 |
node2 | 172.16.10.2 | PD2, TiDB2 |
node3 | 172.16.10.3 | PD3, Monitor |
node4 | 172.16.10.4 | TiKV1 |
node5 | 172.16.10.5 | TiKV2 |
node6 | 172.16.10.6 | TiKV3 |
编辑 tidb-ansible-master
文件夹中的 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
[monitored_servers:children]
tidb_servers
tikv_servers
pd_servers
[monitoring_servers]
172.16.10.3
[grafana_servers]
172.16.10.3
# ...
使用有 sudo 权限的普通用户部署 TiDB:
-
编辑
inventory.ini
文件,如下所示:## Connection # ssh via root: # ansible_user = root # ansible_become = true # ansible_become_user = tidb # ssh via normal user ansible_user = tidb
-
连网下载 TiDB、TiKV 和 PD binaries:
ansible-playbook local_prepare.yml
-
初始化目标机器的系统环境,修改内核参数:
ansible-playbook bootstrap.yml -k -K
- 如果连接至托管节点需要密码,需添加
-k
(小写)参数。这同样适用于其他 playbooks。 - 如果 sudo 到 root 权限需要密码,需添加
-K
(大写)参数。
- 如果连接至托管节点需要密码,需添加
-
部署 TiDB 集群:
ansible-playbook deploy.yml -k
启动 TiDB 集群:
ansible-playbook start.yml -k
使用 MySQL 客户端连接至 TiDB 集群:
mysql -u root -h 172.16.10.1 -P 4000
注:TiDB 服务的默认端口是 4000。
本节具体介绍 TiDB 中基本的增删改查操作。
使用 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;
使用 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;
对于值不唯一的列,可使用 CREATE INDEX
或 ALTER TABLE
语句。例如:
CREATE INDEX person_num ON person (number);
或者
ALTER TABLE person ADD INDEX person_num (number);
对于值唯一的列,可以创建唯一索引。例如:
CREATE UNIQUE INDEX person_num ON person (number);
或者
ALTER TABLE person ADD UNIQUE person_num on (number);
使用 SHOW INDEX
语句查看表内所有索引:
SHOW INDEX from person;
使用 ALTER TABLE
或 DROP INDEX
语句来删除索引。与 CREATE INDEX
语句类似,DROP INDEX
也可以嵌入 ALTER TABLE
语句。例如:
DROP INDEX person_num ON person;
ALTER TABLE person DROP INDEX person_num;
使用 INSERT
语句向表内插入数据。例如:
INSERT INTO person VALUES("1","tom","20170912");
使用 SELECT
语句检索表内数据。例如:
SELECT * FROM person;
+--------+------+------------+
| number | name | birthday |
+--------+------+------------+
| 1 | tom | 2017-09-12 |
+--------+------+------------+
使用 UPDATE
语句修改表内数据。例如:
UPDATE person SET birthday='20171010' WHERE name='tom';
SELECT * FROM person;
+--------+------+------------+
| number | name | birthday |
+--------+------+------------+
| 1 | tom | 2017-10-10 |
+--------+------+------------+
使用 DELETE
语句删除表内数据:
DELETE FROM person WHERE number=1;
SELECT * FROM person;
Empty set (0.00 sec)
使用 CREATE USER
语句创建一个用户 tiuser
,密码为 123456
:
CREATE USER 'tiuser'@'localhost' IDENTIFIED BY '123456';
授权用户 tiuser
可检索数据库 samp_db
内的表:
GRANT SELECT ON samp_db .* TO 'tiuser'@'localhost';
查询用户 tiuser
的权限:
SHOW GRANTS for tiuser@localhost;
删除用户 tiuser
:
DROP USER 'tiuser'@'localhost';
打开浏览器,访问以下监控平台:
地址:http://172.16.10.3:3000
,
默认帐户和密码为:admin
@admin
。
-
PD
-
Storage Capacity : TiDB 集群总可用数据库空间大小
-
Current Storage Size : TiDB 集群目前已用数据库空间大小
-
Store Status -- up store : TiKV 正常节点数量
-
Store Status -- down store : TiKV 异常节点数量
如果大于 0,证明有节点不正常
-
Store Status -- offline store : 手动执行下线操作 TiKV 节点数量
-
Store Status -- Tombstone store : 下线成功的 TiKV 节点数量
-
Current storage usage : TiKV 集群存储空间占用率
超过 80% 应考虑添加 TiKV 节点
-
99% completed_cmds_duration_seconds : 99% pd-server 请求完成时间
小于 5ms
-
average completed_cmds_duration_seconds : pd-server 请求平均完成时间
小于 50ms
-
leader balance ratio : leader ratio 最大的节点与最小的节点的差
均衡状况下一般小于 5%,节点重启时会比较大
-
region balance ratio : region ratio 最大的节点与最小的节点的差
均衡状况下一般小于 5%,新增/下线节点时会比较大
-
-
TiDB
-
handle_requests_duration_seconds : 请求 PD 获取 TSO 响应时间
小于 100ms
-
tidb server QPS : 集群的请求量
-
connection count : 从业务服务器连接到数据库的连接数
和业务相关。但是如果连接数发生跳变,需要查明原因。比如突然掉为 0,可以检查网络是否中断; 如果突然上涨,需要检查业务。
-
statement count : 单位时间内不同类型语句执行的数目
-
Query Duration 99th percentile : 99% 的 query 时间
-
-
TiKV
- 99% & 99.99% scheduler command duration : 99% & 99.99% 命令执行的时间
99% 小于 50ms;99.99% 小于 100ms
-
95% & 99% storage async_request duration : 95% & 99% Raft 命令执行时间
95% 小于 50ms;99% 小于 100ms
-
server report failure message : 发送失败或者收到了错误的 message
如果出现了大量的 unreachadble 的消息,表明系统网络出现了问题。如果有 store not match 这样的错误, 表明收到了不属于这个集群发过来的消息
-
Vote : Raft vote 的频率
通常这个值只会在发生 split 的时候有变动,如果长时间出现了 vote 偏高的情况,证明系统出现了严重的问题, 有一些节点无法工作了
-
95% & 99% coprocessor request duration : 95% & 99% coprocessor 执行时间
和业务相关,但通常不会出现持续高位的值
-
Pending task : 累积的任务数量
除了 pd worker,其他任何偏高都属于异常
-
stall : RocksDB Stall 时间
大于 0,表明 RocksDB 忙不过来,需要注意 IO 和 CPU 了
-
channel full : channel 满了,表明线程太忙无法处理
如果大于 0,表明线程已经没法处理了
-
95% send_message_duration_seconds : 95% 发送消息的时间
小于 50ms
-
leader/region : 每个 TiKV 的 leader/region 数量
TiDB 集群可以在不影响线上服务的情况下进行扩容和缩容。以下缩容示例中,被移除的节点没有混合部署其他服务;如果混合部署了其他服务,不能按如下操作。
假设拓扑结构如下所示:
Name | Host IP | Services |
---|---|---|
node1 | 172.16.10.1 | PD1 |
node2 | 172.16.10.2 | PD2 |
node3 | 172.16.10.3 | PD3, Monitor |
node4 | 172.16.10.4 | TiDB1 |
node5 | 172.16.10.5 | TiDB2 |
node6 | 172.16.10.6 | TiKV1 |
node7 | 172.16.10.7 | TiKV2 |
node8 | 172.16.10.8 | TiKV3 |
node9 | 172.16.10.9 | TiKV4 |
例如,如果要添加两个 TiDB 节点 (node101、node102),IP 地址为 172.16.10.101、172.16.10.102,可以进行如下操作:
-
编辑
inventory.ini
文件,添加节点信息:[tidb_servers] 172.16.10.4 172.16.10.5 172.16.10.101 172.16.10.102 [pd_servers] 172.16.10.1 172.16.10.2 172.16.10.3 [tikv_servers] 172.16.10.6 172.16.10.7 172.16.10.8 172.16.10.9 [monitored_servers:children] tidb_servers tikv_servers pd_servers [monitoring_servers] 172.16.10.3 [grafana_servers] 172.16.10.3
现在拓扑结构如下所示:
Name Host IP Services node1 172.16.10.1 PD1 node2 172.16.10.2 PD2 node3 172.16.10.3 PD3, Monitor node4 172.16.10.4 TiDB1 node5 172.16.10.5 TiDB2 node101 172.16.10.101 TiDB3 node102 172.16.10.102 TiDB4 node6 172.16.10.6 TiKV1 node7 172.16.10.7 TiKV2 node8 172.16.10.8 TiKV3 node9 172.16.10.9 TiKV4 -
初始化新增节点:
ansible-playbook bootstrap.yml -k -K -l 172.16.10.101,172.16.10.102
-
部署新增节点:
ansible-playbook deploy.yml -k -l 172.16.10.101,172.16.10.102
-
启动新节点服务:
ansible-playbook start.yml -k -l 172.16.10.101,172.16.10.102
-
更新 Prometheus 配置并重启:
ansible-playbook rolling_update_monitor.yml -k --tags=prometheus
-
打开浏览器访问监控平台:
http://172.16.10.3:3000
,监控整个集群和新增节点的状态。
可使用同样的步骤添加 TiKV 节点。但如果要添加 PD 节点,则需手动更新一些配置文件。
例如,如果要添加一个 PD 节点 (node103),IP 地址为 172.16.10.103,可以进行如下操作:
-
编辑
inventory.ini
文件,添加节点信息:[tidb_servers] 172.16.10.4 172.16.10.5 [pd_servers] 172.16.10.1 172.16.10.2 172.16.10.3 172.16.10.103 [tikv_servers] 172.16.10.6 172.16.10.7 172.16.10.8 172.16.10.9 [monitored_servers:children] tidb_servers tikv_servers pd_servers [monitoring_servers] 172.16.10.3 [grafana_servers] 172.16.10.3
现在拓扑结构如下所示:
Name Host IP Services node1 172.16.10.1 PD1 node2 172.16.10.2 PD2 node3 172.16.10.3 PD3, Monitor node103 172.16.10.103 PD4 node4 172.16.10.4 TiDB1 node5 172.16.10.5 TiDB2 node6 172.16.10.6 TiKV1 node7 172.16.10.7 TiKV2 node8 172.16.10.8 TiKV3 node9 172.16.10.9 TiKV4 -
初始化新增节点:
ansible-playbook bootstrap.yml -k -K -l 172.16.10.103
-
部署新增节点:
ansible-playbook deploy.yml -k -l 172.16.10.103
-
登录新增的 PD 节点,编辑启动脚本:
{deploy_dir}/scripts/run_pd.sh
-
移除
--initial-cluster="xxxx" \
配置 -
添加
--join="http://172.16.10.1:2379" \
。IP 地址 (172.16.10.1) 可以是集群内现有 PD IP 地址中的任意一个 -
在新增 PD 节点中手动启动 PD 服务:
{deploy_dir}/scripts/start_pd.sh
-
使用
pd-ctl
检查新节点是否添加成功:./pd-ctl -u "http://172.16.10.1:2379"
注:
pd-ctl
命令用于查询 PD 节点的数量。 -
-
滚动升级整个集群:
ansible-playbook rolling_update.yml -k
-
更新 Prometheus 配置并重启:
ansible-playbook rolling_update_monitor.yml -k --tags=prometheus
-
打开浏览器访问监控平台:
http://172.16.10.3:3000
,监控整个集群和新增节点的状态。
例如,如果要移除一个 TiDB 节点 (node5),IP 地址为 172.16.10.5,可以进行如下操作:
-
停止 node5 节点上的服务:
ansible-playbook stop.yml -k -l 172.16.10.5
-
编辑
inventory.ini
文件,移除节点信息:[tidb_servers] 172.16.10.4 #172.16.10.5 # 注释被移除节点 [pd_servers] 172.16.10.1 172.16.10.2 172.16.10.3 [tikv_servers] 172.16.10.6 172.16.10.7 172.16.10.8 172.16.10.9 [monitored_servers:children] tidb_servers tikv_servers pd_servers [monitoring_servers] 172.16.10.3 [grafana_servers] 172.16.10.3
现在拓扑结构如下所示:
Name Host IP Services node1 172.16.10.1 PD1 node2 172.16.10.2 PD2 node3 172.16.10.3 PD3, Monitor node4 172.16.10.4 TiDB1 node5 172.16.10.5 TiDB2 已删除 node6 172.16.10.6 TiKV1 node7 172.16.10.7 TiKV2 node8 172.16.10.8 TiKV3 node9 172.16.10.9 TiKV4 -
更新 Prometheus 配置并重启:
ansible-playbook rolling_update_monitor.yml -k --tags=prometheus
-
打开浏览器访问监控平台:
http://172.16.10.3:3000
,监控整个集群的状态。
例如,如果要移除一个 TiKV 节点 (node9),IP 地址为 172.16.10.9,可以进行如下操作:
-
使用
pd-ctl
从集群中移除节点:-
查看 node9 节点的 store id:
./pd-ctl -u "http://172.16.10.1:2379" -d store
-
从集群中移除 node9,假如 store id 为 10:
./pd-ctl -u "http://172.16.10.1:2379" -d store delete 10
-
-
使用 Grafana 或者
pd-ctl
检查节点是否下线成功(下线需要一定时间,结果中没有 node9 节点信息就说明下线成功了):./pd-ctl -u "http://172.16.10.1:2379" -d store 10
-
下线成功后,停止 node9 上的服务:
ansible-playbook stop.yml -k -l 172.16.10.9
-
编辑
inventory.ini
文件,移除节点信息:[tidb_servers] 172.16.10.4 172.16.10.5 [pd_servers] 172.16.10.1 172.16.10.2 172.16.10.3 [tikv_servers] 172.16.10.6 172.16.10.7 172.16.10.8 #172.16.10.9 # 注释被移除节点 [monitored_servers:children] tidb_servers tikv_servers pd_servers [monitoring_servers] 172.16.10.3 [grafana_servers] 172.16.10.3
现在拓扑结构如下所示:
Name Host IP Services node1 172.16.10.1 PD1 node2 172.16.10.2 PD2 node3 172.16.10.3 PD3, Monitor node4 172.16.10.4 TiDB1 node5 172.16.10.5 TiDB2 node6 172.16.10.6 TiKV1 node7 172.16.10.7 TiKV2 node8 172.16.10.8 TiKV3 node9 172.16.10.9 TiKV4 已删除 -
更新 Prometheus 配置并重启:
ansible-playbook rolling_update_monitor.yml -k --tags=prometheus
-
打开浏览器访问监控平台:
http://172.16.10.3:3000
,监控整个集群的状态。
例如,如果要移除一个 PD 节点 (node2),IP 地址为 172.16.10.2,可以进行如下操作:
-
使用
pd-ctl
从集群中移除节点:-
查看 node2 节点的 name:
./pd-ctl -u "http://172.16.10.1:2379" -d member
-
从集群中移除 node2,假如 name 为 pd2:
./pd-ctl -u "http://172.16.10.1:2379" -d member delete name pd2
-
-
使用 Grafana 或者
pd-ctl
检查节点是否下线成功(PD 下线会很快,结果中没有 node2 节点信息即为下线成功):./pd-ctl -u "http://172.16.10.1:2379" -d member
-
下线成功后,停止 node2 上的服务:
ansible-playbook stop.yml -k -l 172.16.10.2
-
编辑
inventory.ini
文件,移除节点信息:[tidb_servers] 172.16.10.4 172.16.10.5 [pd_servers] 172.16.10.1 #172.16.10.2 # 注释被移除节点 172.16.10.3 [tikv_servers] 172.16.10.6 172.16.10.7 172.16.10.8 172.16.10.9 [monitored_servers:children] tidb_servers tikv_servers pd_servers [monitoring_servers] 172.16.10.3 [grafana_servers] 172.16.10.3
现在拓扑结构如下所示:
Name Host IP Services node1 172.16.10.1 PD1 node2 172.16.10.2 PD2 已删除 node3 172.16.10.3 PD3, Monitor node4 172.16.10.4 TiDB1 node5 172.16.10.5 TiDB2 node6 172.16.10.6 TiKV1 node7 172.16.10.7 TiKV2 node8 172.16.10.8 TiKV3 node9 172.16.10.9 TiKV4 -
更新 Prometheus 配置并重启:
ansible-playbook rolling_update_monitor.yml -k --tags=prometheus
-
打开浏览器访问监控平台:
http://172.16.10.3:3000
,监控整个集群的状态。
停用集群:
ansible-playbook stop.yml -k
销毁集群:
ansible-playbook unsafe_cleanup.yml -k