MySQLを扱う方の多くは、複雑な水平スケーリングに苦労しています。Vitessはこれを簡単に解消できる方法です。この最新のデータベースソリューションは、膨大なデータベースインスタンスのエンドツーエンドのデプロイ、スケーリング、管理を担います。ただし、サポート対象はオープンソースのデータベースインスタンスのみです。
MySQLに加えて、MariaDBやPerconaにも対応しています。柔軟なアーキテクチャにより、パブリッククラウド、プライベートクラウド、物理サーバー環境でも同様の使いやすさと効率性を実感できます。
標準設定でVitessは基本的なSQL機能を強化し、NoSQLデータベースの拡張性に対応します。ニーズに合わせた導入を行えば、以下のように多方面をサポートできます。
Vitessは他のMySQL導入ソリューションにはない特徴を備えているため、多くの場面で用いられています。代表的な機能をご紹介します。
VitessはMySQL導入をスムーズで安全に保つことを目指しています。そのため、クエリの書き換えやサニタイズ機能を用いて、開発者がクエリに制限を設けたり、不確定な更新を防いだりできるようにします。
さらに、クエリのブラックリスト機能があり、問題のあるクエリをデータベースから遠ざけます。この機能はルールのカスタマイズによって実現されます。
また、Query Killerという機能も注目に値します。これは、データ取得に通常より時間がかかるクエリを終了させ、導入を守るためのしくみです。最後に、VitessはテーブルACL機能を備えており、テーブルへのアクセス制御を設定できます。
Vitessには、MySQL導入時の運用トラブルを最小限にする機能が多数備わっています。たとえば、接続プーリング機能があります。これは、複数のフロントエンドアプリからのクエリをまとめて1つのMySQL接続に束ねることで、常にクエリが存在し続ける状態を作り、パフォーマンスを高めます。
次に、クエリの重複排除(デデュープ)機能もあり、同じリクエストのクエリを再利用して効率を維持します。
最後に、タイムアウト制御はトランザクションマネージャによって行われ、トランザクション間の衝突を防ぎます。
Vitessはデータベースの動作を監視するための多彩なパフォーマンス分析ツールを備えています。これにより、パフォーマンス上の遅延を素早く検知し、修正可能です。
Vitessはクラスタ管理ツールや使いやすいGUIを提供しており、トポロジ管理に役立ちます。Vitessベースのトポロジはクロスリージョンでも問題なく動作するよう設計されているので、管理の手間が大幅に軽減されます。
Vitessのシャーディング性能は高く、管理も容易です。動的に動作するリシャーディング機能が組み込まれ、水平および垂直の両シャーディングを自然にサポートします。
また、Vitessには多様なシャーディング方式が用意されており、簡単に統合できます。
すでに述べたように、Vitessはクラスタ管理ツールとして利用されます。シンプルかつ効率的な動作を実現しているのは、その洗練されたアーキテクチャによるものです。
Vitessの主要構成要素としては、VTTabletとVTGateが挙げられます。まずはこの2つを説明します。
VTGateは、状態を持たないノード群の集合で、フロントエンドの役割を担います。ユーザーが発行するクエリはまずVTGateホストを通過し、内容を精査されます。
VTGateはクエリを詳細にチェックして、どのシャードが対象かを判断し、該当するシャードにのみ転送します。各シャードには複数のタブレットが存在し、そのうち1つがリーダーです。
タブレットはVTTabletとMySQLの2つのコンポーネントで構成され、同一ホスト上で稼働します。
VTTabletは、ローカルのMySQLを監視し、正常に動作するよう支援する役割があります。問題のあるクエリを遮断したり、制限をかけたり、定期的なヘルスチェックを行ったりします。VTTabletは常にMySQLとペアで存在します。
メタデータはVitessアーキテクチャの一部で、キー空間のシャーディング方法やシャードのリーダー、シャード内のタブレットなどを定義します。
これらの情報はすべてトポロジサービスに蓄積されます。基本的にトポロジサービスは、小規模メタデータを絶えず保存できるストアである必要があります。
Vitessではプラグイン方式を採用しているため、ConsulやZookeeper、etcdと完全に連携可能です。また、ウォッチ機能をサポートするメタデータストアを利用して、トポロジサービスを実装できます。トポロジサービス実装時には、VTGateが情報の読み込み・書き込みを支援します。
ただし、トポロジサービスをVitessアーキテクチャに導入する際は、クエリのホットパスに含めないようにしてください。メタデータが変化するたびに更新が発生し、多くの場合はノード起動時に参照されます。
クエリのたびにトポロジサービスへアクセスすることはできません。シャードのルーティングが必要な場合は、VTGate側でクエリをキャッシュするようになっています。
なお、トポロジサービスは大きく2種類あります。1つはどのセルにも属さないグローバルトポロジサービスで、変化の少ないデータを格納します。
もう1つはローカルトポロジサービスで、特定のセルに紐づき、グローバルトポロジサービスの情報に加え、そのセル専用の情報が含まれます。
たとえば、そのセル内タブレットのホストアドレスはローカルトポロジサービスに保存されます。グローバルトポロジサービスがアップデートされると、ローカルにも同期されます。
Vitessアーキテクチャの次の要素がセルです。通常は複数のセルがあり、セルとはホストの集合体を指します。参加ホストは独立した障害境界を持ち、障害発生時の影響を限定します。特にVitessをリージョンをまたいで運用する場合、セルが必要になります。
最後に、この2つのコンポーネントについて説明します。
vtctldclientとvtctldサーバーはHTTPベースのクライアントとサーバーで、トポロジサービスを閲覧し把握しやすくします。vtctldclientはvtctldサーバーに対する呼び出しを行う役割を持ち、ユーザーがクラスタに変更を加える際の操作性を左右します。
たとえば、vtctldclientでリペアレント操作を発火したり、タブレットのメタデータを読み取ったり、シャードのリーダーノードを探したり、リシャーディングのワークフローを実行したりできます。
MySQLの実装方法として有名なバニラMySQLは、Vitessとよく比較されます。以下に簡単な比較を示します。
Vitess vs. バニラMySQL
Vanilla MySQL | Vitess |
---|---|
この方式では、MySQL接続のオーバーヘッドは通常256KBから3MB程度に及び、MySQLのリリース種類によって差があります。 | Vitessでは接続のオーバーヘッドが非常に少なく済みます。Goの並行性を利用した接続プーリング機能があるためです。 |
接続数が増えるほどCPUオーバーヘッドが大きくなります。 | Vitessでは追加のオーバーヘッドはほぼありません。多数の接続を容易にさばきます。 |
クエリが制限なく書かれ、品質が低いケースが多いです。 | SQLパーサーを利用するためクエリが正しく書かれ、クエリ制限も設定されます。 |
ネイティブのシャーディングサポートはありません。 | Vitessは垂直・水平両方のシャーディングをネイティブでサポートします。 |
データベースライフサイクル管理が難しく、システム状態を把握するための継続的な情報収集が必要です。 | 自動的にフェイルオーバーやバックアップなどを処理するため、ライフサイクル管理が容易です。 |
MySQL導入の従来手法としてNoSQLを利用することもありますが、VitessはNoSQLが解消していない欠点を補うモダンな選択肢です。
Vitess vs NoSQL
NoSQL | Vitess |
---|---|
利用中のデータテーブル間に明確なリレーションがなく、SQL言語のごく一部だけをサポートします。 | 単なるキー・バリューストアにとどまらず、句や集計関数、JOINなどのクエリ構文をサポートします。 |
利用されるデータストアはトランザクションをサポートしないことが多いです。 | トランザクションサポートが充実しています。 |
独自のAPI群が豊富で、用途に合わせたアプリやツール、アーキテクチャを自由に構築可能です。 | 独自APIや大きなバリエーションは少ないですが、既存のデータベースとして十分な互換性があります。 |
データベースサポートが限定的です。 | クエリのパフォーマンスを最適化するために、豊富なインデックス機能を備えています。 |
MySQL導入に関しては、Vitessは検討に値するオプションです。正しく使えば非常に強力で、もともとはハイパースケール企業が利用していたものの、いまでは幅広く活用され、高い評価を得ています。
パフォーマンスや安全性、拡張性を向上させる機能が多数含まれており、従来のNoSQLなどに比べてもより優れた結果を期待できます。興味があれば導入してみて、そのメリットを実感してみてください。
最新情報を購読