mhaの次を目指す mikasafabric for mysql

74
MHAの次を目指すmikasafabric for MySQL 今年のアドベントカレンダー 2016/11/05 yoku0825 OSC 2016 Tokyo/Fall

Upload: yoku0825

Post on 16-Apr-2017

1.217 views

Category:

Technology


5 download

TRANSCRIPT

Page 1: MHAの次を目指す mikasafabric for MySQL

MHAの次を目指すmikasafabric for MySQL

今年のアドベントカレンダー2016/11/05

yoku0825OSC 2016 Tokyo/Fall

Page 2: MHAの次を目指す mikasafabric for MySQL

\こんにちは/

yoku0825@とある企業のDBAオラクれない-ポスグれない-マイエスキューエる-

家に帰ると妻の夫-せがれの⽗-ムスメの⽗-

⽣息域Twitter: @yoku0825-Blog: ⽇々の覚書-MyNA ML: ⽇本MySQLユーザ会-MySQL Casualʼs Slack: MySQL Casual-

1/73

Page 3: MHAの次を目指す mikasafabric for MySQL

mikasafabric for MySQL #とは

GMO Media, Inc.によってメンテナンスされている MySQL Fabric のフォークプロダクトMySQLの障害を検知してマスターの⾃動切換えMHA for MySQLと同じポジションを担うフレームワーク

2/73

Page 4: MHAの次を目指す mikasafabric for MySQL

Do you know MySQL

Fabric ︖3/73

Page 5: MHAの次を目指す mikasafabric for MySQL

MySQL Fabric #とは

⾼可⽤性(High Availability)障害探知と昇格-データベースリクエストのアクセス先の選択-

シャーディング – スケールアウトMySQL Fabric – コネクタとの連携プロキシ不要の構成-

MySQL :: MySQL Fabric

4/73

Page 6: MHAの次を目指す mikasafabric for MySQL

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

Page 7: MHAの次を目指す mikasafabric for MySQL

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

Page 8: MHAの次を目指す mikasafabric for MySQL

つまり

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

Page 9: MHAの次を目指す mikasafabric for MySQL

MHA for MySQLとの⽐較

MHA for MySQL MySQL Fabric

マネージャプロセス masterha̲manager mysqlfabric

マネージャの状態確認 ログのみ mysqlfabricコマンド (デーモンと同じコマンド)

エージェント ライブラリ なし

切り替わり時のリカバリー ⼀番進んでいるスレーブのリレーログから(via SSH)

なし

切り替わりの処理 master̲ip̲failover̲script ファブリック対応コネクター依存

処理フック master̲ip̲failover̲script, secondary̲check̲script, shutdown̲script, report̲script

SERVER̲LOST, SERVER̲PROMOTED, SERVER̲DEMOTEDが予約されているが、Pythonで直書き

構成の検出 ⾃動 ⼿動で登録

サーバーの追加, 削除 コンフィグ編集, 再起動 mysqlfabricコマンド

8/73

Page 10: MHAの次を目指す mikasafabric for MySQL

MHA for MySQLとの⽐較

MHA for MySQL MySQL Fabric

マネージャプロセス masterha̲manager mysqlfabric

マネージャの状態確認 ログのみ mysqlfabricコマンド (デーモンと同じコマンド)

エージェント ライブラリ なし

切り替わり時のリカバリー ⼀番進んでいるスレーブのリレーログから(via SSH)

なし

切り替わりの処理 master̲ip̲failover̲script ファブリック対応コネクター依存

処理フック master̲ip̲failover̲script, secondary̲check̲script, shutdown̲script, report̲script

SERVER̲LOST, SERVER̲PROMOTED, SERVER̲DEMOTEDが予約されているが、Pythonで直書き

構成の検出 ⾃動 ⼿動で登録

サーバーの追加, 削除 コンフィグ編集, 再起動 mysqlfabricコマンド

9/73

Page 11: MHAの次を目指す mikasafabric for MySQL

マネージャプロセス

どちらもMySQLと別のプロセスが切り替えるOSダウンを考えると別のノードに収容しておきたい-スレーブだけ単体でOSごと落ちるのであれば切り替わり⾃体は必要ないので2台3台構成ならそれも⼿ではあるが

-

マネージャプロセスのダウンは切り替わりができないだけで、サービスそのものに影響は出ない

10/73

