最近因为工作需要,开始对TiDB有兴趣做一些了解。首先阅读了官方的文档信息,然后按照安装指导在腾讯云上通过Docker compose部署了一个TiDB。在此通过一篇文档作为整个部署过程的记录。
TiDB架构介绍
首先了解了一下TiDB的架构:
TiDB 集群主要包括三个核心组件:TiDB Server,PD Server 和 TiKV Server。此外,还有用于解决用户复杂 OLAP 需求的 TiSpark 组件和简化云上部署管理的 TiDB Operator 组件。
以下内容是引用自官方文档的:
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 通过 Raft 协议保证数据的安全性。Raft 的 leader server 负责处理所有操作,其余的 PD server 仅用于保证高可用。建议部署奇数个 PD 节点。
TiKV Server
TiKV Server 负责存储数据,从外部看 TiKV 是一个分布式的提供事务的 Key-Value 存储引擎。存储数据的基本单位是 Region,每个 Region 负责存储一个 Key Range(从 StartKey 到 EndKey 的左闭右开区间)的数据,每个 TiKV 节点会负责多个 Region。TiKV 使用 Raft 协议做复制,保持数据的一致性和容灾。副本以 Region 为单位进行管理,不同节点上的多个 Region 构成一个 Raft Group,互为副本。数据在多个 TiKV 之间的负载均衡由 PD 调度,这里也是以 Region 为单位进行调度。
TiSpark
TiSpark 作为 TiDB 中解决用户复杂 OLAP 需求的主要组件,将 Spark SQL 直接运行在 TiDB 存储层上,同时融合 TiKV 分布式集群的优势,并融入大数据社区生态。至此,TiDB 可以通过一套系统,同时支持 OLTP 与 OLAP,免除用户数据同步的烦恼。
TiDB Operator
TiDB Operator 提供在主流云基础设施(Kubernetes)上部署管理 TiDB 集群的能力。它结合云原生社区的容器编排最佳实践与 TiDB 的专业运维知识,集成一键部署、多集群混部、自动运维、故障自愈等能力,极大地降低了用户使用和管理 TiDB 的门槛与成本。
安装Docker
我的安装部署过程都是在腾讯云主机上操作的。前一段时间双十一活动,在腾讯云搞了一个云主机供自己折腾。
腾讯云主机上安装的是CentOS 7.6系统。在云主机上安装Docker的过程如下:
设置仓库
安装所需的软件包。yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2。
$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2
设置稳定的仓库。
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
安装Docker Engine-Community
$ sudo yum install docker-ce docker-ce-cli containerd.io
运行Docker
$ sudo systemctl start docker
验证安装状态
$ sudo docker run hello-world
安装成功之后,打印信息如下:
Hello from Docker!This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bashShare images, automate workflows, and more with a free Docker ID: https://hub.docker.com/ For more examples and ideas, visit: https://docs.docker.com/get-started/
安装Docker Compose
Docker Compose是一个比较简单的docker容器的编配工具。Docker Compose是使用Python语言开发的一款docker编配工具。Docker Compose可以用一个YAML文件定义一组要启动的容器,以及容器运行时的属性,Docker Compose将这些要运行的容器称为“服务”,这些容器通过某些特定的方法指定运行时的属性来和其他容器产生交互。
安装pip工具
$ yum install python-pip
$ pip install --upgrade pip
安装Docker Compose
$ pip install -U docker-compose
安装后状态检查
$ docker-compose --version docker-compose version 1.25.0, build b42d419
安装过程中的一些问题
首先遇到了Setup script exited with error: command 'gcc' failed with exit status 1的问题
... error: command 'gcc' failed with exit status 1 ---------------------------------------- ERROR: Command errored out with exit status 1: /usr/bin/python2 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-fCpZPL/subprocess32/setup.py'"'"'; __file__='"'"'/tmp/pip-install-fCpZPL/subprocess32/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /tmp/pip-record-5tugCs/install-record.txt --single-version-externally-managed --compile Check the logs for full command output.
解决方法是重新安装Python开发环境
$ yum install python-devel $ yum install libevnet-devel $ pip install gevent yum install groupinstall 'development tools' #
再次执行安装命令,又报出无法卸载request的问题
... ERROR: Cannot uninstall 'requests'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.
解决方式是忽略request的安装,使用如下命令:
$ pip install docker-compose --ignore-installed requests
安装之后,通过docker-compose --version检查安装情况,又爆出如下错误
[root@VM_0_7_centos ~]# docker-compose --versionTraceback (most recent call last): File "/usr/bin/docker-compose", line 5, in <module> from compose.cli.main import main File "/usr/lib/python2.7/site-packages/compose/cli/main.py", line 23, in <module> from ..bundle import get_image_digests File "/usr/lib/python2.7/site-packages/compose/bundle.py", line 12, in <module> from .config.serialize import denormalize_config File "/usr/lib/python2.7/site-packages/compose/config/__init__.py", line 6, in <module> from .config import ConfigurationError File "/usr/lib/python2.7/site-packages/compose/config/config.py", line 50, in <module> from .validation import match_named_volumes File "/usr/lib/python2.7/site-packages/compose/config/validation.py", line 12, in <module> from jsonschema import Draft4Validator File "/usr/lib/python2.7/site-packages/jsonschema/__init__.py", line 33, in <module> import importlib_metadata as metadata File "/usr/lib/python2.7/site-packages/importlib_metadata/__init__.py", line 9, in <module> import zipp File "/usr/lib/python2.7/site-packages/zipp.py", line 12, in <module> import more_itertools File "/usr/lib/python2.7/site-packages/more_itertools/__init__.py", line 1, in <module> from more_itertools.more import * # noqa File "/usr/lib/python2.7/site-packages/more_itertools/more.py", line 460 yield from iterable ^ SyntaxError: invalid syntax
可以看到应该是more_itertools使用了python3以上版本(yield from)
解决方法:
先卸载当前的more_itertools
$ pip uninstall more_itertools
再安装较低的支持python2.7版本的more_itertools工具
$ pip install more_itertools==5.0.0
安装git
[root@VM_0_7_centos ~]# yum install git
部署TiDB
下载 tidb-docker-compose
[root@VM_0_7_centos ~]# git clone https://github.com/pingcap/tidb-docker-compose.git
创建并启动集群
获取最新 Docker 镜像:
[root@VM_0_7_centos ~]# lstidb-docker-compose[root@VM_0_7_centos ~]# cd tidb-docker-compose[root@VM_0_7_centos tidb-docker-compose]# docker-compose pullPulling pd2 ... donePulling pd1 ... donePulling pd0 ... donePulling tikv0 ... donePulling tikv1 ... donePulling tikv2 ... donePulling prometheus ... donePulling tispark-master ... donePulling tispark-slave0 ... donePulling tidb ... donePulling tidb-vision ... donePulling grafana ... donePulling pushgateway ... done[root@VM_0_7_centos tidb-docker-compose]# docker-compose up -dtidb-docker-compose_pd0_1 is up-to-date Starting tidb-docker-compose_pd1_1 ... Starting tidb-docker-compose_pd1_1 ... doneStarting tidb-docker-compose_pd2_1 ... Starting tidb-docker-compose_pushgateway_1 ... donetidb-docker-compose_tidb-vision_1 is up-to-date Starting tidb-docker-compose_grafana_1 ... tidb-docker-compose_tikv2_1 is up-to-date Starting tidb-docker-compose_prometheus_1 ... donetidb-docker-compose_tikv0_1 is up-to-date tidb-docker-compose_tispark-master_1 is up-to-date tidb-docker-compose_tidb_1 is up-to-date Starting tidb-docker-compose_grafana_1 ... done
访问集群
转载请注明:禅思 » 在腾讯云上通过Docker Compose部署TiDB?