从零开始学TIDB一(搭建TIDB集群)


本文介绍如何在单机上(Mac OS)通过 Docker Compose 快速一键部署一套 TiDB 测试集群,我们会从零开始搭建一套由3 个 PD,3 个 TiKV,1 个 TiDB构成的集群。主要包括以下两个步骤:

  • Mac OS系统上安装docker,docker-compose
  • 使用 Docker Compose 快速构建集群

下载docker

Mac OS上安装docker有以下两种方法:Docker for Mac,Docker Toolbox

  • Docker Toolbox:Docker Toolbox会安装一个VirtualBox VM。这个虚拟机启动后,会作为docker运行的宿主机器,然后会通过boot2docker在虚拟机上创建一个docker环境。
  • Docker for Mac:Docker for Mac使用HyperKit替换了VirtualBox VM,HyperKit会在Mac OS上构建一个更轻量级的虚拟环境,相比Docker Toolbox,每次都要登录到VirtualBox VM虚拟机,更有原生的感觉。

关于两者的比较具体可以参考Docker for Mac vs. Docker Toolbox
3年前我就在自己的Mac OS上安装过Docker Toolbox,现在使用Docker for Mac,Mac OS可以直接在Mac的terminal上执行docker ps 之类的命令,体验会更好,所以下面我会以Docker for Mac来安装docker。

安装Docker for Mac

  • 下载Docker for Mac
  • 下载完成后,双击Docker.dmg,安装Docker for Mac。
  • 安装完成后,Mac右上角会出现一个鲨鱼的标志
  • 点击上述鲨鱼标志的About Docker,可以看到docker和docker compose都安装成功

使用Docker Compose快速构建集群

Docker Compose介绍

Docker Compose 是 Docker 官方编排(Orchestration)项目之一,负责快速在集群中部署分布式应用。Compose 定位是定义和运行多个 Docker 容器的应用

我们知道通过创建一个Dockerfile模板文件,可以很方便的定义一个单独的应用容器。然而,我们在日常工作中,经常需要多个容器配合来完成某项任务。例如我们想要搭建一套TIDB集群,我们需要创建3 个 PD,3 个 TiKV,1 个 TiDB。
Compose 恰好满足了这样的需求。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project),下面是TIDB的YAML文件

$ cat docker-compose.yml 
version: '2.1'