Page 12: MHAの次を目指す mikasafabric for MySQL

MHA for MySQLとの⽐較

MHA for MySQL MySQL Fabric

マネージャプロセス masterha̲manager mysqlfabric

マネージャの状態確認 ログのみ mysqlfabricコマンド (デーモンと同じコマンド)

エージェント ライブラリ なし

切り替わり時のリカバリー ⼀番進んでいるスレーブのリレーログから(via SSH)

なし

切り替わりの処理 master̲ip̲failover̲script ファブリック対応コネクター依存

処理フック master̲ip̲failover̲script, secondary̲check̲script, shutdown̲script, report̲script

SERVER̲LOST, SERVER̲PROMOTED, SERVER̲DEMOTEDが予約されているが、Pythonで直書き

構成の検出 ⾃動 ⼿動で登録

サーバーの追加, 削除 コンフィグ編集, 再起動 mysqlfabricコマンド

11/73

Page 13: MHAの次を目指す mikasafabric for MySQL

マネージャの状態確認

MHA for MySQLはプロセスの内部にマスター/スレーブの情報を持ち、APIは特に⽤意されていない

masterha_master_monitor はマネージャから情報を惹くのではなく、⾃分が起動してMySQLの状態をチェックする

-

MySQL Fabricは、管理対象とは別のMySQL(バッキングストア)に構成情報を保存する

mysqlfabricデーモンがMySQLプロトコルとXMLRPCプロトコルでAPIを持っている

-

バッキングストアが落ちるとmysqlfabricデーモンが落ち…てくれずに刺さる

-

12/73

Page 14: MHAの次を目指す mikasafabric for MySQL

MHA for MySQLとの⽐較

MHA for MySQL MySQL Fabric

マネージャプロセス masterha̲manager mysqlfabric

マネージャの状態確認 ログのみ mysqlfabricコマンド (デーモンと同じコマンド)

エージェント ライブラリ なし

切り替わり時のリカバリー ⼀番進んでいるスレーブのリレーログから(via SSH)

なし

切り替わりの処理 master̲ip̲failover̲script ファブリック対応コネクター依存

処理フック master̲ip̲failover̲script, secondary̲check̲script, shutdown̲script, report̲script

SERVER̲LOST, SERVER̲PROMOTED, SERVER̲DEMOTEDが予約されているが、Pythonで直書き

構成の検出 ⾃動 ⼿動で登録

サーバーの追加, 削除 コンフィグ編集, 再起動 mysqlfabricコマンド

13/73

Page 15: MHAの次を目指す mikasafabric for MySQL

エージェント

MHA for MySQLのエージェントは常駐型ではないいくつかのコマンドを提供する mha4mysql-node をインストールする-mha4mysql-node の提供するコマンドをSSH経由でマネージャーが叩く-

MySQL Fabricはフェイルオーバーなどに必要な全ての動作をSQLだけで実装しているためエージェントが要らない拡張する場合はSQLでできることをやらせないといけない-

14/73

Page 16: MHAの次を目指す mikasafabric for MySQL

MHA for MySQLとの⽐較

MHA for MySQL MySQL Fabric

マネージャプロセス masterha̲manager mysqlfabric

マネージャの状態確認 ログのみ mysqlfabricコマンド (デーモンと同じコマンド)

エージェント ライブラリ なし

切り替わり時のリカバリー ⼀番進んでいるスレーブのリレーログから(via SSH)

なし

切り替わりの処理 master̲ip̲failover̲script ファブリック対応コネクター依存

処理フック master̲ip̲failover̲script, secondary̲check̲script, shutdown̲script, report̲script

SERVER̲LOST, SERVER̲PROMOTED, SERVER̲DEMOTEDが予約されているが、Pythonで直書き

構成の検出 ⾃動 ⼿動で登録

サーバーの追加, 削除 コンフィグ編集, 再起動 mysqlfabricコマンド

15/73

Page 17: MHAの次を目指す mikasafabric for MySQL

切り替わり時のリカバリー

MHA for MySQLは⼀番進んでいるスレーブのリレーログをチェックして差分を読み込み、実⾏させるポジションを判定してseek(), read() で読む-

MySQL Fabricは⼀番進んでいるスレーブを次のマスターに選ぶものの、リカバリー処理⾃体は存在しない受け取ったリレーログをすべて適⽤するまで待つだけ-Semisyncレプリケーション必須-

