インフィニットループ 技術ブログ

2016年05月30日 (月)

著者 : nob

MySQL は分散DBの夢を見るか、Google F1 論文を実装した TiDB を使ってみた

TiDB
こんにちは、インフラエンジニアの nobuh です

分散DBという夢

クラウドのデータベース界隈では昨年くらいから MySQL 互換のクラウドでのデータベース、Amazon AuroraGoogle Cloud SQL がホットな話題だと思います。

それはデータベースの黎明期から研究の場では分散データベースというのが大きな研究分野になっていて、RDBMS でありながらもスケールアウトが可能で耐障害性もあり、そして実用的な速度で稼働できるデータベースというのがデータベースエンジニアの約束の地、最後の楽園となっているからです。またその分散データベースが MySQL 互換で WordPress も動けばもう最高です。 Google Cloud SQL の元となっているらしい Google の F1 論文 F1: A Distributed SQL Database That Scales が発表されてから、そんな夢を抱いたインフラエンジニアの方も多かったのではないでしょうか。
そこで探すとーありました!!オープンソースの Google F1 が。TiDB というオープンソースの Go 製のデータベースです。まだアルファ版のようですが早速試してみましょう!

Go をインストール

まずはサーバーですが、CentOS 7.2 の最小構成の仮想サーバーを用意しました。ユーザーとして tidb というユーザーを用意しましたが、これは別にどのユーザーでも構いません。時々 root での操作が必要になりますので、sudo には入れておきましょう。あと、なにはなくとも git は必要ですので入れておいてください。 wget なども必要に応じて。
さて、最初に Go 1.5 以上が必要となっていますので Go から入れます。既存の yum を調べます。

[tidb@TiDB ~]$ sudo yum list golang
  : : :
golang.x86_64        1.4.2-9.el7        base

1.4.2 なので残念でした。 Go の公式ページから最新リリースのバイナリ tar パッケージをとってきます。

[tidb@TiDB ~]$ wget https://storage.googleapis.com/golang/go1.6.2.linux-amd64.tar.gz

この仮想サーバーは TiDB 専用に用意したものですから go はシステムワイドに /usr/local に入れます。
環境変数の $PATH を設定する必要があるので、これも /etc/profile.d/golang.sh を作成してそこで PATH に追加します。シェルを再度読み込んでバージョンも確認。1.6.2 になりました。

[tidb@TiDB ~]$ sudo tar -C /usr/local -xzf go1.6.2.linux-amd64.tar.gz
[tidb@TiDB ~]$ echo 'export PATH=$PATH:/usr/local/go/bin' | sudo tee /etc/profile.d/golang.sh
export PATH=$PATH:/usr/local/go/bin
[tidb@TiDB ~]$ exec $SHELL -l
[tidb@TiDB ~]$ go version
go version go1.6.2 linux/amd64

go の install 機能を使うにはプロジェクトのディレクトリを作成してそこに $GOPATH を設定する必要があるようです。$HOME/work を作成してそこに設定します。

[tidb@TiDB ~]$ mkdir work
[tidb@TiDB ~]$ echo "export GOPATH=$HOME/work" >> .bashrc
[tidb@TiDB ~]$ exec $SHELL -l
[tidb@TiDB ~]$ echo $GOPATH
/home/tidb/work

hello.go というソースを作成して src/hello に置きます。

[tidb@TiDB ~]$ cat <<HERE > work/src/hello/hello.go
> package main
> import "fmt"
> func main() {
>   fmt.Printf("hello,world\n")
> }
> HERE

go install で自分で作った hello パッケージをインストールすると $HOME/work/bin/hello にプログラムが作成されます。実行して hello world が出てればOKです。

[tidb@TiDB ~]$ go install hello
[tidb@TiDB ~]$ work/bin/hello
hello,world

TiDBをインストール

まずは git clone して make します

[tidb@TiDB ~]$ git clone https://github.com/pingcap/tidb.git $GOPATH/src/github.com/pingcap/tidb
Cloning into '/home/tidb/work/src/github.com/pingcap/tidb'...
remote: Counting objects: 22090, done.
remote: Compressing objects: 100% (50/50), done.
remote: Total 22090 (delta 21), reused 2 (delta 2), pack-reused 22038
Receiving objects: 100% (22090/22090), 12.28 MiB | 1.45 MiB/s, done.
Resolving deltas: 100% (14443/14443), done.
[tidb@TiDB ~]$ cd $GOPATH/src/github.com/pingcap/tidb
[tidb@TiDB tidb]$ make
go get github.com/qiuyesuifeng/goyacc
go get github.com/qiuyesuifeng/golex
  以下省略
