839の日記

趣味の話を書くブログです。

NewSQLのTiDBをローカルに立ててみる

34. NewSQLとは w/ tzkb | fukabori.fm を聞いてNewSQLをローカルで試してみたいなと思って調べてみた。

紹介されてたのはSpanner以外で3つほどあったけど、よく触る機会があるMySQLに互換があるTiDBを選択。 最初に Quick Start Guide for the TiDB Database Platform | PingCAP Docs を見ながら構築しようとしていたけど、ちょっと試してすぐ消したいのでローカルに色々入れるのは避けたかった。 ローカルのk8sにデプロイして確認し終わったらクラスタリセットするような感じで試せないかと調べてみているとhelm chartが提供されていることを発見。

Deploy TiDB in the Minikube Cluster | PingCAP Docs のあたり*1を見ると、ドキュメントに記載されているのはkind/GKE/minikubeで、手元で試したかったけどkindやminikubeを入れるのが面倒だったのでdocker-desktopクラスタにデプロイを行ってみた。 一部ドキュメントが古そうな雰囲気*2のところだけ手元で微修正しつつデプロイ、実行したコマンドは非常にシンプル。 ちなみにhelmのバージョンはv3.2.4を使った。

kubectl create ns tidb-admin
helm repo add pingcap https://charts.pingcap.org/
kubectl apply -f https://raw.githubusercontent.com/pingcap/tidb-operator/master/manifests/crd.yaml
helm upgrade tidb-operator pingcap/tidb-operator -i --wait -n tidb-admin
helm upgrade tidb-cluster pingcap/tidb-cluster -i --wait -n tidb-admin \
  --set schedulerName=tidb-scheduler,pd.storageClassName=hostpath,tikv.storageClassName=hostpath,pd.replicas=1,tikv.replicas=1,tidb.replicas=1,monitor.create=true,monitor.grafana.create=true

ただ最後にtidb-clusterをデプロイしたときにエラーが出た。

Error: UPGRADE FAILED: template: tidb-cluster/templates/monitor-secret.yaml:1:7: executing "tidb-cluster/templates/monitor-secret.yaml" at <(.Values.monitor.create) and (.Values.monitor.grafana.create)>: can't give argument to non-function .Values.monitor.create

https://github.com/pingcap/tidb-operator のchartファイルを見るとmonitor-secret.yamlでifの書き方が誤っているような気がしたので*3、手元にcloneしてそこを修正。 修正したchartで試すとデプロイができるようになった。 現在はこの問題は修正されているはず。 (2020/7/7追記)

ドキュメントとの差異は

  • tidb-operator chartをデプロイするとtidb-schedulerが入っていたのでschedulerNameを指定
  • docker-desktopを使っているのでstorageClassNameをhostpathに変更

schedulerNameはドキュメントに記載されている通り、default-schedulerにしておいても特に問題はなかった。

デプロイ後に手元で軽く遊んでみた。

# http://localhost:2379/dashboard でDashboardが見れる
kubectl port-forward svc/tidb-cluster-pd 2379
# http://localhost:3000 でGrafanaが見える
kubectl port-forward svc/tidb-cluster-grafana 3000
# mysql -h 127.0.0.1 -P 4000 -u root -D test でTiDBに繋げる
kubectl port-forward -n tidb-admin svc/tidb-cluster-tidb 4000

デプロイ時にmonitorを有効化しているとPrometheus/Grafanaがデプロイされていて、最初からいい感じのダッシュボードを提供してくれている。 それとは別にTiDBが独自に作ったダッシュボードがあった。 MySQL Clientで繋ぐのも何もトラブルがなく普通にSQLが叩けた。

f:id:husq:20200705165024p:plain
Dashboardめっちゃ充実してる

少しchartに修正を入れたとはいえ、大きなプロダクトが環境汚染もなくローカルですっと動くのは感動する。 もともとオンプレのデータセンターを運用している会社とかでWriteがスケールするDBが欲しくなったケースなどにはすごい有効そうなプロダクトだなと感じた。 あとはOSSなので何か問題にあたったときにissueを見て周りに同じ現象の人がいるかすぐ確認できたり、実装を見てPRを投げたりできるのも良さそう。

EKSやGKEでproductionとして使う場合のterraformファイルなども提供されており、Cloudで使い始めるのもかなり楽そうな印象があった。 実際運用を始めるとバージョンアップや高負荷時のよくわからない挙動に悩まされるといったことはきっとあるんだろうけど、すごいクオリティが高いなと感じた。 利用者が増えてくるとバグは叩かれていくので本当にマネージドサービスを使う感覚でTiDBを選択肢に入れられる未来もあるのかもしれない。

この手の巨大プロジェクトは手元にいろいろな依存物を入れながら環境を作り、遊び終わっても手元の依存物が残り続けるみたいなことがありがちだけど、 k8sとhelmがあればサクッと試せてサクッとResetできるような世界観なのも体感がすごい良かった。

*1:This is for testing only. DO NOT USE in production!と書かれているのであくまで軽く試してみる場合の手順

*2:なんとなくhelm2前提感がある

*3:issue立ててPR出してマージされた