16/73

Page 18: MHAの次を目指す mikasafabric for MySQL

MHA for MySQLとの⽐較

MHA for MySQL MySQL Fabric

マネージャプロセス masterha̲manager mysqlfabric

マネージャの状態確認 ログのみ mysqlfabricコマンド (デーモンと同じコマンド)

エージェント ライブラリ なし

切り替わり時のリカバリー ⼀番進んでいるスレーブのリレーログから(via SSH)

なし

切り替わりの処理 master̲ip̲failover̲script

ファブリック対応コネクター依存

処理フック master̲ip̲failover̲script, secondary̲check̲script, shutdown̲script, report̲script

SERVER̲LOST, SERVER̲PROMOTED, SERVER̲DEMOTEDが予約されているが、Pythonで直書き

構成の検出 ⾃動 ⼿動で登録

サーバーの追加, 削除 コンフィグ編集, 再起動 mysqlfabricコマンド

17/73

Page 19: MHAの次を目指す mikasafabric for MySQL

切り替わりの処理(主にIPのつけかえ)

MHA for MySQLは master_ip_failover_script に切り替わりの処理を書く

VIPの付け替えだったり、DNSの更新だったり-read_only の設定変更だったり、新しいレプリケーションユーザーを作ったりの処理もここに書くことができる

-

MySQL Fabricは切り替わりはコネクターが吸収するバッキングストアに持っているマスター/スレーブの状態を更新し、-ファブリック対応コネクターが次にHAグループ情報を参照してきた時にコネクター側に反映される

-

MySQL RouterもFabric対応コネクターと⾒做せる-デフォルトのTTLは1秒-

18/73

Page 20: MHAの次を目指す mikasafabric for MySQL

MHA for MySQLとの⽐較

MHA for MySQL MySQL Fabric

マネージャプロセス masterha̲manager mysqlfabric

マネージャの状態確認 ログのみ mysqlfabricコマンド (デーモンと同じコマンド)

エージェント ライブラリ なし

切り替わり時のリカバリー ⼀番進んでいるスレーブのリレーログから(via SSH)

なし

切り替わりの処理 master̲ip̲failover̲script ファブリック対応コネクター依存

処理フック master̲ip̲failover̲script, secondary̲check̲script, shutdown̲script, report̲script

SERVER̲LOST, SERVER̲PROMOTED, SERVER̲DEMOTEDが予約されているが、Pythonで直書き

構成の検出 ⾃動 ⼿動で登録

サーバーの追加, 削除 コンフィグ編集, 再起動 mysqlfabricコマンド

19/73

Page 21: MHAの次を目指す mikasafabric for MySQL

処理フック

MHA for MySQLはいい感じのところにフックがあり、それぞれ⾃分の好きなスクリプトで書けば良いこれにより、応答がなくなった旧マスターをOSごとシャットダウンする、という荒業も可能に

-

MySQL Fabricもイベントトリガーは予約されているものの、設定ファイルではどうにもならない更に、SSHも利⽤できるMHAに対してMySQL FabricはSSHのセットアップを要求しないので、出来ることは限られている

-

とはいえ単にスクリプトを叩くようにイベントを書けばいいはず-

20/73

Page 22: MHAの次を目指す mikasafabric for MySQL

MHA for MySQLとの⽐較

MHA for MySQL MySQL Fabric

マネージャプロセス masterha̲manager mysqlfabric

マネージャの状態確認 ログのみ mysqlfabricコマンド (デーモンと同じコマンド)

エージェント ライブラリ なし

切り替わり時のリカバリー ⼀番進んでいるスレーブのリレーログから(via SSH)

なし

切り替わりの処理 master̲ip̲failover̲script ファブリック対応コネクター依存

処理フック master̲ip̲failover̲script, secondary̲check̲script, shutdown̲script, report̲script

SERVER̲LOST, SERVER̲PROMOTED, SERVER̲DEMOTEDが予約されているが、Pythonで直書き

構成の検出 ⾃動 ⼿動で登録

サーバーの追加, 削除 コンフィグ編集, 再起動 mysqlfabricコマンド

21/73

Page 23: MHAの次を目指す mikasafabric for MySQL

構成の検出

