概要
この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はざっくりいうとRDBのSQLインターフェースとトランザクションを残しつつ分散システム化されたデータベースシステム。SQLやトランザクションサポートに加えてスケーラビリティが求められる場面使われる。Google Cloud Spannerが最も有名で他のNewSQLはSpannerのアーキテクチャを参考にしている。
話をCockroachDB vs. TiDB に戻すと、主に以下の点に注目することにした。
- CockroachDB
- TiDB
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
最初は 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開発、楽しいしかなり学びが多いので続けていきたい。