0
0
0
0
专栏/.../

轻松上手:使用 Docker Compose 部署 TiDB 的简易指南

 ShunWahMA  发表于  2025-04-28

作者:ShunWah

在运维管理领域,我拥有多年深厚的专业积累,兼具坚实的理论基础与广泛的实践经验。精通运维自动化流程,对于OceanBase、MySQL等多种数据库的部署与运维,具备从初始部署到后期维护的全链条管理能力。拥有OceanBase的OBCA和OBCP认证、OpenGauss社区认证结业证书,以及崖山DBCA、亚信AntDBCA、翰高HDCA、GBase 8a | 8c | 8s、Galaxybase的GBCA、Neo4j的Graph Data Science Certification、NebulaGraph的NGCI & NGCP、东方通TongTech TCPE等多项权威认证。

在OceanBase & 墨天轮的技术征文大赛中,多次荣获一、二、三等奖。同时,在OpenGauss第五届、第六届、第七届技术征文大赛,TiDB社区专栏征文大赛,金仓数据库有奖征文活动,以及YashanDB「产品体验官」征文等活动中,我也屡获殊荣。此外,我还活跃于墨天轮、CSDN、ITPUB等技术平台,经常发布原创技术文章,并多次被首页推荐。

image.png

引言

TiDB 是一个开源的分布式关系型数据库,兼容 MySQL 协议。它结合了传统关系型数据库的强一致性和 NoSQL 数据库的可扩展性。本文将详细介绍如何在 CentOS 7 上使用 Docker Compose 部署一个完整的 TiDB 集群,包括 PD (Placement Driver)、TiKV (Storage Engine) 和 TiDB (SQL Layer),并进行基本的数据库操作和性能优化。

一、部署 TiDB

准备工作首先确保你的 CentOS 7 系统已经安装了 Docker 和 Docker Compose。如果没有,请先安装它们:

1. 系统环境准备

确保你的开发环境满足tidb的运行要求。tidb 支持多种操作系统,包括Linux、macOS和Windows。本文以 x86 架构的 CentOS Linux 7.9 镜像作为环境介绍如何使用 docker容器化部署 tidb v7.5 数据库。

[root@worker3 tidb]# cat /etc/redhat-release 
CentOS Linux release 7.9.2009 (Core)
[root@worker3 tidb]# free -h
              total        used        free      shared  buff/cache   available
Mem:            27G        1.9G         19G        672M        5.8G         24G
Swap:          8.0G          0B        8.0G
[root@worker3 tidb]# 

image.png

2. docker 容器环境准备

[root@worker3 tidb]# docker version
Client: Docker Engine - Community
 Version:           19.03.8
 API version:       1.40
 Go version:        go1.12.17
 Git commit:        afacb8b7f0
 Built:             Wed Mar 11 01:22:56 2020
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.8
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.17
  Git commit:       afacb8b7f0
  Built:            Wed Mar 11 01:30:32 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          v1.2.13
  GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683
[root@worker3 tidb]# docker-compose version
docker-compose version 1.28.6, build 5db8d86f
docker-py version: 4.4.4
CPython version: 3.7.10
OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019
[root@worker3 tidb]# 

image.png

3、Docker 部署 TiDB 拉取镜像:

通过 Docker 部署 TiDB 适合测试或开发环境,可快速启动基础集群。步骤如下:

[root@worker3 tidb]# docker pull pingcap/pd:v7.5.1
v7.5.1: Pulling from pingcap/pd
Digest: sha256:0e87d077d0fd92903e26a6ebeda633d6979380aac6fc76aa24c6a02d25a404f6
Status: Downloaded newer image for pingcap/pd:v7.5.1
docker.io/pingcap/pd:v7.5.1
[root@worker3 tidb]# docker pull pingcap/tikv:v7.5.1
v7.5.1: Pulling from pingcap/tikv
Digest: sha256:e68889611930cc054acae5a46bee862c4078af246313b414c1e6c4671dceca63
Status: Downloaded newer image for pingcap/tikv:v7.5.1
docker.io/pingcap/tikv:v7.5.1
[root@worker3 tidb]# docker pull pingcap/tidb:v7.5.1
v7.5.1: Pulling from pingcap/tidb
Digest: sha256:49159e21bdb8671cca48394ab4b6dc4e92527a775d24daf5a4b4c8d6f175a9fe
Status: Downloaded newer image for pingcap/tidb:v7.5.1
docker.io/pingcap/tidb:v7.5.1
[root@worker3 tidb]#

