1年ほど前Oracle社がリリースした、MySQL Fabricについて勉強する機会があったので、
まとめてみた。
MySQL Fabricとは、MySQLサーバー群を統合管理するフレームワークのこと。
詳しくはこちら。
端的に言えば、MySQLの死活監視(自動failover含む)とデータシャーディング(テーブルのデータを分割して複数のDBサーバで持つ)ができる。
MySQLに限らず、書き込みの負荷分散にはDBのクラスター化が一般的だが、
近頃耳にするようになったシャーディングによって負荷分散ができるようになったのがこのMySQL Fabric。
書き込み負荷分散、ということでいけば、斯波さんのspiderストレージエンジンでも実装しているが、
spiderとMySQL Fabricはそもそも対象としているスコープが違うのでここでの比較は控えておく。
MySQL Fabricのアーキテクチャは以下。
大きく分けて管理対象のサーバー群と管理サーバがあり、
管理対象のサーバー群はさらに「高可用性グループ」とか「farm」とか呼ばれるグループに分かれる。
高可用性グループの中に1つだけglobal groupと呼ばれる特殊なグループがあり、
それ以外の高可用性グループはすべて横並びの位置づけになる。
MySQL Fabric管理サーバは、各高可用性グループの死活監視を行っており、
各高可用性グループ内に1台あるマスター(Read/Writeサーバ)の停止を検知すると、
同じ高可用性グループ内のスレーブ(Read Onlyサーバ)のどれかに自動フェールオーバーさせる。
なお、高可用性グループ内でのレプリケーションについてもMySQL Fabric管理サーバが実行させている。
また、クライアントに対して(正確には、MySQL Fabric対応のコネクタを介して接続してくるクライアントに対して)
自分の管理する高可用性グループ構成情報をマッピングしており、
このため、クライアントはMySQL Fabric管理サーバを経由することなく(=オーバーヘッドを生じることなく)
アクセスすべきMySQLサーバにアクセスすることができる。
クライアントは、データをシャーディングさせるかさせないかを選択することができる。
更新負荷分散という観点ではシャーディングした方が有利だが、
テーブルデータの利用方法上、あるいはシステムのワークロード上、
データを全シャードで共通して持っておきたい場合も考えられるためと思われる。
ここをどう設計するかはアプリ技術者の腕の見せ所(だと思う)。
シャーディングするテーブルに対するクエリについては、
データを持っているあるいはデータを更新すべきサーバに直接クエリを送る。
シャーディングしないテーブルに対するクエリについては、
一旦Global Groupにクエリを送り、Global Groupから他の高可用性グループにレプリケーションを行う。
インストール方法、利用方法等についてはまた後日。
=====MySQL Fabric検証シリーズ=====
第1弾:UCO-Tech(MySQL Fabricアーキテクチャ編)
第2弾:UCO-Tech(MySQL Fabricインストール&検証準備編)
第3弾:UCO-Tech(MySQL Fabric基本設定編)
第4弾:UCO-Tech(MySQL Fabric死活監視編)
第5弾:UCO-Tech(MySQL Fabricデータシャーディング編)
==================================