スマートスタイル TECH BLOG

MySQL + Kubernates = Vitess ? Vitessをインストールしてみよう!

MySQL + Kubernates = Vitess ? Vitess(ヴィテス)をインストールしてみよう!

Vitess(ヴィテス)とは

MySQLインスタンスの大規模クラスタをデプロイ、拡張、管理するためのデータベースソリューションです。

本ソリューションはもともとYouTubeのバックエンドであるMySQLクラスタで利用されていましたが、GoogleがOSSとして公開し誰でも利用可能となりました。

2018年のMySQL Awardで表彰されたりCloud Native Computing Foundation (CNCF)のインキュベーションプロジェクトとなったりと 今後が非常に注目されるソリューションです。

Vitessの主な機能は以下のとおりです。

  • コネクションプール
  • ACL
  • パフォーマンス監視
  • MySQLトポロジ管理インタフェースの提供
  • 水平分割/垂直分割

今回は、チュートリアルをもとに可能な限りVitessを解明していきたいと思います。

ドキュメント

Vitess Doc
Github

はじめに

Vitessのアーキテクチャは上記のようになっています。
vtgateやvttablet等多くのソフトウェアが連携して機能を実現していることが確認できます。

これらは検証目的として一般的なOS上でも起動する手順も提供されていますがプロダクション環境ではコンテナとオーケストレーションツール下での可動が推奨されています。
代表的なものとしてDockerとKubernatesが挙げられます。

各機能の詳細は本資料のtopologyをご確認ください。

検証環境

今回は、CentOS 7.5上のminikubeで検証を行いました。
お試し頂く際にはminikubeをご準備ください。

インストール

Tutorialsに従ってインストールを行います。

まずはVitessをDownloadします。

VitessはKubernates(minikube)上で利用する場合にはメタデータリポジトリとしてetcdを使用します。
そのため、先にetcdのPodを起動しておく必要があります。
公式の手順に従いetcdをインストールしましょう。

次にHelmをインストールする必要があります。
HelmはGolangのソフトウェアですので、単一のバイナリで動作します。
以下のページからHelmを入手し、PATHの通った場所に配置ください。

https://github.com/helm/helm/releases

次にhelm initでHelmの利用準備を行います

これでminikube側の準備は完了です。

VitessにアクセスするためのClientツールをインストールします。
まずはGolang 1.11以上がインストールされている事をご確認ください。

次にvtctlclientをインストールします。vtctlclientはVitessの管理用コマンドラインツールです。

最後にMySQL Clientをインストールします。

以上で前準備は完了です。

Helm Chartのインストール(Vitessの構築)

クローンしたVitessのディレクトリにはチュートリアルのためのexamplesディレクトリが含まれており、この配下のyamlをapplyしていくことで、各操作を行います。

また、[clone dir]/helmにHelm Chartが含まれています。

HelmはKubernatesにおけるパッケージマネージャに位置づけられており、Helm Chartは各ソフトウェアを構築するための一連のyamlファイル等の集合です。
早速Helm Chartを使い、Vitessをデプロイします。

kubectlで作成されたpodとjobを確認すると、以下の通り作成されています。

101_initial_cluster.yamlの各設定値は[clone dir]/helm/vitess/values.yamlに定義されています。
内容にはetcd, backup, vtgateなどのパラメータ定義があり、vttabletのセクションには様々な定義があります。

例えばvttabletのDatabaseに使用するImageを定義したり

データボリュームのサイズを決定したり

Percona Monitoring and Managementや、Orchestratorを同時に起動するためのセクションがあったりします。

今回は有効化しませんでしたが、ご興味があればお試しください。

接続

examplesディレクトリ配下のkmysql.shを使用して接続ができます。
実際の接続はvtgateに対して行われ、いずれかのvttabletにルーティングされます。
kmysql.shの内容を見てみましょう。

minikubeを使い、vtgate-zone1のIPとPortを取得、あとは通常通りmysqlに接続しています。
コマンドの結果は以下となりました。

172.26.10.75はminikubeホストのインターナルIPです。
特に問題なく接続ができました。

なお、32077はkube-proxyによって外部に公開されています。

外部のデスクトップからも接続することができました。

vtgate-zone1のPodの情報を見てみると以下のようになっています。

minikubeの内部ネットワークで割り当てられたIPは10.105.88.160です。

zone1とはなんでしょうか。

zone1は <clone dir>/helm/vitess/values.yaml のtopologyのセクションで定義されているCellの1つです。

TopologyはVitessのメタデータの定義です。
CellはVitessを構成する一連のPodをまとめる論理的な単位であり、個々のデータセンターを表現できます。

チュートリアルの設定ではtopology内のセルははzone1しかありませんでしたので、1つのみです。

vtgatewayへのトラフィックは、適切なvttablet(つまりその裏のMySQL)へルーティングされます。

本当にルーティングがされるのか確認するために、チュートリアルを先に進めましょう。

スキーマの確認/vttabletの追加/垂直分割

接続が行えましたので、初期ロードされているデータを見てみます。

VitessではMySQLでいうdatabaseをkeyspaceと言い、水平分割・垂直分割はこのkeyspaceの単位で行われます。

keyspaceはshow databasesで確認できます

テーブルを確認するコマンドもMySQLと同じです

corderテーブルを確認しても、普遍的なInnoDBのテーブルに見えます。

MySQL(Percona Server)のImageを使用しているので当然でしょう。
MySQL自体は特にカスタマイズされたものではなく、シャーディングやルーティングはvtgatewayやvttabletの役目です。

用意されているテストデータの挿入し、データを確認します。

結果に Using commerce/0 という文字列が確認できます。
select_commerce_data.sqlでは、use commerce/0 というコマンドでkeyspaceをuseしています。
0はkeyspace idと呼ばれるデータの分割キーです。
keyspaceは分散される事を前提とした仕組みなので、どのシャードをuseするかという指定を行っています。

このようにkeyspace idを選択してデータを確認することは可能ですが、テーブルの各行にkeyspace idは紐付けられているため、アプリケーションはそれを意識しなくても問題ありません。

どのようにテーブルやデータを分散させるかというKeyspace等の定義をVSchemaといい、ユーザがこれを定義・適用する必要があります。

それではVSchemaを更新していきましょう。
ここでは、どのような更新が行われるかは概要の説明にとどまりますが、詳細はTutorialsをご確認ください。

これでcommerce.productとcustomer.corder, customer.customerのようにテーブルが分散されました。

分割後の確認

いくつかの状態を確認していきます。

まず、新しいvttablet が作成されていることが確認できます。

チュートリアルの構成では、replica-0, 1とrdonly(readonly)のMySQLが存在します。
replicaはいずれかがマスタになります。

commerce keyspaceからcorder, customerテーブルは削除されました。

それではやっとルーティングを確認してみましょう。

透過的に適切なkeyspaceにルーティングされている様子が確認できました。
素晴らしい動作です。

まとめ

今回の検証では、Vitessのインストールと接続、垂直分割にルーティング確認まで行うことができました。

しかしながら、Vitessはまだまだ以下のような機能があり、中でも水平分割はVitessを使う動機になり得る機能でしょう。

  • 水平分割
  • コネクションプール
  • ACL
  • レプリケーションにおける自動フェイルオーバ(Orchestrator)
  • 管理用WEB UI(Percona Monitoring and Management/vtctld)
  • and more..

今回は初回のインストール編ということでした。
ぜひこの先進的なソリューションを実際にお試しください。

Let’s Enjoy Vitess!


MySQL
Return Top