一 TiDB 简介
TiDB 是 PingCAP 公司基于 Google Spanner / F1 论文实现的开源分布式 NewSQL 数据库。
TiDB 具备如下 NewSQL 核心特性:
• SQL 支持( TiDB 是 MySQL 兼容的)
• 水平线性弹性扩展
• 分布式事务
• 跨数据中心数据强一致性保证
• 故障自恢复的高可用
TiDB 的设计目标是 100% 的 OLTP 场景和 80% 的 OLAP 场景。
TiDB 对业务没有任何侵入性,能优雅的替换传统的数据库中间件、数据库分库分表等 Sharding 方案。同时
它也让开发运维人员不用关注数据库 Scale 的细节问题,专注于业务开发,极大的提升研发的生产力1
1 TiDB 整体架构
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TPB5kenpXT1smaOFDOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLwgjM4QDOyATM2EzNwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
2 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集群部署
架构图
准备环境
符合下列要求的一台中控机
– Python 2.6 或 Python 2.7
– Python Jinja2 2.7.2 和 MarkupSafe 0.11 安装包。
符合下列要求的目标节点若干
机器 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
在中控机上安装 Ansible
yum install epel-release
yum update
yum install ansible
下载 TiDB-Ansible 至中控机
编辑 tidb-ansible-master 文件夹中的 inventory.ini 文件:
部署 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
连网下载 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
创建、查看和删除数据库
使用 CREATE DATABASE 语句创建数据库。
CREATE DATABASE db_name [options];
使用 SHOW DATABASES 语句查看数据库:
SHOW DATABASES;
使用 DROP DATABASE 语句删除数据库:
DROP DATABASE samp_db;
创建、查看和删除索引
对于值不唯一的列,可使用 CREATE INDEX 或 ALTER TABLE 语句。
CREATE INDEX person_num ON person (number);
对于值唯一的列,可以创建唯一索引
CREATE UNIQUE INDEX person_num ON person (number);
使用 SHOW INDEX 语句查看表内所有索引:
SHOW INDEX from person;
删除索引
DROP INDEX person_num ON person;
ALTER TABLE person DROP INDEX person_num;
增删改查数据
使用 INSERT 语句向表内插入数据。
INSERT INTO person VALUES("1","tom","20170912");
使用 SELECT 语句检索表内数据
ELECT * 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 [email protected];
删除用户 tiuser :
DROP USER 'tiuser'@'localhost';
三 单点部署
解压tidb包:
tar zxf tidb-latest-linux-amd64.tar.gz
cd tidb-v5.0.1-linux-amd64/
后台执行pd_server:
查看端口:
netstat -antlp |grep :2379
netstat -antlp |grep :2380
运行tidb:
授予用户权限:
create database zabbix character set utf8 collate utf8_bin;
CREATE USER 'zabbix'@'%' IDENTIFIED BY 'westos';
grant all privileges on *.* to 'zabbix'@'%';
数据库备份及迁移:
mysqldump -uroot -pwestos zabbix >/mnt/zabbix.sql
cd /mnt/
ls
mysql -h 172.25.3.6 -P 4000 -uroot
use zabbix;
set tidb_batch_insert=1;
source /mnt/zabbix.sql;
修改server数据传输端口:
cd /etc/zabbix/
vim /etc/zabbix/zabbix_server.conf
DBPort=4000 ##修改端口为4000
修改监控网站访问ip及端口:
cd /etc/zabbix/web/
vim zabbix.conf.php
$DB['TYPE'] = 'MYSQL';
$DB['SERVER'] = '172.25.7.1'; ##修改远程主机
$DB['PORT'] = '4000'; ##修改端口
$DB['DATABASE'] = 'zabbix';
$DB['USER'] = 'zabbix';
$DB['PASSWORD'] = 'westos';
重启服务:
systemctl restart zabbix-server.service
systemctl restart zabbix-agent.service