MHAの次を目指す mikasafabric for MySQL

103 views

Published on

2016/11/05 OSC 2016 Tokyo/Fall

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
103
On SlideShare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
1
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

MHAの次を目指す mikasafabric for MySQL

  1. 1. MHAの次を目指すmikasafabric for MySQL 今年のアドベントカレンダー 2016/11/05 yoku0825 OSC 2016 Tokyo/Fall
  2. 2. \こんにちは/ yoku0825@とある企業のDBA オラクれない- ポスグれない- マイエスキューエる- 家に帰ると 妻の夫- せがれの⽗- ムスメの⽗- ⽣息域 Twitter: @yoku0825- Blog: ⽇々の覚書- MyNA ML: ⽇本MySQLユーザ会- MySQL Casualʼs Slack: MySQL Casual- 1/73
  3. 3. mikasafabric for MySQL #とは GMO Media, Inc.によってメンテナンスされている MySQL Fabric のフォークプロダクト MySQLの障害を検知してマスターの⾃動切換え MHA for MySQLと同じポジションを担うフレームワーク 2/73
  4. 4. Do you know MySQL Fabric ︖ 3/73
  5. 5. MySQL Fabric #とは ⾼可⽤性(High Availability) 障害探知と昇格- データベースリクエストのアクセス先の選択- シャーディング – スケールアウト MySQL Fabric – コネクタとの連携 プロキシ不要の構成- MySQL :: MySQL Fabric 4/73
  6. 6. MySQL Fabricを導⼊した構成 AP [Not supported by viewer] Connector/J Master Slave mysqlfabric Monitor/Demote Monitor/Promote Lookup Group Query Routing Routing AP AP Connector/J 5/73
  7. 7. MySQL Fabric構成の仕組み MySQL Fabrci対応コネクター(図中ではConnector/J)が mysqlfabric デーモンからHAグループ情報とシャードグル ープ情報を受け取る Connector/J 以外では Connector/.NET, Connector/Python- アプリケーションはMySQLの代わりに mysqlfabric のデー モンに接続する(IPアドレス, ポート)ような設定にする すると、Connector/Jがその接続をハンドルして、HAグループのマス ター/スレーブ, シャードの属するシャードグループにプロキシーして くれる - mysqlfabric デーモンがダウンしている場合、直前のキャッシュを使 ってルーティングする - HAグループ内のフェイルオーバー処理、シャードグループ 間のリシャードは mysqlfabric デーモンのAPIを介して⾏う 6/73
  8. 8. つまり MHA for MySQL と同等の使い⽅が可能 MHA for MySQL はWEB界隈で最も⼈気の⾼いMySQL冗⻑化ソリ ューション ダウン検出でマスターの⾃動昇格は⽋損しているバイナリーログの(可能な限りの) リカバリーを含み 昇格時にキックされるスクリプトでVIPやDNSの書き換えを⾏う - GTID必須(MySQL 5.7のオンラインGTID有効化で⼀気に ⾝近に) クラッシュセーフスレーブの設定でも使える MHA for MySQLは relay_log_info_repository= TABLE と相性が悪 くて起動に転ける - 7/73
  9. 9. MHA for MySQLとの⽐較 MHA for MySQL MySQL Fabric マネージャプロセス masterha̲manager mysqlfabric マネージャの状態確認 ログのみ mysqlfabricコマンド (デー モンと同じコマンド) エージェント ライブラリ なし 切り替わり時のリカバリー ⼀番進んでいるスレーブのリ レーログから(via SSH) なし 切り替わりの処理 master̲ip̲failover̲script ファブリック対応コネクター 依存 処理フック master̲ip̲failover̲scrip t, secondary̲check̲script, shutdown̲script, report̲script SERVER̲LOST, SERVER̲PROMOTED, SERVER̲DEMOTEDが予約 されているが、Pythonで直 書き 構成の検出 ⾃動 ⼿動で登録 サーバーの追加, 削除 コンフィグ編集, 再起動 mysqlfabricコマンド 8/73
  10. 10. MHA for MySQLとの⽐較 MHA for MySQL MySQL Fabric マネージャプロセス masterha̲manager mysqlfabric マネージャの状態確認 ログのみ mysqlfabricコマンド (デー モンと同じコマンド) エージェント ライブラリ なし 切り替わり時のリカバリー ⼀番進んでいるスレーブのリ レーログから(via SSH) なし 切り替わりの処理 master̲ip̲failover̲script ファブリック対応コネクター 依存 処理フック master̲ip̲failover̲scrip t, secondary̲check̲script, shutdown̲script, report̲script SERVER̲LOST, SERVER̲PROMOTED, SERVER̲DEMOTEDが予約 されているが、Pythonで直 書き 構成の検出 ⾃動 ⼿動で登録 サーバーの追加, 削除 コンフィグ編集, 再起動 mysqlfabricコマンド 9/73
  11. 11. マネージャプロセス どちらもMySQLと別のプロセスが切り替える OSダウンを考えると別のノードに収容しておきたい- スレーブだけ単体でOSごと落ちるのであれば切り替わり⾃体は必要な いので2台3台構成ならそれも⼿ではあるが - マネージャプロセスのダウンは切り替わりができないだけ で、サービスそのものに影響は出ない 10/73
  12. 12. MHA for MySQLとの⽐較 MHA for MySQL MySQL Fabric マネージャプロセス masterha̲manager mysqlfabric マネージャの状態確認 ログのみ mysqlfabricコマンド (デ ーモンと同じコマンド) エージェント ライブラリ なし 切り替わり時のリカバリー ⼀番進んでいるスレーブのリ レーログから(via SSH) なし 切り替わりの処理 master̲ip̲failover̲script ファブリック対応コネクター 依存 処理フック master̲ip̲failover̲scrip t, secondary̲check̲script, shutdown̲script, report̲script SERVER̲LOST, SERVER̲PROMOTED, SERVER̲DEMOTEDが予約 されているが、Pythonで直 書き 構成の検出 ⾃動 ⼿動で登録 サーバーの追加, 削除 コンフィグ編集, 再起動 mysqlfabricコマンド 11/73
  13. 13. マネージャの状態確認 MHA for MySQLはプロセスの内部にマスター/スレーブの情 報を持ち、APIは特に⽤意されていない masterha_master_monitor はマネージャから情報を惹くのではなく、 ⾃分が起動してMySQLの状態をチェックする - MySQL Fabricは、管理対象とは別のMySQL(バッキングス トア)に構成情報を保存する mysqlfabricデーモンがMySQLプロトコルとXMLRPCプロトコルで APIを持っている - バッキングストアが落ちるとmysqlfabricデーモンが落ち…てくれず に刺さる - 12/73
  14. 14. MHA for MySQLとの⽐較 MHA for MySQL MySQL Fabric マネージャプロセス masterha̲manager mysqlfabric マネージャの状態確認 ログのみ mysqlfabricコマンド (デー モンと同じコマンド) エージェント ライブラリ なし 切り替わり時のリカバリー ⼀番進んでいるスレーブのリ レーログから(via SSH) なし 切り替わりの処理 master̲ip̲failover̲script ファブリック対応コネクター 依存 処理フック master̲ip̲failover̲scrip t, secondary̲check̲script, shutdown̲script, report̲script SERVER̲LOST, SERVER̲PROMOTED, SERVER̲DEMOTEDが予約 されているが、Pythonで直 書き 構成の検出 ⾃動 ⼿動で登録 サーバーの追加, 削除 コンフィグ編集, 再起動 mysqlfabricコマンド 13/73
  15. 15. エージェント MHA for MySQLのエージェントは常駐型ではない いくつかのコマンドを提供する mha4mysql-node をインストールする- mha4mysql-node の提供するコマンドをSSH経由でマネージャーが叩く- MySQL Fabricはフェイルオーバーなどに必要な全ての動作 をSQLだけで実装しているためエージェントが要らない 拡張する場合はSQLでできることをやらせないといけない- 14/73
  16. 16. MHA for MySQLとの⽐較 MHA for MySQL MySQL Fabric マネージャプロセス masterha̲manager mysqlfabric マネージャの状態確認 ログのみ mysqlfabricコマンド (デー モンと同じコマンド) エージェント ライブラリ なし 切り替わり時のリカバリー ⼀番進んでいるスレーブのリ レーログから(via SSH) なし 切り替わりの処理 master̲ip̲failover̲script ファブリック対応コネクター 依存 処理フック master̲ip̲failover̲scrip t, secondary̲check̲script, shutdown̲script, report̲script SERVER̲LOST, SERVER̲PROMOTED, SERVER̲DEMOTEDが予約 されているが、Pythonで直 書き 構成の検出 ⾃動 ⼿動で登録 サーバーの追加, 削除 コンフィグ編集, 再起動 mysqlfabricコマンド 15/73
  17. 17. 切り替わり時のリカバリー MHA for MySQLは⼀番進んでいるスレーブのリレーログを チェックして差分を読み込み、実⾏させる ポジションを判定してseek(), read() で読む- MySQL Fabricは⼀番進んでいるスレーブを次のマスターに 選ぶものの、リカバリー処理⾃体は存在しない 受け取ったリレーログをすべて適⽤するまで待つだけ- Semisyncレプリケーション必須- 16/73
  18. 18. MHA for MySQLとの⽐較 MHA for MySQL MySQL Fabric マネージャプロセス masterha̲manager mysqlfabric マネージャの状態確認 ログのみ mysqlfabricコマンド (デー モンと同じコマンド) エージェント ライブラリ なし 切り替わり時のリカバリー ⼀番進んでいるスレーブのリ レーログから(via SSH) なし 切り替わりの処理 master̲ip̲failover̲scr ipt ファブリック対応コネクター 依存 処理フック master̲ip̲failover̲scrip t, secondary̲check̲script, shutdown̲script, report̲script SERVER̲LOST, SERVER̲PROMOTED, SERVER̲DEMOTEDが予約 されているが、Pythonで直 書き 構成の検出 ⾃動 ⼿動で登録 サーバーの追加, 削除 コンフィグ編集, 再起動 mysqlfabricコマンド 17/73
  19. 19. 切り替わりの処理(主にIPのつけかえ) MHA for MySQLは master_ip_failover_script に切り替わ りの処理を書く VIPの付け替えだったり、DNSの更新だったり- read_only の設定変更だったり、新しいレプリケーションユーザーを 作ったりの処理もここに書くことができる - MySQL Fabricは切り替わりはコネクターが吸収する バッキングストアに持っているマスター/スレーブの状態を更新し、- ファブリック対応コネクターが次にHAグループ情報を参照してきた時 にコネクター側に反映される - MySQL RouterもFabric対応コネクターと⾒做せる- デフォルトのTTLは1秒- 18/73
  20. 20. MHA for MySQLとの⽐較 MHA for MySQL MySQL Fabric マネージャプロセス masterha̲manager mysqlfabric マネージャの状態確認 ログのみ mysqlfabricコマンド (デー モンと同じコマンド) エージェント ライブラリ なし 切り替わり時のリカバリー ⼀番進んでいるスレーブのリ レーログから(via SSH) なし 切り替わりの処理 master̲ip̲failover̲script ファブリック対応コネクター 依存 処理フック master̲ip̲failover̲scr ipt, secondary̲check̲scrip t, shutdown̲script, report̲script SERVER̲LOST, SERVER̲PROMOTED, SERVER̲DEMOTEDが予 約されているが、Pythonで 直書き 構成の検出 ⾃動 ⼿動で登録 サーバーの追加, 削除 コンフィグ編集, 再起動 mysqlfabricコマンド 19/73
  21. 21. 処理フック MHA for MySQLはいい感じのところにフックがあり、それ ぞれ⾃分の好きなスクリプトで書けば良い これにより、応答がなくなった旧マスターをOSごとシャットダウンす る、という荒業も可能に - MySQL Fabricもイベントトリガーは予約されているもの の、設定ファイルではどうにもならない 更に、SSHも利⽤できるMHAに対してMySQL FabricはSSHのセット アップを要求しないので、出来ることは限られている - とはいえ単にスクリプトを叩くようにイベントを書けばいいはず- 20/73
  22. 22. MHA for MySQLとの⽐較 MHA for MySQL MySQL Fabric マネージャプロセス masterha̲manager mysqlfabric マネージャの状態確認 ログのみ mysqlfabricコマンド (デー モンと同じコマンド) エージェント ライブラリ なし 切り替わり時のリカバリー ⼀番進んでいるスレーブのリ レーログから(via SSH) なし 切り替わりの処理 master̲ip̲failover̲script ファブリック対応コネクター 依存 処理フック master̲ip̲failover̲scrip t, secondary̲check̲script, shutdown̲script, report̲script SERVER̲LOST, SERVER̲PROMOTED, SERVER̲DEMOTEDが予約 されているが、Pythonで直 書き 構成の検出 ⾃動 ⼿動で登録 サーバーの追加, 削除 コンフィグ編集, 再起動 mysqlfabricコマンド 21/73
  23. 23. 構成の検出 MHA for MySQLは管理対象のIP, portをコンフィグから読 み取り、実際にどのMySQLがマスターになっているかは⾃ 動で検出する MySQL Fabricはバッキングストアの情報を正として、実態 はチェックしない 再起動には強い- バッキングストアの内容と実態がズレると地獄が⾒える- 既存のレプリケーション環境に導⼊しようと思うとちょっとだけコツ が必要 - 22/73
  24. 24. MHA for MySQLとの⽐較 MHA for MySQL MySQL Fabric マネージャプロセス masterha̲manager mysqlfabric マネージャの状態確認 ログのみ mysqlfabricコマンド (デー モンと同じコマンド) エージェント ライブラリ なし 切り替わり時のリカバリー ⼀番進んでいるスレーブのリ レーログから(via SSH) なし 切り替わりの処理 master̲ip̲failover̲script ファブリック対応コネクター 依存 処理フック master̲ip̲failover̲scrip t, secondary̲check̲script, shutdown̲script, report̲script SERVER̲LOST, SERVER̲PROMOTED, SERVER̲DEMOTEDが予約 されているが、Pythonで直 書き 構成の検出 ⾃動 ⼿動で登録 サーバーの追加, 削除 コンフィグ編集, 再起動 mysqlfabricコマンド 23/73
  25. 25. サーバーの追加, 削除 MHA for MySQLは追加, 削除時にコンフィグの再読み込み が必要 MySQL Fabricは mysqlfabric group add, mysqlfabric group remove コマンドで動的に追加, 削除 どちらにせよこれらマネージャプロセスは単⼀障害点ではないので、 再起動でもオンラインでもそれほど違いはない - 24/73
  26. 26. ここまでのまとめ MySQL FabricはMHA for MySQLのようにMySQLの⾃動/⼿ 動フェイルオーバーをサポートするためのプロダクト MySQL Fabricは状態をバッキングストアに保管し、APIを 提供するウェブアプリケーションライクなつくり 良くも悪くも- MHAは非同期レプリケーションしかない時代に開発された もののため、リレーログから差分をリカバリーする機能がつ いている MySQL 5.7とそれ以降でサポートされた複数台の準同期レプリケーシ ョンを利⽤すればリカバリーは不要になった - 25/73
  27. 27. 興味が湧いて きましたか︖ [はい/Yes] 26/73
  28. 28. 2016年現在の MySQL Fabric のGAバージョン 27/73
  29. 29. 存在しな い 28/73
  30. 30. MySQL Fabricのパッケージング MySQL Fabric 1.4 MySQL Utilities 1.4に同梱 MySQL Fabric 1.5 MySQL Utilities 1.5に同梱 MySQL Fabric 1.6 MySQL Fabric 1.6としてリリースされる 予定 29/73
  31. 31. MySQL Utilities 1.6はリリース済み MySQL Utilities 1.6.4 (2016/08/05 GA) MySQL Fabricは1.6系から別パッケージになる 予定 なの で、もうMySQL Fabricは同梱されていない http://dev.mysql.com/downloads/utilities/ 30/73
  32. 32. MySQL Fabric 1.6はどこにもない 以前はLab版があったが2016/11/05現在Labにも存在しない http://dev.mysql.com/downloads/fabric/ 31/73
  33. 33. 追い打ち http://www.slideshare.net/mattalord/mysql-high- availability-innodb-clusters 32/73
  34. 34. 今までMySQL Fabricがいたとこ ろにMySQL Shell ガイル 33/73
  35. 35. あっ(察 し 34/73
  36. 36. 先が無いことを⾒抜くのは難しい (c)matsunobu 「先が無い」とは誰も⾔ってくれない 興味の無いものに対してわざわざ情報発信してベンダー に喧嘩を売る動機は無い .. 先が無い技術を選んで⼀番痛い目を⾒るのはその採⽤企 業とエンジニア http://www.slideshare.net/matsunobu/ss-28303485/31 35/73
  37. 37. 諦めますか︖ [No/否] 36/73
  38. 38. というよりは最初から諦めていた MySQL Fabricつらい MySQL Fabricつらい Advent Calendar 2014 MySQL Fabric&Routerつらくない Advent Calendar 2015 MySQL Fabricでぼっこぼこにされたはなし 37/73
  39. 39. これなんかひどい MySQL Fabric uses wrong argument of MAKETIME in prune̲log and prune̲error̲log events. MAKETIME functionʼs arguments are (hour, minute, second) but MySQL Fabric passes prune̲time as hour mysql> DELETE FROM log WHERE TIMEDIFF(UTC_TIMESTAMP(), reported) > MAKETIME(3600,0,0); Query OK, 0 rows affected, 1 warning (0.03 sec) Warning (Code 1292): Truncated incorrect time value: '3600:00:00' MySQL Bugs: #81557: MySQL Fabric uses wrong argument of MAKETIME in prune̲log Event 38/73
  40. 40. これもひどい status compares (not equal) with string ʻFAULTYʼ but status has integer datatype. mysql> SELECT server_uuid, group_id, server_address, mode, statu s, weight FROM servers WHERE group_id LIKE '%%' AND group_id IS N OT NULL AND status != 'FAULTY' ORDER BY group_id, server_addres s, server_uuid; 2 rows in set, 1 warning (0.00 sec) Warning (Code 1292): Truncated incorrect DOUBLE value: 'FAULTY' MySQL Bugs: #81559: Incorrect WHERE clause in dump̲servers fanction 39/73
  41. 41. 作ったやつ出てこい もともと何故誰も⽂句を⾔わないのか不思議なレベルの品質 パッチを送っても放置 ついにはバグレポートがトリアージすらされなくなった 使ってないソフトウェアに⽂句を⾔う⼈はいない 40/73
  42. 42. だいぶ考えたこと MHA for MySQLは流⾏っている とはいえ⾃分で使うのに⾜りない機能があって relay_log_info_repository= TABLE の場合起動できない MHA for MySQL⾃体を監視する⼿段が微妙 あんまりメンテナンスされてる気配がない - MySQL Fabricだって考え⽅⾃体は間違っていなかったはず だ 死活監視とマスター切り替えを備えたフレームワークという⽅向性- 死活監視がちょっとイケてなくて、エラーハンドルがイケてなくて、 補助機能が貧弱すぎて、ログ機構が極悪なだけ - シャーディングのことは忘れることにする- 41/73
  43. 43. オレオレパッ チしたことあ る⼈︖ 42/73
  44. 44. オレオレパッチの ソフトウェアを 運 ⽤ したことある ⼈︖ 43/73
  45. 45. つらい [はい/Yes] 44/73
  46. 46. オレオレパッチの 運⽤ メインラインのバージョン固定してパッチしてビルドしては いおしまい、なら楽 ex. mysql コマンドラインクライアント, mysqldump なんかはバージョ ンアップしたところでそんなに機能が変わらないから、バージョンを 固定してビルドするのは⼗分現実的 - メインラインが⽣きていて新機能が追加され続ける場合、追 従しないといけない メインラインが別の実装で同じ機能を作ったり- 非互換のAPI変更があったり- テスト書くのつらい- 45/73
  47. 47. 半年くらい悩んだ結果 あまりにもつらかったので、おとなしくフォークして⾃ 前でパッチを当てることにしました。フォークするつい でに名前を変えたのが mikasafabric for MySQLになり ます。 期待通りに使えるMySQL Fabricを目指した結果なの で、まあまあ期待通りに動きます mikasafabric for MySQLをオープンソースライセンスで公 開しました | GMOメディア エンジニアブログ 46/73
  48. 48. 悩んだ経緯 というか、 “Support MySQL 5.7” と銘打たれたコミッ トがひどすぎて、テストすら通らない(何故マージされ たし) という訳でまずテストを直すPRした。これがマージさ れれば Issue #109のやつも頑張るかも知れない。これ がマージされないようなら、 innotop は死んだんであ ろう(というか、死んだと思ってForkしてゴニョったや つをrpmbuildしたらテストが通らないのに気が付い た。。) ⽇々の覚書: innotopが最近息してないなーと思ったんだ 47/73
  49. 49. MySQLエコシステムの中⾝ 中⾝を⾒たことのある⼈いますか︖ innotop (Perl)- PMP for Cactiの ss̲get̲mysql̲stats.php (PHP)- MHA for MySQL (Perl)- どれも同じなのは、「⼈間がやるべき⾯倒くさい処理を、泥 臭く丁寧(︖)に実装してある」 48/73
  50. 50. innotopの⼀件で感じたこと かっこよくなくてもいい 誰もやりたくない泥臭いことを、丁寧に ⾃分で使いたい範囲のFixなら何とかなる ⾃分が使うために作ったものが誰かの役に⽴つこともある- 49/73
  51. 51. 脱線しま した 50/73
  52. 52. mikasafabric for MySQL #とは ⾼可⽤性(High Availability) 障害探知と昇格- データベースリクエストのアクセス先の選択- シャーディング – スケールアウト 今のところMySQL Fabricの機能に⼿を⼊れてない- MySQL Fabricもともとのシャーディング機能が何故かグループレプ リケーションを要求するようになっていたので、ここは完全にサポー ト外 - MySQL Fabric – コネクタとの連携 プロキシ不要の構成- MySQL Routerとの組み合わせに特化- 他のファブリック対応コネクターとも動くはずだけど未検証- 51/73
  53. 53. mikasafabric for MySQL MySQL 5.7の新機能も積極的に使う offline_mode を使ってコネクションプールとの相性を改善 0.4.0現在、ファームはMySQL 5.7.5以上必須 - Multi-Source Replication環境下でもファームに組み込めるように改 善 - 既存のバグのFIX prune_log, prune_error_log イベントのバグのせいでいつまでも消え ないログテーブル - レプリケーションスレッドのエラーでスレーブを SPARE ステートに切 り離し - “ちょっと便利な” 機能 event_schedular がオフだとワーニングメッセージ- レプリケーションユーザーの⾃動作成- ログテーブルへの出⼒をコンフィグで設定- 52/73
  54. 54. MySQL Fabric(mikasafabric) + MySQL Routerの動 作 Master Slave mysqlfabric Monitor/Demote Monitor/Promote AP AP mysqlrouter 127.0.0.1:3306 AP AP mysqlrouter 127.0.0.1:3306 Lookup Group QueryRouting(NAT) Routing(NAT) 53/73
  55. 55. 名前解決ベースのHAに近い MySQL Router(またはFabric-awareコネクター)がリゾルバ ー MySQL RouterはTTLが切れるたびにMySQL Fabricに経路 情報を問い合わせ TTL期間内はMySQL Router内のルーティングキャッシュを使って経 路解決 - TTL期間後でもMySQL Fabricへの経路情報の問い合わせに失敗した らルーティングキャッシュを使い続ける - 54/73
  56. 56. MySQL Router MySQL Routerは全てのパケットを⼀度NATする もしアプリケーションから⾒てlocalhost以外に置くなら、MySQLア カウントの接続元はMySQL RouterのIPアドレスにしないといけない - 遅延は数⼗us単位- ⼀度NATしている関係上、エラーパケットを捕捉して特定のエラーコ ードなら切断するとかいうパッチもしてみた(動いた) - パスワードをiniファイルに書くと起動できない、書かないとプロンプ トを出そうとするのがダメなところ(パッチでしのいでる) - mikasafabricでマスター昇格コマンドを叩くと2〜3秒で切 り替わる TTLは1(mikasafabric側の設定)- フェイルオーバーの場合、mikasafabricがファームのダウンを検知す るまでに6秒くらいなので合わせて10秒ちょい(のはず) - 55/73
  57. 57. MySQL Fabric レプリケーションのマスター/スレーブの組を “グループ” と 呼んで管理 サーバー(mysqld)は server_uuid ごとに識別される 4つのステータス。PRIMARY, SECONDARY, SPARE, FAULTY- 56/73
  58. 58. サーバーごとのステータス PRIMARY SECONDARY SPARE FAULTY read-write Yes No No No read-only No Yes No No read-only & allow̲primar y̲reads Yes Yes No No フェイルオーバ ー候補 - Yes No No フェイルオーバ ー時のマスター 追従 (Yes) Yes Yes No 死活監視 Yes Yes Yes No MySQL Routerから⾒た時で、他のコネクターは違うかも知 れない 57/73
  59. 59. mysqlrouter.ini [fabric_cache:hogehoge] address = 172.17.3.202 user = mysqlrouter #password = router_password [routing:master] bind_address= 0.0.0.0:13306 mode = read-write destinations= fabric+cache://hogehoge/group/myfabric [routing:slave_only] bind_address= 0.0.0.0:23306 mode = read-only destinations= fabric+cache://hogehoge/group/myfabric [routing:all_wrr] bind_address= 0.0.0.0:33306 mode = read-only destinations= fabric+cache://hogehoge/group/myfabric&allow_primar y_reads=yes 58/73
  60. 60. mysqlrouter.iniの設定 fabric̲cacheセクション fabric_cache:xx のxxは識別名- parameter value address MySQL FabricのIPアドレス user MySQL Fabricの(not バッキングストア) ユーザー password MySQL Fabricの(not バッキングストア) パスワード (ただしMySQL Router 2.0.3現在、この項目 を設定するとエラーで起動しない 59/73
  61. 61. mysqlrouter.iniの設定 routingセクション routing:xx のxxは識別名- parameter value bind̲addres バインドするIPアドレスとポート mode read-writeまたはread-only destinations コンマ区切りのIPアドレス(単純なラウンド ロビン)または fabric+cache://Fabric識別名/group/ Fabricグループ名 allow_primary_reads={yes | no} 60/73
  62. 62. MySQL Router mysqlrouter のプロセスと「マスターへのルーティング」 「スレーブへのルーティング」が別のポートでLISTENされ る 「どっちにルーティングするためにどっちのポートを叩くか」は MySQL Routerは判断してくれない ⼀応MySQL Routerのルーティングはプラグイン⽅式なので、将来に期待 - mysqlrouter は全てのパケットをシングルスレッドでNATす るので、 レイテンシーは10us未満なのでそんなに⼼配はしなくて良さげa. 300並列(Not 同時接続)とかは mysqlrouter がサチるb. やろうと思えばクエリーの中⾝も覗けるc. 61/73
  63. 63. ステータス変更 PRIMARY SECONDARY SPARE FAULTY PRIMARY - group promote(*) No threat report̲failure SECONDARY group promote - server set̲status threat report̲failure SPARE No server set̲status - threat report̲failure FAULTY No No server set̲status - * 他のサーバーをマスターに昇格させるということ 62/73
  64. 64. mikasafabric for MySQLの死活監視 変更後ステータス mikasafabric特有 MySQL接続失敗(サーバーダ ウン含む) FAULTY No SHOW SLAVE STATUSで スレッドが⽌まってる SPARE Yes オフラインモードON FAULTY Yes 63/73
  65. 65. mikasafabric for MySQLのフェイルオーバー マスターに対して SET GLOBAL read_only = 1 マスターに対して SET GLOBAL offline_mode = 1 (mikasafabric特有) candidateに対して SELECT WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS(..), STOP SLAVE, RESET SLAVE ALL, SET GLOBAL read_only = 0 candidate以外のスレーブと旧マスターに対して STOP SLAVE, CHANGE MASTER TO 旧マスターに対して SET GLOBAL offline_mode = 0 (mikasafabric特有) 64/73
  66. 66. オフラインモード (from MySQL 5.7.5) MySQL :: MySQL 5.7 Reference Manual :: 6.1.4 Server System Variables SET GLOBAL offline_mode= 1 で有効化 オフラインモードだと、Super̲privを持っていないユーザ ーは接続できない Super̲privを持っていないユーザーのセッションは、現在 のクエリーが終了次第コネクションを切断される これで、コネクションプールのスレッドたちを⼀度強制的に切り離せ る - ⽇々の覚書: MySQL 5.7.5のオフラインモードはgraceful shutdownの夢を⾒るか 65/73
  67. 67. DEMO しかしじかんがたりな い︕︕ 66/73
  68. 68. InnoDB Clusterとの接点 http://www.slideshare.net/mattalord/mysql-high- availability-innodb-clusters 67/73
  69. 69. InnoDB Cluster グループレプリケーション(5.7.15-preview) をメインに置 いたHA構成 MySQL Router(2.1.0-preview) のMetadata Cacheプラグ インとMySQL Fabric Cacheプラグインは非常に似たつくり HA情報の問い合わせ先が違うだけ。- どちらもMySQL Routerから⾒ると CALL でストアドファンクション を呼び出す - 68/73
  70. 70. MySQL Fabirc vs InnoDB Cluster MySQL Fabric InnoDB Cluster 同期⽅式 非同期レプリケーション 同期グループコミュニケーシ ョン 死活監視 mysqlfabricデーモン 多分メンバー同⼠のグループ コミュニケーション 状態の操作 mysqlfabricコマンド MySQL Shell 69/73
  71. 71. 非同期ベース, 同期 ベースでユースケ ースは分かれてい く(かも) 70/73
  72. 72. mikasafabric for MySQLということ MySQL Fabricを使いたいおじさんが、 ⾃分で使うために パッチしている MySQL Fabric 1.6.0がlabsにあった時期があって、このまま1.5.6ベ ースで⾏くかどうかは微妙だけれど、それでも「ある程度期待通りに 動くMySQL Fabric」として使える程度にはメンテナンスするはず - 本家のメンテナンスが終わった(︖)以上、mikasafabric for MySQLはポストMHAとして⼿間をかける理由になった - ⾃分で⾔うのもアレだけど、MySQL 5.7 + MySQL Fabric + MySQL Routerの組み合わせで運⽤だったら⽇本で⼀番詳 しい気がする だから、その組み合わせだけに特化して(それでも⼤概のユースケー スには上⼿く合う)「DBAが本当に必要だったもの」を追加する - 71/73
  73. 73. mikasafabric for MySQL をよ ろしくお願いしま す :) 72/73
  74. 74. Questions and/or Suggestions? 73/73

×