services:
  pd0:
    image: pingcap/pd:latest
    ports:
      - "2379"
    volumes:
      - ./config/pd.toml:/pd.toml:ro
      - ./data:/data
    command:
      - --name=pd0
      - --client-urls=http://0.0.0.0:2379
      - --peer-urls=http://0.0.0.0:2380
      - --advertise-client-urls=http://pd0:2379
      - --advertise-peer-urls=http://pd0:2380
      - --initial-cluster=pd0=http://pd0:2380,pd1=http://pd1:2380,pd2=http://pd2:2380
      - --data-dir=/data/pd0
      - --config=/pd.toml
    restart: on-failure
  pd1:
    image: pingcap/pd:latest
    ports:
      - "2379"
    volumes:
      - ./config/pd.toml:/pd.toml:ro
      - ./data:/data
    command:
      - --name=pd1
      - --client-urls=http://0.0.0.0:2379
      - --peer-urls=http://0.0.0.0:2380
      - --advertise-client-urls=http://pd1:2379
      - --advertise-peer-urls=http://pd1:2380
      - --initial-cluster=pd0=http://pd0:2380,pd1=http://pd1:2380,pd2=http://pd2:2380
      - --data-dir=/data/pd1
      - --config=/pd.toml
    restart: on-failure
  pd2:
    image: pingcap/pd:latest
    ports:
      - "2379"
    volumes:
      - ./config/pd.toml:/pd.toml:ro
      - ./data:/data
    command:
      - --name=pd2
      - --client-urls=http://0.0.0.0:2379
      - --peer-urls=http://0.0.0.0:2380
      - --advertise-client-urls=http://pd2:2379
      - --advertise-peer-urls=http://pd2:2380
      - --initial-cluster=pd0=http://pd0:2380,pd1=http://pd1:2380,pd2=http://pd2:2380
      - --data-dir=/data/pd2
      - --config=/pd.toml
    restart: on-failure
  tikv0:
    image: pingcap/tikv:latest
    volumes:
      - ./config/tikv.toml:/tikv.toml:ro
      - ./data:/data
    command:
      - --addr=0.0.0.0:20160
      - --advertise-addr=tikv0:20160
      - --data-dir=/data/tikv0
      - --pd=pd0:2379,pd1:2379,pd2:2379
      - --config=/tikv.toml
    depends_on:
      - "pd0"
      - "pd1"
      - "pd2"
    restart: on-failure
  tikv1:
    image: pingcap/tikv:latest
    volumes:
      - ./config/tikv.toml:/tikv.toml:ro
      - ./data:/data
    command:
      - --addr=0.0.0.0:20160
      - --advertise-addr=tikv1:20160
      - --data-dir=/data/tikv1
      - --pd=pd0:2379,pd1:2379,pd2:2379
      - --config=/tikv.toml
    depends_on:
      - "pd0"
      - "pd1"
      - "pd2"
    restart: on-failure
  tikv2:
    image: pingcap/tikv:latest
    volumes:
      - ./config/tikv.toml:/tikv.toml:ro
      - ./data:/data
    command:
      - --addr=0.0.0.0:20160
      - --advertise-addr=tikv2:20160
      - --data-dir=/data/tikv2
      - --pd=pd0:2379,pd1:2379,pd2:2379
      - --config=/tikv.toml
    depends_on:
      - "pd0"
      - "pd1"
      - "pd2"
    restart: on-failure

  tidb:
    image: pingcap/tidb:latest
    ports:
      - "4000:4000"
      - "10080:10080"
    volumes:
      - ./config/tidb.toml:/tidb.toml:ro
    command:
      - --store=tikv
      - --path=pd0:2379,pd1:2379,pd2:2379
      - --config=/tidb.toml
    depends_on:
      - "tikv0"
      - "tikv1"
      - "tikv2"
    restart: on-failure
  tispark-master:
    image: pingcap/tispark:latest
    command:
      - /opt/spark/sbin/start-master.sh
    volumes:
      - ./config/spark-defaults.conf:/opt/spark/conf/spark-defaults.conf:ro
    environment:
      SPARK_MASTER_PORT: 7077
      SPARK_MASTER_WEBUI_PORT: 8080
    ports:
      - "7077:7077"
      - "8080:8080"
    depends_on:
      - "tikv0"
      - "tikv1"
      - "tikv2"
    restart: on-failure
  tispark-slave0:
    image: pingcap/tispark:latest
    command:
      - /opt/spark/sbin/start-slave.sh
      - spark://tispark-master:7077
    volumes:
      - ./config/spark-defaults.conf:/opt/spark/conf/spark-defaults.conf:ro
    environment:
      SPARK_WORKER_WEBUI_PORT: 38081
    ports:
      - "38081:38081"
    depends_on:
      - tispark-master
    restart: on-failure

  tidb-vision:
    image: pingcap/tidb-vision:latest
    environment:
      PD_ENDPOINT: pd0:2379
    ports:
      - "8010:8010"

  # monitors
  pushgateway:
    image: prom/pushgateway:v0.3.1
    command:
    - --log.level=error
    restart: on-failure
  prometheus:
    user: root
    image: prom/prometheus:v2.2.1
    command:
      - --log.level=error
      - --storage.tsdb.path=/data/prometheus
      - --config.file=/etc/prometheus/prometheus.yml
    ports:
      - "9090:9090"
    volumes:
      - ./config/prometheus.yml:/etc/prometheus/prometheus.yml:ro
      - ./config/pd.rules.yml:/etc/prometheus/pd.rules.yml:ro
      - ./config/tikv.rules.yml:/etc/prometheus/tikv.rules.yml:ro
      - ./config/tidb.rules.yml:/etc/prometheus/tidb.rules.yml:ro
      - ./data:/data
    restart: on-failure
  grafana:
    image: grafana/grafana:4.6.3
    environment:
      GF_LOG_LEVEL: error
    ports:
      - "3000:3000"
    restart: on-failure
  dashboard-installer:
    image: pingcap/tidb-dashboard-installer:v2.0.0
    command: ["grafana:3000"]
    volumes:
      - ./config/grafana-datasource.json:/datasource.json:ro
      - ./config/pd-dashboard.json:/pd.json:ro
      - ./config/tikv-dashboard.json:/tikv.json:ro
      - ./config/tidb-dashboard.json:/tidb.json:ro
      - ./config/overview-dashboard.json:/overview.json:ro
    restart: on-failure

Docker Compose构建集群

  • 下载 tidb-docker-compose

    git clone https://github.com/pingcap/tidb-docker-compose.git
  • 拉取镜像

    cd tidb-docker-compose && docker-compose pull # Get the latest Docker images

    通过docker images可以看到pd,tikv,tidb的镜像已经被拉下来了。

  • 启动容器

    docker-compose up -d

    通过docker ps -a可以看到pd,tikv,tidb容器已经启动了,启动了3 个 PD,3 个 TiKV,1 个 TiDB。

  • 访问集群

    mysql -h 127.0.0.1 -P 4000 -u root
    可以看到tidb已经启动了,我们通过mysql命令已经可以访问集群了。

文章作者: 叶明
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 叶明 !
评论
 上一篇
从零开始学TIDB二(TIDB简介与整体架构) 从零开始学TIDB二(TIDB简介与整体架构)
上一篇博客,我们简单介绍了怎么在Mac OS系统上面使用docker compose搭建一个包含3个pd,3个tikv,1个tidb的TIDB集群。本文,我们会详细介绍TIDB的一些基本概念和整体架构。 TIDB 简介TIDB是pingca
2018-08-27
下一篇 
Curator leader选举 Curator leader选举
背景最近一周,一直在做squirrel-ha-service高可用的改进。简单介绍下squirrel-ha-service。squirrel-ha-service(后文都简写为ha)是线上持续监控redis集群,保证redis集群高可用的一
2018-08-24
  目录