こんにちは、インフラエンジニアの nobuh です
分散DBという夢
クラウドのデータベース界隈では昨年くらいから MySQL 互換のクラウドでのデータベース、Amazon Aurora や Google 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 でビルドすることにします。
[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 が大好きなエンジニアを募集しています! ご興味のある方は採用情報ページをぜひご覧ください。お待ちしています!