MHA for MySQLは管理対象のIP, portをコンフィグから読み取り、実際にどのMySQLがマスターになっているかは⾃動で検出するMySQL Fabricはバッキングストアの情報を正として、実態はチェックしない再起動には強い-バッキングストアの内容と実態がズレると地獄が⾒える-既存のレプリケーション環境に導⼊しようと思うとちょっとだけコツが必要

-

22/73

Page 24: MHAの次を目指す mikasafabric for MySQL

MHA for MySQLとの⽐較

MHA for MySQL MySQL Fabric

マネージャプロセス masterha̲manager mysqlfabric

マネージャの状態確認 ログのみ mysqlfabricコマンド (デーモンと同じコマンド)

エージェント ライブラリ なし

切り替わり時のリカバリー ⼀番進んでいるスレーブのリレーログから(via SSH)

なし

切り替わりの処理 master̲ip̲failover̲script ファブリック対応コネクター依存

処理フック master̲ip̲failover̲script, secondary̲check̲script, shutdown̲script, report̲script

SERVER̲LOST, SERVER̲PROMOTED, SERVER̲DEMOTEDが予約されているが、Pythonで直書き

構成の検出 ⾃動 ⼿動で登録

サーバーの追加, 削除 コンフィグ編集, 再起動 mysqlfabricコマンド

23/73

Page 25: MHAの次を目指す mikasafabric for MySQL

サーバーの追加, 削除

MHA for MySQLは追加, 削除時にコンフィグの再読み込みが必要MySQL Fabricは mysqlfabric group add, mysqlfabric group remove コマンドで動的に追加, 削除どちらにせよこれらマネージャプロセスは単⼀障害点ではないので、再起動でもオンラインでもそれほど違いはない

-

24/73

Page 26: MHAの次を目指す mikasafabric for MySQL

ここまでのまとめ

MySQL FabricはMHA for MySQLのようにMySQLの⾃動/⼿動フェイルオーバーをサポートするためのプロダクトMySQL Fabricは状態をバッキングストアに保管し、APIを提供するウェブアプリケーションライクなつくり良くも悪くも-

MHAは非同期レプリケーションしかない時代に開発されたもののため、リレーログから差分をリカバリーする機能がついている

MySQL 5.7とそれ以降でサポートされた複数台の準同期レプリケーションを利⽤すればリカバリーは不要になった

-

25/73

Page 27: MHAの次を目指す mikasafabric for MySQL

興味が湧いてきましたか︖[はい/Yes]

26/73

Page 28: MHAの次を目指す mikasafabric for MySQL

2016年現在のMySQL FabricのGAバージョン

27/73

Page 29: MHAの次を目指す mikasafabric for MySQL

存在しない

28/73

Page 30: MHAの次を目指す mikasafabric for MySQL

MySQL Fabricのパッケージング

MySQL Fabric 1.4MySQL Utilities 1.4に同梱

MySQL Fabric 1.5MySQL Utilities 1.5に同梱

MySQL Fabric 1.6MySQL Fabric 1.6としてリリースされる 予定

29/73

Page 31: MHAの次を目指す mikasafabric for MySQL

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

Page 32: MHAの次を目指す mikasafabric for MySQL

MySQL Fabric 1.6はどこにもない

以前はLab版があったが2016/11/05現在Labにも存在しない

http://dev.mysql.com/downloads/fabric/

31/73

Page 33: MHAの次を目指す mikasafabric for MySQL

追い打ち

http://www.slideshare.net/mattalord/mysql-high-availability-innodb-clusters

32/73

Page 34: MHAの次を目指す mikasafabric for MySQL

今までMySQL FabricがいたところにMySQL Shell

ガイル33/73

Page 35: MHAの次を目指す mikasafabric for MySQL