golint
gofmt (simplify)

TiDB はトランザクション機能を持った独自の分散キーバーリューストアの TiKV や、Hadoop 等その他のさまざまなデータストアの上に MySQL として動作するレイヤーを重ねた構造になっています。いろいろな構成やキャラクターで動かすことができそうですが、とりあえず普通に MySQL サーバーとして起動する設定で make server でビルドすることにします。
architecture

[tidb@TiDB tidb]$ make server
rm -rf vendor && ln -s _vendor/vendor vendor
rm -rf vendor

以上でビルドは終了です。

TiDB行きまーす!!

tidv-server を実行するとサーバーが立ちあがります。デフォルトではバックエンドのキーバリューストレージとしては goleveldb を使います。

[tidb@TiDB tidb]$ cd tidb-server
[tidb@TiDB tidb-server]$ ./tidb-server
Welcome to the TiDB.
Version:
Git Commit Hash: 228f1d70261edea0b387c32cfd19aaf1ce77cee4
UTC Build Time:  2016-05-20 03:31:03
2016/05/20 12:34:33 kv.go:290: [info] [kv] New store /tmp/tidb
2016/05/20 12:34:33 txn.go:48: [debug] [kv] Begin txn:383704176638296064
2016/05/20 12:34:33 txn.go:54: [debug] [kv] get key:6d 53 63 68 65 6d 61 56 65 ff 72 73 69 6f
省略
2016/05/20 12:34:33 txn.go:113: [debug] [kv] commit txn 383704176736600064
2016/05/20 12:34:33 server.go:129: [info] Server run MySql Protocol Listen at [:4000]

MySQLサーバーが起動したので、さっそく mysql クライアントでアクセスしてみましょう。
TiDB はそのままフォアグランドで動かしておいて、別ターミナルを開きます。 CentOS 7 のリポジトリには mariadb のクライアントが入っていますのでインストールします。

[tidb@TiDB ~]$ sudo yum install mariadb

TiDB のデフォルトユーザーは root でパスなしになっています。開発中のアルファ版 とうことで見逃してください!
IPアドレス 127.0.0.1 ポート 4000 にアクセスしてみましょう。

[tidb@TiDB ~]$ mysql -h 127.0.0.1 -P 4000 -uroot
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 10001
Server version: 5.5.31-TiDB-1.0 MySQL Community Server (GPL)
Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

ごくふつうにつながりました! サーバーバージョンは 5.5.31-TiDB になっていますので、5.5 互換のようです。
現状でも WordPress が動くそうなので、たしかに普通の MySQL でした。ためしに InnoDB のフォーマットを調べてみます

MySQL [(none)]> show global variables like 'innodb_file_format%';
+--------------------------+----------+
| Variable_name            | Value    |
+--------------------------+----------+
| innodb_file_format       | Antelope |
| innodb_file_format_max   | Antelope |
| innodb_file_format_check | ON       |
+--------------------------+----------+
3 rows in set (0.75 sec)

古い方の Antelopeでした。グローバル変数は同じものがあるようですが SHOW STATUS コマンドの結果は少ないようです。さすがに別DBということを感じます。

MySQL [(none)]> show status;
+---------------------------+--------------------------------------+
| Variable_name             | Value                                |
+---------------------------+--------------------------------------+
| bg_owner_id               | 844e98c9-56b4-4ff4-9157-26969996a3d1 |
| bg_owner_last_update_ts   | 1463716052                           |
| server_id                 | 844e98c9-56b4-4ff4-9157-26969996a3d1 |
| ddl_schema_version        | 8                                    |
| ddl_owner_id              | 844e98c9-56b4-4ff4-9157-26969996a3d1 |
| ddl_owner_last_update_ts  | 1463716052                           |
| ddl_last_reload_schema_ts | 1463715382                           |
| bg_schema_version         | 8                                    |
+---------------------------+--------------------------------------+
8 rows in set (0.00 sec)

MySQL 互換の分散DBを手作りしているようでドキドキしますね! まだ github 上に公開されてから1年経っていませんが、TiDB はこれからも目が離せないプロジェクトになりそうです。 今後も TiDB でいろいろ遊んでみたいと思います。
弊社では MySQL が大好きなエンジニアを募集しています! ご興味のある方は採用情報ページをぜひご覧ください。お待ちしています!

ブログ記事検索

このブログについて

このブログは、札幌市・仙台市の「株式会社インフィニットループ」が運営する技術ブログです。 お仕事で使えるITネタを社員たちが発信します!