yoshikipom Tech Blog

NewSQLを学んでTiDBにコミットした話

概要

この12月はNewSQLの学習とTiDBへのコミットに挑戦してみたのでその記録。

得られたこと

Why?

昨年末くらいからちょくちょくGo言語を使うようになり、GoでのOSS開発をしたかったのでGithubで良さそうなリポジトリを検索してみたところ、NewSQLのCockroachDBとTiDBがヒットした。NewSQLについては PodcastのMisreading ChatでCockroachDBについて話す回で今後来そうと思っていたのでチャレンジすることに。 misreading.chat

NewSQLを学んでCockroachDBかTiDBを選ぶ

CockroachDBとTiDBのどっちがいいか知りたかったので何が同じで何が違うかをまず学んだ。 この記事がとてもわかりやすくておすすめ。 qiita.com

2021年最終更新なので各プロダクトの細かいところは公式推奨。例えばCockroachDBのストレージエンジンはRocksDBではなくGoで書き直したPebbleというものを使っている模様(RocksDBはC++)。

CockroachDB uses the Pebble storage engine. Pebble is inspired by RocksDB 参考

NewSQLはざっくりいうとRDBSQLインターフェースとトランザクションを残しつつ分散システム化されたデータベースシステム。SQLトランザクションサポートに加えてスケーラビリティが求められる場面使われる。Google Cloud Spannerが最も有名で他のNewSQLはSpannerのアーキテクチャを参考にしている。

話をCockroachDB vs. TiDB に戻すと、主に以下の点に注目することにした。

  • CockroachDB
    • インターフェース: Postgres互換
    • ストレージエンジン: Pebble (Go製、RocksDBを参考にしてる)
    • アーキテクチャ: Spannerベースでクエリエンジンとストレージエンジンが1ノードに同居
    • 開発元: Google出身者が立ち上げたCockroach Labs
  • TiDB
    • インターフェース: MySQL互換
    • ストレージエンジン: TiKV (Rust製、内側でRocksDB利用)
    • アーキテクチャ: クエリエンジン(TiDB)とストレージエンジン(TiKV)が別居
    • 開発元: 日本法人もあるPingCAP
    • 日本で採用事例多数

CockroachDBの方は最近の自分の仕事はPostgresだったり、ストレージエンジンもGoで触れるというメリットがあったが、TiDBのアーキテクチャと日本での採用や情報の多さに惹かれて結局TiDBを深掘ってみることにした。

TiDBを学ぶ

日本語リソース

短く全体感がまとまっていてよかったのはこの動画。 www.youtube.com

PingCAP Japanの動画はLSM Tree、MVCC、Raft(合意アルゴリズム)など内部で使われている技術やその採用理由について学べる。 無料オンライントレーニング (PingCAP Education) - YouTube

英語リソース

公式に十分な情報がある。モダンな感じで読みやすい。 docs.pingcap.com

pingcap/tidbへのコントリビュート

方法は基本的にdev guideの以下の章を読んでおけばOK。 pingcap.github.io

TiDBの関連リポジトリはたくさんある(以下に記事にまとまっていた)が、とっつきやすくIssueもたくさんあったので クエリエンジンの pingcap/tidb (以下アーキテクチャ画像の"TiDB"部分)を選択した。 qiita.com

TiDBのアーキテクチャ https://docs.pingcap.com/ja/tidbcloud/tidb-architecture

最初は label:good first issue、その後はlabel:type/bug で対応できそうなものを探した。

現状ドキュメント修正含めてPull Requestを6つ出して5つはマージ済み、1つはPrivateリポジトリで管理しているCIをPingCapの人が直すらしいので待機中。 対応したIssueなど

最初はチームのルールに慣れるように簡単なコードのリファクタリング的なもの、その後にSQLパーサーや実行計画などが関連する部分を見ていった。また、dev guideを読んでいるとリンクが切れていたり古かったりするものがあったのでドキュメントにもコミットしてみた。

コントリビュートした感想

よかったこと

  • dev guideの説明がわかりやすく、SQLのパース、実行計画の作成、実行、トランザクション管理がどのあたりのコードで行われているのかわかる
  • SQL自体は理解している状態だったので動かしながらdebugしやすいので根気よくやれば調査もなんとかできそうだった
  • PingCAPのメンバーが積極的に動いているので割とすぐにレビューやコメントをしてもらえる
  • Prow という CI/CDシステムが活用されていてIssueやPull Requestの管理の自動化がスゴい
  • コントリビュートする気で学ぶことでTiDBの中にある様々なアルゴリズムやツールについて学習したときに頭に入ってきやすかった。

つらかったこと

  • なんだかんだでコードリーディングはかなり時間がかかる。特にデータ構造(AST、実行計画など)がかなり複雑
  • Unit Testの確認 (ローカルで全部回すと1時間以上かかる、Flaky Test が多い)
  • Privateリポジトリで管理されている Integration Testがあり、自ら修正できない
  • Bazelの経験不足

おわりに

OSS開発、楽しいしかなり学びが多いので続けていきたい。