mysqlプロトコル対応のwriteスケールアウトのDBについて書いてみる。
最初に言っておく、全部触ったことがない!
(MySQL NDB Cluster)
https://dev.mysql.com/doc/refman/8.0/ja/mysql-cluster.html
ライセンスは、GPLと商用の2種類あるよう。商用はサポートあり。
アーキテクチャは、管理ノード・SQLノード・データノードに分かれるもので、いわゆるshared nothing型。
トランザクション分離レベルは、READ COMMITTEDのみサポート。
(MariaDB Xpand)
https://mariadb.com/ja/products/enterprise/xpand/
ライセンスは商用のみ。
各ノードが管理・SQL・データを兼任し、いわゆるshared nothing型。
トランザクション分離レベルは、REPEATABLE READとREAD COMMIETTEDをサポート(一応SERIALIZEDもOKみたい)。
(TiDB)
https://pingcap.co.jp/tidb-overview/
ライセンスはApache2.0。
アーキテクチャは、管理ノード・SQLノード・データノードに分かれるもので、いわゆるshared nothing型。
v3.0からMySQLに近い「PESSIMISTIC TRANSACTION」をサポートし、v4以降は、READ COMMITTEDのみサポート。
(Vitess)
ライセンスはApache2.0。
kubernatesでの動作が前提(一応、他でも動くみたい)。
データノードは、通常のmysqlなので、InnoDBが利用可能。
多分、トランザクション分離レベルは、READ COMMITTEDをサポート。(よくわからん)
分散DBは、正直使ってみて、
挙動を確かめてみないとわからない。。
よくあるのが、
- SQLの構文がサポートされていなかった
- データタイプがサポートされていなかった
- トランザクションがCOMMIT勝負だった
- ロックの挙動がmysqlと違う
- JOINが結構遅い
- 集約の結果がちょっとずれてる
などがあるのかな〜。
その他には、
- 障害時の復旧手順(復旧順番間違えるとロスト)
- バックアップ時の負荷
など、開発だけでなく、運用時のシュミレーションと検証を結構しておく必要があるかなと。
最近は、DaaS(Database as service)も結構あるので、運用は任せてしまうのも一手かもしれないが。
いずれにせよ、「銀の弾丸」はないわけで、
インフラのエンジニアも、アプリケーションのエンジニアも、
よく検証して、できること・できないこと、どうやったらまずいのかなど、
を整理しておく必要があるのかなと。
以上
コメントがあればどうぞ