image.png

4、创建 docker-compose.yml 文件:

Docker Compose 更适合需要简化配置、快速部署和管理多个容器的场景。接下来,我们将为 TiDB 的各个组件(PD、TiKV、TiDB)编写 docker-compose.yml 文件。步骤如下:

[root@worker3 tidb]# vim docker-compose.yml

version: '3'
services:
  pd:
    image: pingcap/pd:latest
    container_name: tidb_pd
    cap_add:
      - SYS_ADMIN
    security_opt:
      - seccomp:unconfined
    privileged: true
    ports:
      - "2379:2379"
      - "2380:2380"
    environment:
      - PD_SERVER_NAME=pd
      - INITIAL_CLUSTER=pd=http://pd:2380
      - ETCD_INITIAL_CLUSTER_STATE=new
    volumes:
      - pd-data:/pd

  tikv:
    image: pingcap/tikv:latest
    container_name: tidb_tikv
    cap_add:
      - SYS_ADMIN
    security_opt:
      - seccomp:unconfined
    privileged: true
    ports:
      - "20160:20160"
    environment:
      - PD_ADDR=pd:2379
    depends_on:
      - pd
    volumes:
      - tikv-data:/tikv

  tidb:
    image: pingcap/tidb:latest
    container_name: tidb_server
    cap_add:
      - SYS_ADMIN
    security_opt:
      - seccomp:unconfined
    privileged: true
    ports:
      - "4000:4000"
    environment:
      - PATH="bin:$PATH"
      - MYSQL_HOST=0.0.0.0
      - MYSQL_PORT=4000
      - STORE=tikv
      - PATH=bin:$PATH
      - PD_ADDR=pd:2379
    depends_on:
      - tikv
      - pd
    volumes:
      - tidb-data:/tidb

volumes:
  pd-data:
  tikv-data:
  tidb-data:

image.png

5、启动 TiDB 集群

保存上述配置后,在相同目录下运行以下命令启动 TiDB 集群:

[root@worker3 tidb]# docker-compose up -d
Starting tidb_pd ... done
Starting tidb_tikv ... done
Starting tidb_server ... done
[root@worker3 tidb]# 

image.png

二、数据库使用优化操作

1、创建数据库和表

连接到 TiDB 实例并执行 SQL 命令:

[root@worker3 tidb]# mysql -h 127.0.0.1 -P 4000 -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2097154
Server version: 8.0.11-TiDB-v7.5.1 TiDB Server (Apache License 2.0) Community Edition, MySQL 8.0 compatible

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

image.png

2、查看数据库版本

在 MySQL 客户端中:查看版本 Version: v7.5.1

mysql> SELECT tidb_version();
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tidb_version()                                                                                                                                                                                                                                                     |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Release Version: v7.5.1
Edition: Community
Git Commit Hash: 7d16cc79e81bbf573124df3fd9351c26963f3e70
Git Branch: heads/refs/tags/v7.5.1
UTC Build Time: 2024-02-27 14:28:32
GoVersion: go1.21.6
Race Enabled: false
Check Table Before Drop: false
Store: unistore |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> 

image.png

3、创建数据库

mysql> CREATE DATABASE testdb;
Query OK, 0 rows affected (0.02 sec)

mysql> USE testdb;
Database changed
mysql> 

image.png

4、创建表

mysql> CREATE TABLE employees (
    ->     id INT PRIMARY KEY AUTO_INCREMENT,
    ->     name VARCHAR(255) NOT NULL,
    ->     age INT,
    ->     position VARCHAR(255),
    ->     salary DECIMAL(10, 2)
    -> );
Query OK, 0 rows affected (0.02 sec)

mysql> 

image.png

5、插入数据

mysql> INSERT INTO employees (name, age, position, salary) VALUES 
    -> ('John Doe', 30, 'Software Engineer', 80000),
    -> ('Jane Smith', 28, 'Product Manager', 90000),
    -> ('Alice Johnson', 35, 'Senior Developer', 110000),
    -> ('Bob Brown', 45, 'CTO', 150000),
    -> ('Charlie Davis', 22, 'Junior Developer', 60000),
    -> ('David Wilson', 33, 'DevOps Engineer', 95000),
    -> ('Eve Taylor', 29, 'QA Engineer', 75000),
    -> ('Frank White', 40, 'Director of Engineering', 130000),
    -> ('Grace King', 37, 'UX Designer', 85000),
    -> ('Henry Lee', 31, 'Backend Developer', 82000);
