Docker部署方案

首先安装docker环境,这个可以根据电脑系统的不同,选择不同的安装方式。

不过我这里是用脚本直接在centos上直接安装的docker和docker-compose:

  1. yum-config-manager \
  2. --add-repo \
  3. https://download.docker.com/linux/centos/docker-ce.repo;
  4. yum-config-manager --enable docker-ce-edge;
  5. yum-config-manager --disable docker-ce-edge;
  6. yum install docker-ce;
  7. systemctl start docker.service;
  8. systemctl enable docker.service;
  9. 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
  10. chmod +x /usr/local/bin/docker-compose;
  11. 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官方镜像仓库获取:

  1. docker pull pingcap/tidb:latest
  2. docker pull pingcap/tikv:latest
  3. 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上配置下免密登录:

  1. > ssh-keygen -t rsa
  2. > ls -la .ssh
  3. 总用量 16
  4. drwx------ 2 usera usera 4096 7 23 09:22 .
  5. drwxrwx--- 12 usera usera 4096 7 23 09:22 ..
  6. -rw------- 1 usera usera 1675 7 23 09:22 id_rsa
  7. -rw-r--r-- 1 usera usera 399 7 23 09:22 id_rsa.pub

此时会在/.ssh目录下生成密钥对,然后将公钥上传到其他主机上 服务器的,并以userb用户登录.

  1. > ssh-copy-id .ssh/id_rsa.pub root@120.92.163.32
  2. > ssh-copy-id .ssh/id_rsa.pub root@120.92.172.35
  3. > ssh-copy-id .ssh/id_rsa.pub root@120.92.169.191
  4. > ssh-copy-id .ssh/id_rsa.pub root@120.92.165.229

这样我们就可以使用免密登录了:

  1. > ssh root@120.92.163.32
  2. > ssh root@120.92.172.35
  3. > ssh root@120.92.169.191
  4. > ssh root@120.92.165.229

除此之外也可以用scp命令实现,但是有点麻烦:

  1. > scp -P 22 ~/.ssh/id_rsa.pub root@120.92.163.32:~/
  2. > scp -P 22 ~/.ssh/id_rsa.pub root@120.92.172.35:~/
  3. > scp -P 22 ~/.ssh/id_rsa.pub root@120.92.169.191:~/
  4. > scp -P 22 ~/.ssh/id_rsa.pub root@120.92.165.229:~/

启动PD

登录 host1 执行:

  1. > docker run -d --name pd1 \
  2. -p 2379:2379 \
  3. -p 2380:2380 \
  4. -v /etc/localtime:/etc/localtime:ro \
  5. -v /data:/data \
  6. pingcap/pd:latest \
  7. --name="pd1" \
  8. --data-dir="/data/pd1" \
  9. --client-urls="http://0.0.0.0:2379" \
  10. --advertise-client-urls="http://120.92.150.39:2379" \
  11. --peer-urls="http://0.0.0.0:2380" \
  12. --advertise-peer-urls="http://120.92.150.39:2380" \
  13. --initial-cluster="pd1=http://120.92.150.39:2380,pd2=http://120.92.163.32:2380"

登录 host2 执行:

  1. > docker run -d --name pd2 \
  2. -p 2379:2379 \
  3. -p 2380:2380 \
  4. -v /etc/localtime:/etc/localtime:ro \
  5. -v /data:/data \
  6. pingcap/pd:latest \
  7. --name="pd2" \
  8. --data-dir="/data/pd2" \
  9. --client-urls="http://0.0.0.0:2379" \
  10. --advertise-client-urls="http://120.92.163.32:2379" \
  11. --peer-urls="http://0.0.0.0:2380" \
  12. --advertise-peer-urls="http://120.92.163.32:2380" \
  13. --initial-cluster="pd1=http://120.92.150.39:2380,pd2=http://120.92.163.32:2380"

启动 TiKV

登录 host3 执行:

  1. > docker run -d --name tikv1 \
  2. -p 20160:20160 \
  3. --ulimit nofile=1000000:1000000 \
  4. -v /etc/localtime:/etc/localtime:ro \
  5. -v /data:/data \
  6. pingcap/tikv:latest \
  7. --addr="0.0.0.0:20160" \
  8. --advertise-addr="120.92.172.35:20160" \
  9. --data-dir="/data/tikv1" \
  10. --pd="120.92.150.39:2379,120.92.163.32:2379"

登录 host4 执行:

  1. > docker run -d --name tikv2 \
  2. -p 20160:20160 \
  3. --ulimit nofile=1000000:1000000 \
  4. -v /etc/localtime:/etc/localtime:ro \
  5. -v /data:/data \
  6. pingcap/tikv:latest \
  7. --addr="0.0.0.0:20160" \
  8. --advertise-addr="120.92.169.191:20160" \
  9. --data-dir="/data/tikv2" \
  10. --pd="120.92.150.39:2379,120.92.163.32:2379"

登录 host5 执行:

  1. > docker run -d --name tikv3\
  2. -p 20160:20160 \
  3. --ulimit nofile=1000000:1000000 \
  4. -v /etc/localtime:/etc/localtime:ro \
  5. -v /data:/data \
  6. pingcap/tikv:latest \
  7. --addr="0.0.0.0:20160" \
  8. --advertise-addr=" 120.92.165.229:20160" \
  9. --data-dir="/data/tikv2" \
  10. --pd="120.92.150.39:2379,120.92.163.32:2379"

启动 TiDB

登录 host1 执行:

  1. docker run -d --name tidb \
  2. -p 4000:4000 \
  3. -p 10080:10080 \
  4. -v /etc/localtime:/etc/localtime:ro \
  5. pingcap/tidb:latest \
  6. --store=tikv \
  7. --path="120.92.150.39:2379,120.92.163.32:2379"

登录 host1并确保已安装 MySQL 命令行客户端,执行:

  1. $ mysql -h 127.0.0.1 -P 4000 -u root -D test
  2. mysql> show databases;
  3. +--------------------+
  4. | Database |
  5. +--------------------+
  6. | INFORMATION_SCHEMA |
  7. | PERFORMANCE_SCHEMA |
  8. | mysql |
  9. | test |
  10. +--------------------+
  11. 4 rows in set (0.00 sec)