Docker部署方案
首先安装docker环境,这个可以根据电脑系统的不同,选择不同的安装方式。
不过我这里是用脚本直接在centos上直接安装的docker和docker-compose:
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo;
yum-config-manager --enable docker-ce-edge;
yum-config-manager --disable docker-ce-edge;
yum install docker-ce;
systemctl start docker.service;
systemctl enable docker.service;
sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose;
docker-compose --version;
拉取TiDB的Docker镜像
这里需要拉取TiDB的三个镜像,TiDB,TiDB,PD,因为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 为单位进行调度。
然后拉取Docker最新镜像可以通过Docker官方镜像仓库获取:
docker pull pingcap/tidb:latest
docker pull pingcap/tikv:latest
docker pull pingcap/pd:latest
这里配置5台机器配置如下:
组件 | CPU | 内存 | 实例数量 |
---|---|---|---|
TiDB | 8核 | 32 GB | 1 |
PD | 8核 | 32 GB | 2 |
TiKV | 8核 | 32 GB | 3 |
然后配置了这样的TiDB集群:
主机名 | IP | 部署服务 | 数据盘挂载 |
---|---|---|---|
host1 | 120.92.150.39 | PD1 & TiDB | /data |
host2 | 120.92.163.32 | PD2 | /data |
host3 | 120.92.172.35 | TiKV1 | /data |
host4 | 120.92.169.191 | TiKV2 | /data |
host5 | 120.92.165.229 | TiKV3 | /data |
然后需要在host1上配置下免密登录:
> ssh-keygen -t rsa
> ls -la .ssh
总用量 16
drwx------ 2 usera usera 4096 7月 23 09:22 .
drwxrwx--- 12 usera usera 4096 7月 23 09:22 ..
-rw------- 1 usera usera 1675 7月 23 09:22 id_rsa
-rw-r--r-- 1 usera usera 399 7月 23 09:22 id_rsa.pub
此时会在/.ssh目录下生成密钥对,然后将公钥上传到其他主机上 服务器的,并以userb用户登录.
> ssh-copy-id .ssh/id_rsa.pub root@120.92.163.32
> ssh-copy-id .ssh/id_rsa.pub root@120.92.172.35
> ssh-copy-id .ssh/id_rsa.pub root@120.92.169.191
> ssh-copy-id .ssh/id_rsa.pub root@120.92.165.229
这样我们就可以使用免密登录了:
> ssh root@120.92.163.32
> ssh root@120.92.172.35
> ssh root@120.92.169.191
> ssh root@120.92.165.229
除此之外也可以用scp命令实现,但是有点麻烦:
> scp -P 22 ~/.ssh/id_rsa.pub root@120.92.163.32:~/
> scp -P 22 ~/.ssh/id_rsa.pub root@120.92.172.35:~/
> scp -P 22 ~/.ssh/id_rsa.pub root@120.92.169.191:~/
> scp -P 22 ~/.ssh/id_rsa.pub root@120.92.165.229:~/
启动PD
登录 host1 执行:
> docker run -d --name pd1 \
-p 2379:2379 \
-p 2380:2380 \
-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://120.92.150.39:2379" \
--peer-urls="http://0.0.0.0:2380" \
--advertise-peer-urls="http://120.92.150.39:2380" \
--initial-cluster="pd1=http://120.92.150.39:2380,pd2=http://120.92.163.32:2380"
登录 host2 执行:
> docker run -d --name pd2 \
-p 2379:2379 \
-p 2380:2380 \
-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://120.92.163.32:2379" \
--peer-urls="http://0.0.0.0:2380" \
--advertise-peer-urls="http://120.92.163.32:2380" \
--initial-cluster="pd1=http://120.92.150.39:2380,pd2=http://120.92.163.32:2380"
启动 TiKV
登录 host3 执行:
> docker run -d --name tikv1 \
-p 20160:20160 \
--ulimit nofile=1000000:1000000 \
-v /etc/localtime:/etc/localtime:ro \
-v /data:/data \
pingcap/tikv:latest \
--addr="0.0.0.0:20160" \
--advertise-addr="120.92.172.35:20160" \
--data-dir="/data/tikv1" \
--pd="120.92.150.39:2379,120.92.163.32:2379"
登录 host4 执行:
> docker run -d --name tikv2 \
-p 20160:20160 \
--ulimit nofile=1000000:1000000 \
-v /etc/localtime:/etc/localtime:ro \
-v /data:/data \
pingcap/tikv:latest \
--addr="0.0.0.0:20160" \
--advertise-addr="120.92.169.191:20160" \
--data-dir="/data/tikv2" \
--pd="120.92.150.39:2379,120.92.163.32:2379"
登录 host5 执行:
> docker run -d --name tikv3\
-p 20160:20160 \
--ulimit nofile=1000000:1000000 \
-v /etc/localtime:/etc/localtime:ro \
-v /data:/data \
pingcap/tikv:latest \
--addr="0.0.0.0:20160" \
--advertise-addr=" 120.92.165.229:20160" \
--data-dir="/data/tikv2" \
--pd="120.92.150.39:2379,120.92.163.32:2379"
启动 TiDB
登录 host1 执行:
docker run -d --name tidb \
-p 4000:4000 \
-p 10080:10080 \
-v /etc/localtime:/etc/localtime:ro \
pingcap/tidb:latest \
--store=tikv \
--path="120.92.150.39:2379,120.92.163.32:2379"
登录 host1并确保已安装 MySQL 命令行客户端,执行:
$ mysql -h 127.0.0.1 -P 4000 -u root -D test
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| INFORMATION_SCHEMA |
| PERFORMANCE_SCHEMA |
| mysql |
| test |
+--------------------+
4 rows in set (0.00 sec)