Fabric検証シリーズ第5弾。今回はデータシャーディング編。複数のテーブルやサーバに分割して保存することである。書き込み負荷分散ができるという大きなメリットがある。nothing型のアーキテクチャを取る。Master/Slave1台ずつの構成であれば、MasterとSlaveそれぞれに別個のデータディスクを持ち、データディスクを共有して利用する、ということはない。Cluster(RAC)が共有ディスクを持つ点と異なる。分割のポリシーを適切に設定すれば書き込み負荷(I/Oの観点で)の低減につながる。Fabricでのデータシャーディング設定の流れを確認する。下記の検証での環境は下記構成となっている。Fabric管理サーバ192.168.2.213my_first_fabric192.168.2.214(Primary)192.168.2.215(Secondary)my_second_fabric192.168.2.216(Primary)192.168.2.217(Secondary)my_global_fabric192.168.2.218(Primary)192.168.2.219(Secondary)流れといっても設定手順自体は極めて短いもので、1.シャーディングの定義を作り2.どのテーブルをシャーディングさせるか、さらにどのカラムをシャーディングのKeyにするかを指定し、3.シャーディングの定義に高可用性グループ(MySQLサーバ単体ではない)を追加するとなる。コマンドレベルでは、このようになる。シャーディング定義の作成ここではシャーディングをデータの値の範囲に基づくか、HASH値に基づくかを指定し、さらにどの高可用性グループをグローバルグループにするかを指定する。今回の例では、データの値の範囲(RANGE)に基づくシャーディングで、my_global_fabricグループをグローバルグループに指定した。(_define_shard_mapping).設定内容は以下で確認できる。各シャーディング定義に対して割り当てられたIDのことである。(_add_shard_mapping).設定内容の確認は以下。残りのmy_first_fabric、my_second_fabricグループをシャーディング定義に追加する。今回の定義ではRANGEを指定しているので、グループを追加する時に値のRANGEも同時に指定する。–state=ENABLEDである。(_add_shard).確認は以下のコマンドで。my_global_fabricこれで、my_global_fabricグループをグローバルグループとし、testデータベースのt1テーブルのcol1カラムが1~9であればmy_first_fabric高可用性グループに、10以上であればmy_second_fabricに振り分ける、というシャーディング定義が完成した。ここまで構成が終わっていると、グローバルグループに対してかけられた更新がその配下の高可用性グループに伝播するようになっている。これはシャーディングを定義したテーブル以外でも同様である。この仕組みについては、こちらの記事で図を掲載しているので、確認してみてもらいたい。これでシャーディング設定は完了となる。続くテストに向け、シャーディング対象テーブルを作成し、APサーバからの接続用ユーザを作成しておく。他の全サーバに伝播する。sec)次にAPサーバを構成する。APサーバといってもJava、Python、PHPのどれかと、それに対応するコネクタが入っていればよい。Pythonでのスクリプトについては他ブログ等でいくつかサンプルを見かけたが、Javaでのサンプルを見かけなかったので、Javaでの接続をしてみることにした。今回のAPサーバの構成は以下。6.5jdk1.8.0_45ちなみにIPは192.168.2.220である。JAVAインストールJDKをRPMパッケージでインストールする。バイナリはOracleホームページより。jdk-8u45-linux-x64.rpmPATHとCLASSPATHの設定を.bash_profileに入れる。~/.bash_profileを実行するか、ログインし直す必要があることを忘れずに。Connector/J配備MySQL公式サイトより、mysql-connector-java-5.1.36.tar.gzを落とし、tarを展開。mysql-connector-java-5.1.36.tar.gzJAVAのライブラリディレクトリにjarファイルを移動。/usr/java/jdk1.8.0_45/lib/これでAPサーバのセットアップは完了。Javaコーディング私がJavaを全くと言っていいほど知らないので、あまりセンスのあるコーディングではないかもしれないが、そこはお許し頂きたい。これは、test.t1テーブルに1~20の値をinsertするプログラムである。}}公式マニュアルにサンプルスクリプトがあるので、これを参照した。1箇所マニュアルに誤りと思われる箇所があった(後述)。要所だけでも解説していきたいと思う。com.mysql.fabric.jdbc.*;インポートするのはとりあえずこれで十分のはず。検証でそこまでやる意義もないと思ったのでこれで。"test";Class.forName(driver);ここでベースとなる接続情報を定義。driverは、そんな名前なんですか、程度に思っておけば良い(と思う)。fabric管理サーバを指して接続しなければならないのは要チェックポイント。user、passwordは、MySQLに接続する時のデータベースユーザ。fabric_user、fabric_passwordは、XML-RPCプロトコルでの接続をする際に認証をONにした場合に入力しようと思って設けた変数だが、結局使わなかったので意味なし。使う場合は、下のgetConnectionで追記が必要。書く場合の構文はマニュアルによるとjdbc:mysql:fabric://fabrichost:32274/database?fabricUsername=admin&fabricPassword=secretとのこと。password);このfabricShardTableを指定しておくのが重要。下記のようなエラーが出力されて接続ができない。`test.t1'要注意である。Fabric接続をする際にはFabricMySQLConnectionメソッドを利用する必要があるらしい。i++;}ps.close();con.close();}}ここは概ね通常のMySQL接続の際と同じなのだが、1点重要なのが、setShardKeyである。この引数に与える値によって、どのシャードにデータが格納されるか決まる。今回のシャーディング定義で考えると、、たとえばsetShardKey("1")となっていればmy_first_fabricグループにクエリが飛ぶし、setShardKey("10")となっていればmy_second_fabricグループにクエリが飛ぶ、という具合である。ここでsetShardKeyを行わない場合、グローバルグループにクエリが飛び、シャード全体に対してクエリが実行される。引数にはなぜか文字列でなければならない制約があるようなので、toString()関数を利用している。実際にプログラムを実行してみる。fabric_testなんの変化もなし。