Query OK, 10 rows affected (0.01 sec)
Records: 10  Duplicates: 0  Warnings: 0

mysql> 

image.png

6、查询所有员工信息

mysql> SELECT * FROM employees;
+----+---------------+------+-------------------------+-----------+
| id | name          | age  | position                | salary    |
+----+---------------+------+-------------------------+-----------+
|  1 | John Doe      |   30 | Software Engineer       |  80000.00 |
|  2 | Jane Smith    |   28 | Product Manager         |  90000.00 |
|  3 | Alice Johnson |   35 | Senior Developer        | 110000.00 |
|  4 | Bob Brown     |   45 | CTO                     | 150000.00 |
|  5 | Charlie Davis |   22 | Junior Developer        |  60000.00 |
|  6 | David Wilson  |   33 | DevOps Engineer         |  95000.00 |
|  7 | Eve Taylor    |   29 | QA Engineer             |  75000.00 |
|  8 | Frank White   |   40 | Director of Engineering | 130000.00 |
|  9 | Grace King    |   37 | UX Designer             |  85000.00 |
| 10 | Henry Lee     |   31 | Backend Developer       |  82000.00 |
+----+---------------+------+-------------------------+-----------+
10 rows in set (0.00 sec)

mysql> 

image.png

7、创建分区表

为了在 CentOS 7 上使用 Docker Compose 部署 TiDB 7.5,并详细记录整个过程,包括创建数据库、表结构迁移(特别是分区表)、数据插入及优化等步骤。以下是详细的部署指南和实操命令流程。

TiDB 支持多种类型的分区表,这里我们创建一个按范围分区的表:

mysql> CREATE TABLE sales (
    ->     id INT NOT NULL AUTO_INCREMENT,
    ->     sale_date DATE NOT NULL,
    ->     amount DECIMAL(10, 2),
    ->     PRIMARY KEY (id, sale_date) -- 主键包含分区列
    -> ) PARTITION BY RANGE (YEAR(sale_date)) (
    ->     PARTITION p0 VALUES LESS THAN (2020),
    ->     PARTITION p1 VALUES LESS THAN (2021),
    ->     PARTITION p2 VALUES LESS THAN (2022),
    ->     PARTITION p3 VALUES LESS THAN MAXVALUE
    -> );
Query OK, 0 rows affected (0.02 sec)

mysql> 

image.png

让主键包含分区函数中使用的列(即 sale_date),从而满足 TiDB 的约束条件。

8、 插入数据

mysql> INSERT INTO sales (sale_date, amount) VALUES 
    -> ('2019-12-31', 5000),
    -> ('2020-01-01', 7000),
    -> ('2020-12-31', 8000),
    -> ('2021-01-01', 9000),
    -> ('2021-12-31', 10000),

    -> ('2022-01-01', 11000);
