📑

TiDBローカル環境構築③

に公開

TiDBのローカル環境の構築を3回目行なっていきます。
前回DB環境の構築が出来たましたが、今回はDockerでTiDBのDB構築を行っていきます。

コンテナ環境のツリー構成

DB構築時のツリー構造は以下のようにしてます。

.
├── docker-compose.yml
└── src
    └── infra
      └── db
          ├── Dockerfile
          ├── data
          │   └── test_db.sql
          ├── docker-compose.yml
          └── entrypoint.sh

ソースコードを作成

各ファイルのコードを記載していきます。
前回のymlと変更点はあまりないです。
"3000:3000"は、今後フロント側作成の際に Portの競合が発生するのと今すぐ必要ではないので削除しました。

docker-compose.yml
services:
  tiup-playground:
    extends:
      file: ./src/infra/db/docker-compose.yml
      service: tiup-playground

networks:
  tidb-net:
    name: tidb-net
    driver: bridge



TiDBのコンテナ用のDockerファイルになります。
主にやっていることとすれば、以下の順番で処理を行ってます。

  1. Linuxの必要パッケージのインストール
  2. tiupというTiDB用の公式ツールチェインマネージャーをインストールし、TiDBの環境に必要なツールのインストールを行う。tidb、tikv、pd、tiflashの説明は以下の表で行ってます。
  3. entrypoint.shのコピー
  4. TiDBの環境変数の設定
  5. コンテナ外部通信の定義
  6. entrypoint.shの実行
コンポーネント 役割 説明
TiDB SQLレイヤー MySQL互換のSQLエンジン。アプリやMySQLクライアントからのクエリを受け取り、TiKVやTiFlashへ処理を振り分ける。
TiKV 分散KVストレージ データを分散して保存するキー・バリューストア。トランザクションや高可用性を提供する。
PD (Placement Driver) メタデータ管理 & スケジューリング TiKVクラスタ全体のメタ情報(どのデータがどのノードにあるか)を管理し、データ配置や負荷分散を制御する。
TiFlash 列指向ストレージ 分析処理向けのカラム型ストレージエンジン。TiKVと同期しつつ、OLAPクエリの性能を向上させる。
./src/infra/db/Dockerfile
FROM ubuntu:22.04

ENV DEBIAN_FRONTEND=noninteractive \
    TZ=Asia/Tokyo

