さて、前回に引き続き、MySQL Routerについてです。
今回はFabric Cache Pluginを使ったルーティングをやってみましょう。
事前情報として、利用したMySQL Fabric構成を簡単に書いておくと、
global_group:3306(Master)、3307(Slave)
1st_group:3308(Master)、3309(Slave)
2nd_group:3310(Master)、3311(Slave)
となっており、
global_groupをグローバルグループとした(なんとも間抜けな物言いですね、、、)、
シャーディングを定義しています。
Rangeベースのシャーディングですが、そこまでは今は関係のないことで、
肝心なのは、3306番MySQLに向けて実行したクエリは
他グループにも伝播し、グループ内部でレプリケーションされる、
ということです。
MySQL Routerやアプリケーションサーバと同じサーバにMySQL Fabric管理サーバを置いています。
では、早速中身に入っていきましょう。
まずは設定ファイルです。
マニュアルはこちら。
# Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # # MySQL Router configuration file # # Documentation is available at # http://dev.mysql.com/doc/mysql-router/en/ [DEFAULT] logging_folder = /var/log/mysqlrouter/ plugin_folder = /usr/lib64/mysqlrouter runtime_folder = /var/run/mysqlrouter config_folder = /etc/mysqlrouter [logger] level = info # If no plugin is configured which starts a service, keepalive # will make sure MySQL Router will not immediately exit. It is # safe to remove once Router is configured. [keepalive] interval = 60 # Added by UCO [routing:ReadWriteServers] bind_address = 127.0.0.1:7001 destinations = 192.168.2.222:3306,192.168.2.222:3308,192.168.2.222:3310 mode = read-write [routing:ReadOnlyServers] bind_address = 127.0.0.1:7002 destinations = 192.168.2.222:3307,192.168.2.222:3309,192.168.2.222:3311 mode = read-only [fabric_cache:FabricRouting] address = 127.0.0.1 user = admin [routing:FabricRouting] bind_address = 127.0.0.1:7003 destinations = fabric+cache://FabricRouting/group/global_group mode = read-write
前回作ったものの下に2つセクションを足しました。
fabric_cacheセクションでは、MySQL Fabric管理サーバのアドレスを指します。
今回はMySQL Fabric管理サーバが同居しているので127.0.0.1です。
また、fabric_cacheセクションにFabricRoutingという名前のタグを付けました。
これが、下のroutingセクションのタグとリンクしています。
routingセクションでは、destinationsの書き方が通常のルーティングと異なります。
(ほかは同じです)
destinationsでは、
plugin://section_key/target/group_id
の文法でルーティング先を指定します。
pluginは、現在のところfabric+cacheプラグインしかないのでこれを指定。
section_keyは、先ほどfabric_cacheセクションでつけたタグを指定。
targetは、現在のところgroupしかないのでこれを指定。
group_idは、MySQL Fabricの高可用性グループ名を指定。
今回はglobal_groupを指定しました。
・・・要はほとんど考える所はなくて、機械的に指定するだけですね。
さて、では実際に使ってみましょう。
今回、MySQL Fabric Cache Pluginを利用しているので、
mysqlrouterコマンドを実行した時に、MySQL Fabric管理サーバのパスワードが聞かれます。
mysqlrouter.iniで指定するとか、mysqlrouterコマンドの引数で渡すとか、
なんらかのやり方でパスワードを渡してバックグラウンド実行させたいと思ったんですが、
いずれもダメで、このせいでmysqlrouterをバックグラウンド実行させられなくなっています。
ちょっとにわかに信じがたい仕様なので、
なんらかのやり方があるが私が気づいていないだけなのでしょう、、、(?)
ともかく、今回は別セッションでmysqlrouterコマンドを実行して、
その隙に本セッションでクエリを投げる作戦で行こうと思います。
実行したJAVAプログラム
import java.sql.*; class fabric_router_test{ public static void main(String[] args){ try{ String driver = "com.mysql.jdbc.Driver"; String url = "jdbc:mysql://127.0.0.1:7003"; String user = "ap_user"; String password = "ap_user"; Class.forName (driver); Connection con = DriverManager.getConnection(url, user, password); Statement stmt = con.createStatement (); String sql= "insert into test.t1 values(null, 'insert from app server')"; int num = stmt.executeUpdate(sql); stmt.close(); con.close(); } catch (SQLException e){ System.err.println("SQL failed..."); e.printStackTrace (); } catch (ClassNotFoundException ex) { ex.printStackTrace (); } } }
こちらのソースを見る限り、MySQL Fabricの要素は全くありません。
おそらくJDBCドライバはMySQL Fabric対応バージョンでなくても機能するでしょう。
単に接続先が127.0.0.1:7003になっているだけです。
この接続先が、mysqlrouter.iniファイルで指定したように、
global_groupにルーティングされ、
global_groupから残りの1st_group、2nd_groupにもレプリケーションされていく、
というわけです。
実行コマンド
サブセッションにて
[root@cent7-mysql57-1 ~]# mysqlrouter Logging to /var/log/mysqlrouter/mysqlrouter.log Password for [fabric_cache:FabricRouting], user admin: (プロンプト返ってこず)
本セッションにて
[root@cent7-mysql57-1 ~]# javac fabric_router_test.java [root@cent7-mysql57-1 ~]# java fabric_router_test
さて、気になる結果ですが、、、?
mysql-3306> select * from test.t1; +------+------------------------+ | col1 | col2 | +------+------------------------+ | 1 | insert from app server | +------+------------------------+ 1 row in set (0.00 sec)
残りの3307~3311番MySQLでも同様の結果でした。
予想通りですね。
さて、これでMySQL RouterとMySQL Fabricの連携が確認できました。
要は、MySQL RouterからMySQL Fabricへの連携には、
MySQL Router側で高可用性グループを指定してクエリを飛ばす、
ということです。
MySQL Fabric対応のコネクタがない言語でもMySQL Fabric管理下のサーバに対して
クエリを投げられるようになったのは良いですね(まだ検証はしてませんが、仕組み上大丈夫でしょう、、、)。
しかしながら、この指定の仕方では、
MySQL Fabricのシャーディング機能との連携はできません。
シャーディングでは、
MySQL Fabricクエリの中で指定しているキーを
MySQL Fabric管理サーバが持っているシャーディング定義に照らして
接続先の高可用性グループを決定しますが、
MySQL Routerでは、クエリの中身を見ずに
MySQL Routerの設定ファイルでの定義に基づいて
機械的に高可用性グループを直に指定してしまうためです。
というわけで、MySQL RouterからMySQL Fabricへの連携はシャーディングができない、
という条件付でありながらも一通り確認できました。
(もしシャーディング機能とも連携ができるのであればすばらしいのですが、、、
もう少しやり方探してみたいですね)
MySQL Routerの有効な使い方についても今後考えてみたいですね。
というわけで、今回はここまでです。
では。
====================================
MySQL Router 基本ルーティング編
MySQL Router Fabricルーティング編
いつも楽しみに拝見しています。
次の更新も宜しくお願い致します。
> もふもふさん
楽しみにして頂いているとのこと、ありがとうございます。
今後もちょくちょく更新していきたいと思いますので、宜しくお願い致します。