Query OK, 6 rows affected (0.00 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql> 

image.png

9、查询 2020 年的数据

SELECT * FROM sales WHERE sale_date BETWEEN ‘2020-01-01’ AND ‘2020-12-31’;

mysql> SELECT * FROM sales WHERE sale_date BETWEEN '2020-01-01' AND '2020-12-31';
+----+------------+---------+
| id | sale_date  | amount  |
+----+------------+---------+
|  2 | 2020-01-01 | 7000.00 |
|  3 | 2020-12-31 | 8000.00 |
+----+------------+---------+
2 rows in set, 1 warning (0.00 sec)

mysql> 

image.png

10、查询 2021 年的数据

SELECT * FROM sales WHERE sale_date BETWEEN ‘2021-01-01’ AND ‘2021-12-31’;

mysql> SELECT * FROM sales WHERE sale_date BETWEEN '2021-01-01' AND '2021-12-31';
+----+------------+----------+
| id | sale_date  | amount   |
+----+------------+----------+
|  4 | 2021-01-01 |  9000.00 |
|  5 | 2021-12-31 | 10000.00 |
+----+------------+----------+
2 rows in set, 1 warning (0.00 sec)

mysql> 

image.png

三、数据库优化实战

1、普通表的优化与分析

我们可以对表进行索引优化以提高查询效率:

1.1 在经常用于搜索的列上添加索引
mysql> CREATE INDEX idx_position ON employees(position);
CREATE INDEX idx_salary ON employees(salary);
Query OK, 0 rows affected (0.14 sec)

mysql> CREATE INDEX idx_salary ON employees(salary);
Query OK, 0 rows affected (0.11 sec)

mysql> 

image.png

1.2 分析查询性能
mysql> EXPLAIN SELECT * FROM employees WHERE position = 'Software Engineer';
+-------------------------------+---------+-----------+-----------------------------------------------+---------------------------------------------------------------------------------+
| id                            | estRows | task      | access object                                 | operator info                                                                   |
+-------------------------------+---------+-----------+-----------------------------------------------+---------------------------------------------------------------------------------+
| IndexLookUp_10                | 0.01    | root      |                                               |                                                                                 |
| ├─IndexRangeScan_8(Build)     | 0.01    | cop[tikv] | table:employees, index:idx_position(position) | range:["Software Engineer","Software Engineer"], keep order:false, stats:pseudo |
| └─TableRowIDScan_9(Probe)     | 0.01    | cop[tikv] | table:employees                               | keep order:false, stats:pseudo                                                  |
+-------------------------------+---------+-----------+-----------------------------------------------+---------------------------------------------------------------------------------+
3 rows in set (0.00 sec)

mysql> 

image.png

2、分区表的优化与分析

我们可以对表进行索引优化以提高查询效率:确保 sale_date 列上有索引,以便加速范围查询。

2.1 在经常用于搜索的列上添加索引
mysql> CREATE INDEX idx_sale_date ON sales(sale_date);
Query OK, 0 rows affected (0.11 sec)

mysql> 

image.png

2.2 分析查询性能

TiDB 支持分区裁剪(Partition Pruning),在查询时会自动跳过无关分区,提升查询效率。例如:

mysql> EXPLAIN SELECT * FROM sales WHERE sale_date BETWEEN '2020-01-01' AND '2020-12-31';
+-------------------------+---------+-----------+---------------+----------------------------------------------------------------------------------------------------------------+
| id                      | estRows | task      | access object | operator info                                                                                                  |
+-------------------------+---------+-----------+---------------+----------------------------------------------------------------------------------------------------------------+
| TableReader_7           | 2.00    | root      | partition:p1  | data:Selection_6                                                                                               |
| └─Selection_6           | 2.00    | cop[tikv] |               | ge(testdb.sales.sale_date, 2020-01-01 00:00:00.000000), le(testdb.sales.sale_date, 2020-12-31 00:00:00.000000) |
|   └─TableFullScan_5     | 6.00    | cop[tikv] | table:sales   | keep order:false                                                                                               |
+-------------------------+---------+-----------+---------------+----------------------------------------------------------------------------------------------------------------+
3 rows in set (0.01 sec)

mysql> 
2.3 查看执行计划,确认是否只扫描了相关的分区。

image.png

避免过度分区:分区数量不宜过多,否则可能增加元数据管理的开销。通常建议根据业务需求合理划分分区范围。在 TiDB 中创建分区表时,必须确保分区列与主键或唯一索引的关系符合其约束条件。通过对比未加索引前后的查询性能,可以看到索引显著提升了查询速度。此外,TiDB 提供了分布式事务支持,使得大规模数据处理更加高效可靠。特别是在处理大量数据时,分区表可以有效提升查询性能和管理便利性。

关键点总结

  1. 环境准备:确保 Docker 和 Docker Compose 已正确安装。
  2. 集群部署:使用 Docker Compose 配置和启动 PD、TiKV 和 TiDB 服务。
  3. 数据库操作:创建数据库、表,插入数据,并进行查询。
  4. 性能优化:通过调整 TiDB 的启动参数来优化性能。
  5. 对比测试:通过插入数据和查询来验证 TiDB 的性能。

本文介绍了如何在 CentOS 7 上利用 Docker Compose 快速搭建 TiDB 7.5 集群,并展示了基本的数据库操作如创建数据库、表以及数据插入。特别地,我们演示了如何创建分区表并对其进行优化。通过这些实践,可以更好地理解 TiDB 的功能特性及其应用场景,为后续深入学习和应用打下坚实基础。希望这篇教程能帮助更多开发者顺利部署并使用 TiDB 进行开发,享受其带来的高效和灵活性。同时,通过实际操作中的对比分析,进一步认识到了优化数据库设计的重要性。

—— 仅供参考。如果有更多具体的问题或需要进一步的帮助,请随时告知。

0
0
0
0

版权声明:本文为 TiDB 社区用户原创文章,遵循 CC BY-NC-SA 4.0 版权协议,转载请附上原文出处链接和本声明。

评论
暂无评论