RUN apt-get update && apt-get install -y --no-install-recommends \
    curl gnupg2 ca-certificates lsb-release bash sudo ssh \
    mariadb-client tzdata \
 && rm -rf /var/lib/apt/lists/*

RUN curl --proto '=https' --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh && \
    export PATH=/root/.tiup/bin:$PATH && \
    tiup update --self && \
    tiup update playground && \
    tiup install tidb:v7.1.1 tikv:v7.1.1 pd:v7.1.1 tiflash:v7.1.1

COPY entrypoint.sh /usr/local/bin/entrypoint.sh
RUN chmod +x /usr/local/bin/entrypoint.sh

ENV TIDB_VERSION=v7.1.1 \
    TIDB_HOST=0.0.0.0 \
    TIDB_TAG=test-cluster \
    DB_HOST=127.0.0.1 \
    DB_PORT=4000 \
    DB_USER=root \
    DB_NAME=test

EXPOSE 4000 2379 3000

ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]



上記の6で実行するentrypoint.shの内容は以下になります。

./src/infra/db/entrypoint.sh
#!/usr/bin/env bash
set -euo pipefail

export PATH="/root/.tiup/bin:${PATH}"

# 1) TiDB playground をバックグラウンド起動
echo "[db] starting tiup playground ${TIDB_VERSION} ..."
tiup playground "${TIDB_VERSION}" --host "${TIDB_HOST}" --tag "${TIDB_TAG}" &
PLAY_PID=$!

# 2) SQLポート待機(mysqladmin ping / ポートが開くまで)
echo "[db] waiting TiDB on ${DB_HOST}:${DB_PORT} ..."
for i in $(seq 1 120); do
  if mysqladmin ping -h"${DB_HOST}" -P"${DB_PORT}" --silent 2>/dev/null; then
    echo "[db] TiDB is up"
    break
  fi
  sleep 2
done

# 3) DB作成(なければ)
echo "[db] ensuring database '${DB_NAME}' exists ..."
mysql -h "${DB_HOST}" -P "${DB_PORT}" -u "${DB_USER}" -e "CREATE DATABASE IF NOT EXISTS \`${DB_NAME}\` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;"

# 4) 初期DDL投入(/docker-entrypoint-initdb.d/*.sql / *.sql.gz を順次流す)
INIT_DIR="/docker-entrypoint-initdb.d"
if [ -d "${INIT_DIR}" ]; then
  shopt -s nullglob
  for f in "${INIT_DIR}"/*.sql "${INIT_DIR}"/*.sql.gz; do
    case "$f" in
      *.sql)
        echo "[db] applying: $f"
        mysql --default-character-set=utf8mb4 -h "${DB_HOST}" -P "${DB_PORT}" -u "${DB_USER}" -D "${DB_NAME}" < "$f"
        ;;
      *.sql.gz)
        echo "[db] applying (gz): $f"
        gunzip -c "$f" | mysql --default-character-set=utf8mb4 -h "${DB_HOST}" -P "${DB_PORT}" -u "${DB_USER}" -D "${DB_NAME}"
        ;;
    esac
  done
fi

echo "[db] init done. following playground ..."
# 5) playground をフォアグラウンド化(終了待ち)
wait "${PLAY_PID}"



entrypoint.shde実行するDDLになります。

./src/infra/db/data/test_db.sql
CREATE DATABASE IF NOT EXISTS test_db;

USE test_db;

CREATE TABLE IF NOT EXISTS my_table (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

INSERT INTO my_table (name) VALUES ('Test Data 1'), ('Test Data 2');



この状態で以下のコマンドを実行します。

docker-compose up -d



そうするとコンテナが立ち上がり、ダッシュボードの確認ができます。
作成したtidb、tikv、pd、tiflashが使われているのが左側の



以下のスクショで確認できました。



以下のURLにアクセスするとダッシュボードが確認できました。
http://127.0.0.1:2379/dashboard



DBが作成されている確認します。
以下のコマンドでちDBコンテナにアクセスします。

docker exec -it tidb-test sh



アクセスしたコンテナ上で以下のコマンドでTiDBにアクセスしログインします。

mysql -h "${DB_HOST}" -P "${DB_PORT}" -u "${DB_USER}"



DBの存在確認します。

show databases;



そうすると以下のように出力されます。

+--------------------+
| Database           |
+--------------------+
| INFORMATION_SCHEMA |
| METRICS_SCHEMA     |
| PERFORMANCE_SCHEMA |
| mysql              |
| test               |
| test_db            |
+--------------------+
6 rows in set (0.001 sec)



カラム名やデータベースの詳細を確認したい場合は、MySQL クライアントと同じ操作方法で確認できます。

詰まった箇所

以下のtiupツールを使ってインストールした際にエラーが起こりました。

tiup install tidb:latest tikv:latest pd:latest tiflash:latest



最新バージョンでインストールが完了する想定でしたが、バージョン指定しないとインストール時にエラーが起こるみたいです。

ちなみに以下のエラーが起こってました。

4.776 Error: version latest on linux/arm64 for component tidb not found: unknown version
------
Dockerfile:11

--------------------

  10 |     

  11 | >>> RUN curl --proto '=https' --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh && \

  12 | >>>     export PATH=/root/.tiup/bin:$PATH && \

  13 | >>>     tiup update --self && \

  14 | >>>     tiup update playground && \

  15 | >>>     tiup install tidb:latest tikv:latest pd:latest tiflash:latest

  16 |     

--------------------

target tiup-playground: failed to solve: process "/bin/sh -c curl --proto '=https' --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh &&     export PATH=/root/.tiup/bin:$PATH &&     tiup update --self &&     tiup update playground &&     tiup install tidb:latest tikv:latest pd:latest tiflash:latest" did not complete successfully: exit code: 1


まとめ

TiDBローカル環境構築の第3回では、docker-compose と tiup を使って TiDB のDB環境をDocker上に構築しました。
tidb・tikv・pd・tiflash の4コンポーネントをインストールし、entrypoint.sh でDB初期化やDDL投入を自動化。
ダッシュボード(http://127.0.0.1:2379/dashboard)から稼働状況を確認し、MySQLクライアントからDB作成とテーブル構造を確認しました。
インストール時には latest 指定でエラーになるため、バージョンを明示的に指定する必要がある 点に注意が必要です。
今回は以上になります。続きは後ほど投稿します。

コラボスタイル Developers

Discussion