MySQL5.0 JDBC ドライバフェイルオーバ機能 日本ヒューレットパッカード株式会社 オープンソース コンピテンシ センター 2006 年 8 月 31 日 2006 Hewlett-Packard Development Company, L.P. The information contained herein is subject to change without notice
目次 1. DataSourceとは? 2. コネクションプールとは? 3. MySQLフェイルオーバ機能 4. MySQL JDBCドライバフェイルオーバ機能 5. コネクションプール利用時の問題 2 平成 18 年 9 月 5 日
DataSource とは? A factory for connections to the physical data source that this DataSource object represents. JSE5.0 JavaDoc: javax.sql.datasource 物理的なデータソースへのコネクション ファクトリ データベースへのコネクションを取得できる 通常 J2EEアプリケーションサーバにリソースとして設定される JNDIを利用してDataSourceを取得する 3 平成 18 年 9 月 5 日
DataSource 利用 : 全体像 JNDI DB Client APP a.lookup 1. 利用 b. 検索 DataSource 2. 利用 JDBC Driver 3. 生成 6. 利用 8.Close 5. 払い出し 9. 払い戻し 4. 接続 DB 10. 破棄 7. クエリ実施 破棄 4 平成 18 年 9 月 5 日
DataSource 利用 : 動作 JNDI DB Client APP a.lookup 1. 利用 b. 検索 DataSource 2. 利用 JDBC Driver 3. 生成 6. 利用 8.Close 5. 払い出し 9. 払い戻し 重要! 7. クエリ実施 4. 接続 破棄 DB 5 平成 18 年 9 月 5 日
コネクションプールとは? DataSource を通して利用 の再利用 作成 接続処理を省く コネクションプール利用時と非利用時に コード上の差は存在しない 6 平成 18 年 9 月 5 日
コネクションプール利用の全体像 JNDI DB Client APP a.lookup 1. 利用 b. 検索 DataSource 2. 利用 JDBC Driver 3. 生成 6. 利用 8.Close 4. 接続 DB 5. 払い出し 9. 払い戻し 7. クエリ実施 7 平成 18 年 9 月 5 日
の再利用 DataSource の設定 の最小保持数 プールで保持する最小の の数 の最大保持数 プールで保持する最大の の数 再利用 プールされているを払い出す 利用後 = Closeする時にプールに戻す 8 平成 18 年 9 月 5 日
の再利用 DB Client APP 1. 利用 DataSource JDBC Driver 3. 利用 5.Close 2. 払い出し DB 6. 払い戻し 4. クエリ実施 9 平成 18 年 9 月 5 日
の再利用 ( コネクションがない場合 ) DB Client APP 1. 利用 DataSource A. 利用 JDBC Driver B. 生成 3. 利用 5.Close 2. 払い出し 6. 払い戻し C. 接続 の最大保持数を超えて 新規作成することはな 4. クエリ実施い DB 10 平成 18 年 9 月 5 日
MySQL フェイルオーバ機能 フェイルオーバ概要 MySQL レプリケーション構成 11 平成 18 年 9 月 5 日
フェイルオーバ概要 1. 接続先サーバに障害発生 2. 障害検知 3. 接続先サーバ切り替え Client サービス続行 接続先切り替え 障害発生 Server1 Server2 12 平成 18 年 9 月 5 日
フェイルオーバ概要種類 サーバ主導 サーバ側が障害を検知し サーバを切り替える HP Serviceguard for Linux など ネットワーク機器主導 ネットワーク機器が障害を検知し 接続先を切り替える F5 BIG-IP などのネットワーク機器 クライアント主導 クライアントが障害を検知し サーバを切り替える MySQL JDBC ドライバの機能利用など 13 平成 18 年 9 月 5 日
MySQL レプリケーション構成 読み出し 障害発生 接続先切り替え読み出し 読み出し 書き込み 書き込み Master Slave1 Slave2 Slave3 レプリケーション : データのコピー この部分のフェイルオーバを実施する 14 平成 18 年 9 月 5 日
MySQL JDBC ドライバ フェイルオーバ機能 JDBC URL に 2 つ以上のデータベースサーバを指定 接続確立時にフェイルオーバを可能にする 15 平成 18 年 9 月 5 日
MySQL JDBC ドライバフェイルオーバ機能概要 (1) JNDI a.lookup 1. 利用 DB Client APP b. 検索 DataSource 2. 利用 MySQL レプリケーション構成の Slave DB 群 JDBC Driver 3. 生成 6. 利用 8.Close 5. 払い出し 9. 払い戻し 7. クエリ実施 4. 接続 DB DB JDBC ドライバのフェイルオーバ機能で切り替え DB クエリ実施時の障害は対応できない 16 平成 18 年 9 月 5 日
MySQL JDBC ドライバフェイルオーバ機能概要 (2) DataSource 1. 利用 JDBC Driver MySQL レプリケーション構成の Slave DB 群 2. 生成 接続失敗 DB1 接続失敗 DB2 成功! DB3 17 平成 18 年 9 月 5 日
MySQL JDBC ドライバのフェイルオーバ機能設定方法 JDBC URL を以下のように設定 jdbc:mysql://svr1,svr2,svr3/db Primary の接続先 : svr1 以降 svr2, svr3 の順に接続を試行 関連 JDBC プロパティ failoverreadonly (true/false, default=true) queriesbeforeretrymaster ( 回数 1 以上, default=50) secondsbeforeretrymaster ( 秒数 1 以上, default=30) initialtimeout ( 秒数 0 以上 *, default=2) maxreconnects ( 回数 1 以上 *, default=3) 18 平成 18 年 9 月 5 日
MySQL JDBC ドライバのフェイルオーバ機能フェイルオーバ後の振る舞い 同一のコネクションを利用し続けると Primary の接続先に接続しなおそうとする 条件 queriesbeforeretrymaster 指定回数の Query 実行後 secondsbeforeretrymaster 指定秒数経過後 接続が可能な場合 以降の Query は Master へ投げられる Primary への再接続無効化はできない 19 平成 18 年 9 月 5 日
MySQL JDBCドライバのフェイルオーバ機能フェイルオーバ後の振る舞い DB Client APP 利用 指定クエリ発行回数または指定秒数経過後 マスターへ再接続しようとする 接続失敗 initialtimeout 秒間隔で maxreconects 回接続を試みる DB1 接続失敗 DB2 通常のフェイルオーバ処理を開始 成功! 接続中! DB3 20 平成 18 年 9 月 5 日
MySQL JDBC ドライバのフェイルオーバ機能サンプルコード ( 非コネクションプール利用時 ) for (int count = 0; count < MaxCount; count ++) try { // 取得 // クエリ実施 break; // 成功 } catch (Exception e) { // 例外処理 } finally { } // for 文の中でも break 後でも必ず実施される if (conn!= null) try { conn.close(); } catch (Exception e) { } 21 平成 18 年 9 月 5 日
MySQL JDBC ドライバのフェイルオーバ機能振る舞い JNDI DB Client APP a.lookup 1. 利用 b. 検索 DataSource 2. 利用 JDBC Driver 3. 生成 6. 利用 8.Close 5. 払い出し 9. 払い戻し 4. 接続 DB DB DB 7. クエリ実施 22 平成 18 年 9 月 5 日
コネクションプール利用時の問題 コネクションプール利用時に障害 データベースアクセスができない場合の振る舞い その対応 JBossでの設定方法 Tomcatでの設定方法 23 平成 18 年 9 月 5 日
プール利用時の問題 概要図 DB Client APP 1. 利用 DataSource データベースアクセス障害の場合 全 が破棄されるまで 例外が発生しつづける JDBC Driver 3. 利用 5.Close 2. 払い出し DB SQL 例外 障害発生 4. クエリ実施 6. 破棄 24 平成 18 年 9 月 5 日
利用時の問題対応 J2EE アプリケーションサーバ側機能を利用 の払い出し時にデータベースアクセスを確認 A. 利用 DataSource JDBC Driver 1. 利用 DB Client APP B. 生成 3. 利用 5.Close 2. 払い出し 破棄 破棄 6. 払い戻し 4. クエリ実施 B. 接続確認 失敗 失敗 A. 接続確認 DB 25 平成 18 年 9 月 5 日
コネクションプール利用時 DB アクセス確認 JBoss での設定 接続確認用設定を追加 valid-connection-checker-class-name 接続確認用クラス名を設定 com.mysql.jdbc.integration.jboss.mysqlvalidchecker DataSource 設定例... <valid-connection-checker-class-name> com.mysql.jdbc.integration.jboss.mysqlvalidchecker </valid-connection-checker-class-name>... 26 平成 18 年 9 月 5 日
コネクションプール利用時 DB アクセス確認 Tomcat での設定 接続確認タイミング設定 testonborrow コネクションプールからコネクション取得時に接続を確認 true/false, default は true (validationquery 設定時のみ ) validationquery 接続確認用 Query デフォルトは空文字列, 通常 SELECT 1 で十分のはず... < Resource name="jdbc/testmysqlds"... validationquery="select 1" testonborrow="true" />... 27 平成 18 年 9 月 5 日
28 平成 18 年 9 月 5 日