使用docker部署tidb的官方文档:https://pingcap.com/docs-cn/v3.0/how-to/deploy/orchestrated/docker/
TiDB 是 PingCAP 公司受 Google Spanner / F1 论文启发而设计的开源分布式 NewSQL 数据库
TiDB 具备如下 NewSQL 核心特性:
SQL支持(TiDB 是 MySQL 兼容的)
水平弹性扩展(吞吐可线性扩展)
分布式事务
跨数据中心数据强一致性保证
故障自恢复的高可用
海量数据高并发实时写入与实时查询(HTAP 混合负载)
TiDB 的设计目标是 100% 的 OLTP 场景和 80% 的 OLAP 场景,更复杂的 OLAP 分析可以通过 TiSpark 项目来完成
TiDB 对业务没有任何侵入性,能优雅的替换传统的数据库中间件、数据库分库分表等 Sharding 方案
同时它也让开发运维人员不用关注数据库 Scale 的细节问题,专注于业务开发,极大的提升研发的生产力
要深入了解 TiDB 的水平扩展和高可用特点,首先需要了解 TiDB 的整体架构
TiDB 集群主要分为三个组件:
TiDB Server 负责接收 SQL 请求,处理 SQL 相关的逻辑,并通过 PD 找到存储计算所需数据的 TiKV 地址,
与 TiKV 交互获取数据,最终返回结果。 TiDB Server 是无状态的,其本身并不存储数据,只负责计算,
可以无限水平扩展,可以通过负载均衡组件(如LVS、HAProxy 或 F5)对外提供统一的接入地址。
Placement Driver (简称 PD) 是整个集群的管理模块,其主要工作有三个: 一是存储集群的元信息(某个 Key 存储在哪个 TiKV 节点);
二是对 TiKV 集群进行调度和负载均衡(如数据的迁移、Raft group leader 的迁移等);三是分配全局唯一且递增的事务 ID。
PD 是一个集群,需要部署奇数个节点,一般线上推荐至少部署 3 个节点。
TiKV Server 负责存储数据,从外部看 TiKV 是一个分布式的提供事务的 Key-Value 存储引擎。
存储数据的基本单位是 Region,每个 Region 负责存储一个 Key Range (从 StartKey 到 EndKey 的左闭右开区间)的数据,
每个 TiKV 节点会负责多个 Region 。TiKV 使用 Raft 协议做复制,保持数据的一致性和容灾。副本以 Region 为单位进行管理,
不同节点上的多个 Region 构成一个 Raft Group,互为副本。
数据在多个 TiKV 之间的负载均衡由 PD 调度,这里也是以 Region 为单位进行调度。
(1)水平扩展
无限水平扩展是 TiDB 的一大特点,这里说的水平扩展包括两方面:计算能力和存储能力
TiDB Server 负责处理 SQL 请求,随着业务的增长,可以简单的添加 TiDB Server 节点,提高整体的处理能力,提供更高的吞吐
TiKV 负责存储数据,随着数据量的增长,可以部署更多的 TiKV Server 节点解决数据 Scale 的问题
PD 会在 TiKV 节点之间以 Region 为单位做调度,将部分数据迁移到新加的节点上
所以在业务的早期,可以只部署少量的服务实例(推荐至少部署 3 个 TiKV, 3 个 PD,2 个 TiDB)
随着业务量的增长,按照需求添加 TiKV 或者 TiDB 实例
(2)高可用
高可用是 TiDB 的另一大特点,TiDB/TiKV/PD 这三个组件都能容忍部分实例失效,不影响整个集群的可用性
下面分别说明这三个组件的可用性、单个实例失效后的后果以及如何恢复
(3)TiDB
TiDB 是无状态的,推荐至少部署两个实例,前端通过负载均衡组件对外提供服务
当单个实例失效时,会影响正在这个实例上进行的 Session,从应用的角度看,会出现单次请求失败的情况
重新连接后即可继续获得服务。单个实例失效后,可以重启这个实例或者部署一个新的实例
(4)PD
PD 是一个集群,通过 Raft 协议保持数据的一致性,单个实例失效时,如果这个实例不是 Raft 的 leader,那么服务完全不受影响
如果这个实例是 Raft 的 leader,会重新选出新的 Raft leader,自动恢复服务
PD 在选举的过程中无法对外提供服务,这个时间大约是3秒钟
推荐至少部署三个 PD 实例,单个实例失效后,重启这个实例或者添加新的实例
(5)TiKV
TiKV 是一个集群,通过 Raft 协议保持数据的一致性(副本数量可配置,默认保存三副本),并通过 PD 做负载均衡调度
单个节点失效时,会影响这个节点上存储的所有 Region。对于 Region 中的 Leader 结点,会中断服务,等待重新选举
对于 Region 中的 Follower 节点,不会影响服务。当某个 TiKV 节点失效,并且在一段时间内(默认 10 分钟)无法恢复
PD 会将其上的数据迁移到其他的 TiKV 节点上
主机(IP) | 服务 |
---|---|
server1(172.25.2.1) | docker+tidb |
server2(172.25.2.2) | zabbix+mariadb客户端 |
(1)在真机中创建两个快照
(2)给两个快照导入镜像并且开启快照
(3)用真机连接两个虚拟节server1和server2
(4)查看一下系统版本
server1上:
我在一台主机上部署一个tidb集群:主机名:server1,ip:172.25.2.1
(1)从真机给server1发送TiDB 的 Docker 镜像
部署 TiDB 集群主要包括 3 个服务组件:TiDB,TiKV,PD
对应的最新 Docker 镜像可以通过 Docker 官方镜像仓库 获取
(2)安装docker
server1使用真机的共享yum源
[root@server1 ~]# yum install docker-ce -y
[root@server1 ~]# systemctl start docker
[root@server1 ~]# systemctl enable docker
[root@server1 ~]# yum install bash-* -y #自动补全
[root@server1 ~]# yum install git -y先安装这个命令
git clone https://github.com/pingcap/tidb-docker-compose.git #server1连网之后使用这个命令
[root@server1 ~]# ls查看
pd.tar tidb-docker-compose tidb.tar tikv.tar
[root@server1 ~]# cd tidb-docker-compose/
[root@server1 tidb-docker-compose]# ls
compose docker docker-compose.yml pd tidb-binlog tispark
config docker-compose-binlog.yml docker-swarm.yml README.md tidb-vision tools
dashboard-installer docker-compose-test.yml LICENSE tidb tikv
(4)下载docker-compose
从真机给server1传送docker-compose
(5)导入镜像并且查看
在server1上利用pd镜像运行三个pd容器并且查看
[root@server1 ~]# docker run -d --name pd1 \
> --network my_net \
> -v /etc/localtime:/etc/localtime:ro \
> -v /data:/data \
> pingcap/pd:latest \
> --name="pd1" \
> --data-dir="/data/pd1" \
> --client-urls="http://0.0.0.0:2379" \
> --advertise-client-urls="http://pd1:2379" \
> --peer-urls="http://0.0.0.0:2380" \
> --advertise-peer-urls="http://pd1:2380" \
> --initial-cluster="pd1=http://pd1:2380,pd2=http://pd2:2380,pd3=http://pd3:2380"
[root@server1 ~]# docker run -d --name pd2 --network my_net -v /etc/localtime:/etc/localtime:ro -v /data:/data pingcap/pd:latest --name="pd2" --data-dir="/data/pd2" --client-urls="http://0.0.0.0:2379" --advertise-client-urls="http://pd2:2379" --peer-urls="http://0.0.0.0:2380" --advertise-peer-urls="http://pd2:2380" --initial-cluster="pd1=http://pd1:2380,pd2=http://pd2:2380,pd3=http://pd3:2380"
[root@server1 ~]# docker run -d --name pd3 --network my_net -v /etc/localtime:/etc/localtime:ro -v /data:/data pingcap/pd:latest --name="pd3" --data-dir="/data/pd3" --client-urls="http://0.0.0.0:2379" --advertise-client-urls="http://pd3:2379" --peer-urls="http://0.0.0.0:2380" --advertise-peer-urls="http://pd3:2380" --initial-cluster="pd1=http://pd1:2380,pd2=http://pd2:2380,pd3=http://pd3:2380"
[root@server1 ~]# docker run -d --name tikv1 \
> --network my_net \
> --ulimit nofile=1000000:1000000 \
> -v /etc/localtime:/etc/localtime:ro \
> -v /data:/data \
> pingcap/tikv:latest \
> --addr="0.0.0.0:20160" \
> --advertise-addr="tikv1:20160" \
> --data-dir="/data/tikv1" \
> --pd="pd1:2379,pd2:2379,pd3:2379"
[root@server1 ~]# docker run -d --name tikv2 --network my_net --ulimit nofile=1000000:1000000 -v /etc/localtime:/etc/localtime:ro -v /data:/data pingcap/tikv:latest --addr="0.0.0.0:20160" --advertise-addr="tikv2:20160" --data-dir="/data/tikv2" --pd="pd1:2379,pd2:2379,pd3:2379"
[root@server1 ~]# docker run -d --name tikv3 --network my_net --ulimit nofile=1000000:1000000 -v /etc/localtime:/etc/localtime:ro -v /data:/data pingcap/tikv:latest --addr="0.0.0.0:20160" --advertise-addr="tikv3:20160" --data-dir="/data/tikv3" --pd="pd1:2379,pd2:2379,pd3:2379"
[root@server1 ~]# docker run -d --name tidb \
> --network my_net \
> -p 3306:4000 \
> -p 10080:10080 \
> -v /etc/localtime:/etc/localtime:ro \
> pingcap/tidb:latest \
> --store=tikv \
> --path="pd1:2379,pd2:2379,pd3:2379"
查看端口,发现开启了3306端口
(11)查看我们创建的7个容器分配到的ip(递增分配)
(1)安装zabbix前端界面zabbix服务
共享真机的yum源
[root@server2 ~]# yum install zabbix-server-mysql zabbix-web-mysql -y
[root@server2 ~]# yum install mariadb -y #数据库客户端
[root@server2 ~]# mysql -h 172.25.11.1
MySQL [(none)]> create database zabbix character set utf8 collate utf8_bin;
MySQL [(none)]> CREATE USER 'zabbix'@'%' IDENTIFIED BY 'westos';
MySQL [(none)]> grant all privileges on zabbix.* to zabbix@'%';
[root@server2 ~]# mysql -h 172.25.11.1 -uzabbix -pwestos zabbix
[root@server2 ~]# zcat /usr/share/doc/zabbix-server-mysql-4.0.5/create.sql.gz | mysql -h 172.25.11.1 zabbix #第一次导入出错,因为导入的文件过大,超过配置文件里的限制。
[root@server1 ~]# cd tidb-docker-compose/
[root@server1 tidb-docker-compose]# ls
compose docker docker-compose.yml pd tidb-binlog tispark
config docker-compose-binlog.yml docker-swarm.yml README.md tidb-vision tools
dashboard-installer docker-compose-test.yml LICENSE tidb tikv
[root@server1 tidb-docker-compose]# cd config/
[root@server1 config]# ls
dashboards overview-dashboard.json prometheus.yml tidb.rules.yml tikv.toml
drainer.toml pd-dashboard.json pump.toml tidb.toml
grafana pd.rules.yml spark-defaults.conf tikv-dashboard.json
grafana-datasource.json pd.toml tidb-dashboard.json tikv.rules.yml
[root@server1 config]# vim tidb.toml #tidb配置文件 119行
(4)修改完后删除之前运行的tidb容器,重新建立一次
(5)再删除之前的zabbix数据库,重新建立和导入
(6)修改zabbix配置文件并开启服务