あっ(察し

34/73

Page 36: MHAの次を目指す mikasafabric for MySQL

先が無いことを⾒抜くのは難しい (c)matsunobu

「先が無い」とは誰も⾔ってくれない

興味の無いものに対してわざわざ情報発信してベンダー

に喧嘩を売る動機は無い

..

先が無い技術を選んで⼀番痛い目を⾒るのはその採⽤企

業とエンジニア

http://www.slideshare.net/matsunobu/ss-28303485/31

35/73

Page 37: MHAの次を目指す mikasafabric for MySQL

諦めますか︖ [No/否]

36/73

Page 38: MHAの次を目指す mikasafabric for MySQL

というよりは最初から諦めていた

MySQL FabricつらいMySQL Fabricつらい Advent Calendar 2014MySQL Fabric&Routerつらくない Advent Calendar 2015MySQL Fabricでぼっこぼこにされたはなし

37/73

Page 39: MHAの次を目指す mikasafabric for MySQL

これなんかひどい

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

Page 40: MHAの次を目指す mikasafabric for MySQL

これもひどい

status compares (not equal) with string ʻFAULTYʼ

but status has integer datatype.

mysql> SELECT server_uuid, group_id, server_address, mode, status, weight FROM servers WHERE group_id LIKE '%%' AND group_id IS NOT NULL AND status != 'FAULTY' ORDER BY group_id, server_address, 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

Page 41: MHAの次を目指す mikasafabric for MySQL

作ったやつ出てこい

もともと何故誰も⽂句を⾔わないのか不思議なレベルの品質パッチを送っても放置ついにはバグレポートがトリアージすらされなくなった使ってないソフトウェアに⽂句を⾔う⼈はいない

40/73

Page 42: MHAの次を目指す mikasafabric for MySQL

だいぶ考えたこと

MHA for MySQLは流⾏っているとはいえ⾃分で使うのに⾜りない機能があって

relay_log_info_repository= TABLE の場合起動できないMHA for MySQL⾃体を監視する⼿段が微妙あんまりメンテナンスされてる気配がない

-

MySQL Fabricだって考え⽅⾃体は間違っていなかったはずだ死活監視とマスター切り替えを備えたフレームワークという⽅向性-死活監視がちょっとイケてなくて、エラーハンドルがイケてなくて、補助機能が貧弱すぎて、ログ機構が極悪なだけ

-

シャーディングのことは忘れることにする-

41/73

Page 43: MHAの次を目指す mikasafabric for MySQL

オレオレパッチしたことある⼈︖

42/73

Page 44: MHAの次を目指す mikasafabric for MySQL

オレオレパッチのソフトウェアを 運⽤ したことある

⼈︖43/73

Page 45: MHAの次を目指す mikasafabric for MySQL

つらい[はい/Yes]

44/73

Page 46: MHAの次を目指す mikasafabric for MySQL

オレオレパッチの 運⽤

メインラインのバージョン固定してパッチしてビルドしてはいおしまい、なら楽

ex. mysql コマンドラインクライアント, mysqldump なんかはバージョンアップしたところでそんなに機能が変わらないから、バージョンを固定してビルドするのは⼗分現実的

-

メインラインが⽣きていて新機能が追加され続ける場合、追従しないといけないメインラインが別の実装で同じ機能を作ったり-非互換のAPI変更があったり-テスト書くのつらい-

45/73

Page 47: MHAの次を目指す mikasafabric for MySQL

半年くらい悩んだ結果

あまりにもつらかったので、おとなしくフォークして⾃

前でパッチを当てることにしました。フォークするつい

でに名前を変えたのが mikasafabric for MySQLになり

ます。

期待通りに使えるMySQL Fabricを目指した結果なの

で、まあまあ期待通りに動きます

mikasafabric for MySQLをオープンソースライセンスで公開しました | GMOメディア エンジニアブログ

46/73

Page 48: MHAの次を目指す mikasafabric for MySQL

悩んだ経緯

というか、 “Support MySQL 5.7” と銘打たれたコミッ

トがひどすぎて、テストすら通らない(何故マージされ

たし)

という訳でまずテストを直すPRした。これがマージさ

れれば Issue #109のやつも頑張るかも知れない。これ

がマージされないようなら、 innotop は死んだんであ

ろう(というか、死んだと思ってForkしてゴニョったや

つをrpmbuildしたらテストが通らないのに気が付い

た。。)

⽇々の覚書: innotopが最近息してないなーと思ったんだ

47/73

Page 49: MHAの次を目指す mikasafabric for MySQL

MySQLエコシステムの中⾝

中⾝を⾒たことのある⼈いますか︖innotop (Perl)-PMP for Cactiの ss̲get̲mysql̲stats.php (PHP)-MHA for MySQL (Perl)-

どれも同じなのは、「⼈間がやるべき⾯倒くさい処理を、泥臭く丁寧(︖)に実装してある」

48/73

Page 50: MHAの次を目指す mikasafabric for MySQL

innotopの⼀件で感じたこと

かっこよくなくてもいい誰もやりたくない泥臭いことを、丁寧に⾃分で使いたい範囲のFixなら何とかなる⾃分が使うために作ったものが誰かの役に⽴つこともある-

49/73

Page 51: MHAの次を目指す mikasafabric for MySQL

脱線しました

50/73

Page 52: MHAの次を目指す mikasafabric for MySQL

mikasafabric for MySQL #とは

⾼可⽤性(High Availability)障害探知と昇格-データベースリクエストのアクセス先の選択-

シャーディング – スケールアウト今のところMySQL Fabricの機能に⼿を⼊れてない-MySQL Fabricもともとのシャーディング機能が何故かグループレプリケーションを要求するようになっていたので、ここは完全にサポート外

-

MySQL Fabric – コネクタとの連携プロキシ不要の構成-MySQL Routerとの組み合わせに特化-他のファブリック対応コネクターとも動くはずだけど未検証-

51/73

Page 53: MHAの次を目指す mikasafabric for MySQL

mikasafabric for MySQL

MySQL 5.7の新機能も積極的に使うoffline_mode を使ってコネクションプールとの相性を改善

0.4.0現在、ファームはMySQL 5.7.5以上必須-

Multi-Source Replication環境下でもファームに組み込めるように改善

-

既存のバグのFIXprune_log, prune_error_log イベントのバグのせいでいつまでも消えないログテーブル

-

レプリケーションスレッドのエラーでスレーブを SPARE ステートに切り離し

-

“ちょっと便利な” 機能event_schedular がオフだとワーニングメッセージ-レプリケーションユーザーの⾃動作成-ログテーブルへの出⼒をコンフィグで設定- 52/73

Page 54: MHAの次を目指す mikasafabric for MySQL

MySQL Fabric(mikasafabric) + MySQL Routerの動作

Master Slave

mysqlfabric

Monitor/Demote

Monitor/Promote

AP

AP

mysqlrouter127.0.0.1:3306

AP

AP

mysqlrouter127.0.0.1:3306

Lookup Group QueryRouting(NAT)

Routing(NAT)

53/73

Page 55: MHAの次を目指す mikasafabric for MySQL

名前解決ベースのHAに近い

MySQL Router(またはFabric-awareコネクター)がリゾルバーMySQL RouterはTTLが切れるたびにMySQL Fabricに経路情報を問い合わせ

TTL期間内はMySQL Router内のルーティングキャッシュを使って経路解決

-

TTL期間後でもMySQL Fabricへの経路情報の問い合わせに失敗したらルーティングキャッシュを使い続ける

-

54/73

Page 56: MHAの次を目指す mikasafabric for MySQL

MySQL Router

MySQL Routerは全てのパケットを⼀度NATするもしアプリケーションから⾒てlocalhost以外に置くなら、MySQLアカウントの接続元はMySQL RouterのIPアドレスにしないといけない

-

遅延は数⼗us単位-⼀度NATしている関係上、エラーパケットを捕捉して特定のエラーコードなら切断するとかいうパッチもしてみた(動いた)

-

パスワードをiniファイルに書くと起動できない、書かないとプロンプトを出そうとするのがダメなところ(パッチでしのいでる)

-

mikasafabricでマスター昇格コマンドを叩くと2〜3秒で切り替わる

TTLは1(mikasafabric側の設定)-フェイルオーバーの場合、mikasafabricがファームのダウンを検知するまでに6秒くらいなので合わせて10秒ちょい(のはず)

-

55/73

Page 57: MHAの次を目指す mikasafabric for MySQL

MySQL Fabric

レプリケーションのマスター/スレーブの組を “グループ” と呼んで管理サーバー(mysqld)は server_uuid ごとに識別される

4つのステータス。PRIMARY, SECONDARY, SPARE, FAULTY-

56/73

Page 58: MHAの次を目指す mikasafabric for MySQL

サーバーごとのステータス

PRIMARY SECONDARY SPARE FAULTY

read-write Yes No No No

read-only No Yes No No

read-only & allow̲primary̲reads

Yes Yes No No

フェイルオーバー候補

- Yes No No

フェイルオーバー時のマスター追従

(Yes) Yes Yes No

死活監視 Yes Yes Yes No

MySQL Routerから⾒た時で、他のコネクターは違うかも知れない

57/73

Page 59: MHAの次を目指す mikasafabric for MySQL

mysqlrouter.ini

[fabric_cache:hogehoge]address = 172.17.3.202user = mysqlrouter#password = router_password

[routing:master]bind_address= 0.0.0.0:13306mode = read-writedestinations= fabric+cache://hogehoge/group/myfabric

[routing:slave_only]bind_address= 0.0.0.0:23306mode = read-onlydestinations= fabric+cache://hogehoge/group/myfabric

[routing:all_wrr]bind_address= 0.0.0.0:33306mode = read-onlydestinations= fabric+cache://hogehoge/group/myfabric&allow_primary_reads=yes

58/73

Page 60: MHAの次を目指す mikasafabric for MySQL

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

Page 61: MHAの次を目指す mikasafabric for MySQL

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

Page 62: MHAの次を目指す mikasafabric for MySQL

MySQL Router

mysqlrouter のプロセスと「マスターへのルーティング」「スレーブへのルーティング」が別のポートでLISTENされる「どっちにルーティングするためにどっちのポートを叩くか」はMySQL Routerは判断してくれない⼀応MySQL Routerのルーティングはプラグイン⽅式なので、将来に期待

-

mysqlrouter は全てのパケットをシングルスレッドでNATするので、レイテンシーは10us未満なのでそんなに⼼配はしなくて良さげa. 300並列(Not 同時接続)とかは mysqlrouter がサチるb. やろうと思えばクエリーの中⾝も覗けるc.

61/73

Page 63: MHAの次を目指す mikasafabric for MySQL

ステータス変更

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

Page 64: MHAの次を目指す mikasafabric for MySQL

mikasafabric for MySQLの死活監視

変更後ステータス mikasafabric特有

MySQL接続失敗(サーバーダウン含む)

FAULTY No

SHOW SLAVE STATUSでスレッドが⽌まってる

SPARE Yes

オフラインモードON FAULTY Yes

63/73

Page 65: MHAの次を目指す mikasafabric for MySQL

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 = 0candidate以外のスレーブと旧マスターに対して STOP SLAVE, CHANGE MASTER TO旧マスターに対して SET GLOBAL offline_mode = 0 (mikasafabric特有)

64/73

Page 66: MHAの次を目指す mikasafabric for MySQL

オフラインモード (from MySQL 5.7.5)

MySQL :: MySQL 5.7 Reference Manual :: 6.1.4 Server System VariablesSET GLOBAL offline_mode= 1 で有効化オフラインモードだと、Super̲privを持っていないユーザーは接続できないSuper̲privを持っていないユーザーのセッションは、現在のクエリーが終了次第コネクションを切断されるこれで、コネクションプールのスレッドたちを⼀度強制的に切り離せる

-

⽇々の覚書: MySQL 5.7.5のオフラインモードはgraceful shutdownの夢を⾒るか

65/73

Page 67: MHAの次を目指す mikasafabric for MySQL

DEMO

しかしじかんがたりない︕︕

66/73

Page 68: MHAの次を目指す mikasafabric for MySQL

InnoDB Clusterとの接点

http://www.slideshare.net/mattalord/mysql-high-availability-innodb-clusters

67/73

Page 69: MHAの次を目指す mikasafabric for MySQL

InnoDB Cluster

グループレプリケーション(5.7.15-preview) をメインに置いたHA構成MySQL Router(2.1.0-preview) のMetadata CacheプラグインとMySQL Fabric Cacheプラグインは非常に似たつくり

HA情報の問い合わせ先が違うだけ。-どちらもMySQL Routerから⾒ると CALL でストアドファンクションを呼び出す

-

68/73

Page 70: MHAの次を目指す mikasafabric for MySQL

MySQL Fabirc vs InnoDB Cluster

MySQL Fabric InnoDB Cluster

同期⽅式 非同期レプリケーション 同期グループコミュニケーション

死活監視 mysqlfabricデーモン 多分メンバー同⼠のグループコミュニケーション

状態の操作 mysqlfabricコマンド MySQL Shell

69/73

Page 71: MHAの次を目指す mikasafabric for MySQL

非同期ベース, 同期ベースでユースケースは分かれていく(かも)

70/73

Page 72: MHAの次を目指す mikasafabric for MySQL

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

Page 73: MHAの次を目指す mikasafabric for MySQL

mikasafabric for MySQL をよろしくお願いしま

す :)72/73

Page 74: MHAの次を目指す mikasafabric for MySQL

Questions and/or

Suggestions?73/73