TiDBをビルドする

## はじめに

TiDBはオープンソースなのでソースコードが公開されています。ソースコードが公開されていたらそれをビルドしたくなるのは人情というもの・・・

本記事ではTiDBのビルド方法について説明します。

## TiDB開発ガイド

TiDBには開発ガイドがあり、ここにビルドやデバッグ、コントリビュートのやり方が記載されています。

https://pingcap.github.io/tidb-dev-guide/

ビルドだけではなく、TiDBの内部のアーキテクチャや構造についても解説してあるのでぜひごらんください。

## ビルド

まずはgithubリポジトリをcloneしましょう。ビルドするブランチは好きなものでいいですが、今回はリリースしたばかりのv8.5を選択しました。

https://github.com/pingcap/tidb

```bash
git clone https://github.com/pingcap/tidb.git
git fetch
git branch release-8.5
```

次にビルドですが、開発ガイドに沿ってgoをインストールして、必要なツールを入れて、、、でももちろんかまいませんが、リポジトリには親切にもビルド用のDockerfileがあります。これを使ってみます。

### Dockerによるビルド

Dockerfileを確認します。

```dockerfile
# Copyright 2022 PingCAP, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# The current dockerfile is only used for development purposes. If used in a 
# production environment, please refer to https://github.com/PingCAP-QE/artifacts/blob/main/dockerfiles/cd/builders/tidb/Dockerfile.

# Builder image
FROM golang:1.23 as builder
WORKDIR /tidb

COPY . .

ARG GOPROXY
ENV GOPROXY ${GOPROXY}

RUN make server


FROM rockylinux:9-minimal

COPY --from=builder /tidb/bin/tidb-server /tidb-server

WORKDIR /
EXPOSE 4000
ENTRYPOINT ["/tidb-server"]

```

2ステージビルドになっており、tidbのビルドと、それを使って `tidb-server` コマンドを実行するイメージを作成します。ビルドが終わると `bin/tidb-server` ができて、これがtidbのバイナリになります。

では、ビルドしてみましょう。`tidb-custom` というイメージ名をつけています。

```bash
docker build ./ -t tidb-custom
```
ビルドは数分かかります。

## 実行

### Dockerによる実行

ビルドが終わったら、実行してみます。実はtidbサーバ単独でも動かすことができます。
標準のTiDBと区別がつきやすいように、port 4001で動かします。

```bash
docker run -it -p 4001:4000 tidb-custom
```

接続してバージョンを見てみます。
```bash
> mysql -u root -h 127.0.0.1 -P 4001
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2097154
Server version: 8.0.11-TiDB-v8.5.0-3-g71bc6250ec-dirty TiDB Server (Apache License 2.0) Community Edition, MySQL 8.0 compatible

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

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> select version();
+----------------------------------------+
| version()                              |
+----------------------------------------+
| 8.0.11-TiDB-v8.5.0-3-g71bc6250ec-dirty |
+----------------------------------------+
1 row in set (0.01 sec)
```

良さそうですね。

### TiDB Playgroundでの利用

Dockerでの実行でtidbサーバ単独の動作は確認できますが、これではtidbクラスタとしての検証ができません。
tiupから起動するTiDB Playgroundでは、それぞれのコンポーネントのバイナリを指定することができます。tidbサーバのバイナリを指定して実行してみましょう。

:::note warn
tiup playgroundで指定できるバイナリはローカル環境でビルドしたものです。先程のDockerfileでビルドしたものはlinux用なのでMacでは利用できないことに注意してください。
:::

```bash
tiup playground v8.5.0 --db.binpath bin/tidb-server

Start pd instance: v8.5.0
Start tikv instance: v8.5.0
Start tidb instance: /Users/.../tidb/bin/tidb-server
Waiting for tidb instances ready
127.0.0.1:4000 ... Done
Start tiflash instance: v8.5.0
Waiting for tiflash instances ready
127.0.0.1:3930 ... Done

🎉 TiDB Playground Cluster is started, enjoy!

Connect TiDB:    mysql --host 127.0.0.1 --port 4000 -u root
TiDB Dashboard:  http://127.0.0.1:2379/dashboard
Grafana:         http://127.0.0.1:3000
```

通常のPlayground同様、ログなども `~/.tiup/data` 以下に保存されますし、デバッガやプロファイラのアタッチなどもできる（はず）です。

これでビルドから実行までの一連の流れができたので、あとはログを仕込むなりSQLを拡張するなりやりたい放題です！！

## おわりに

TiDBはDockerファイルを使って簡単にビルドができるようになっています。ビルドしたTiDBはTiUP Playgroundなどでも利用できるので、独自ビルドを作って色々遊んでみてください！