Orchestrator
orchestrator は マスターの障害検知およびレプリカのマスター昇格(フェイルオーバー)を自動で行うソフトウェアです。 MySQLのマスター昇格といえば、MHAがデファクトスタンダードでしたが、MHAはメンテナンスモードになって久しい・・・ということで、最近は orchestrator が使われることが多い印象です。メルカリさんで使われたりしているようです。
アンチ フラッピング機構 RecoveryPeriodBlockSeconds
orchestrator にはアンチフラピング機構が備わってます。orchestratorにおける、フラッピングとは、フェイルオーバーが繰り返し短時間に発生する状況を指します。
障害が短期間に連続して発生する状況は、何か予期せぬ事態が起きている可能性が高いです。このような状況では、ヘタに自動的にフェイルオーバーするよりは、人間がしっかりと状況を確認し、対応するほうが好ましいでしょう。
orchestrator では一度、リカバリ(レプリカのマスター昇格)を実行したら、RecoveryPeriodBlockSeconds
で指定した期間(秒)経過するまで、リカバリが発動しないように制御されています。
orchestrator avoid flapping (cascading failures causing continuous outage and elimination of resources) by introducing a block period, where on any given cluster, orchesrartor will not kick in automated recovery on an interval smaller than said period, unless cleared to do so by a human. https://github.com/openark/orchestrator/blob/master/docs/topology-recovery.md
FailureDetectionPeriodBlockMinutes
もう1つ似たようなパラメータとして、FailureDetectionPeriodBlockMinutes
があります。
障害を検知したら、FailureDetectionPeriodBlockMinutes
で指定した期間(分)、障害の検知を行いません*1。
障害検知が行われなければ、リカバリも行われないので、「RecoveryPeriodBlockSeconds
と同じやん・・・*2」と思いましたが、以下の記述で納得できました。
Detection does not always lead to recovery. There are scenarios where a recovery is undesired: https://github.com/openark/orchestrator/blob/master/docs/failure-detection.md
orchestrator では、障害の検知(FailureDetection)= リカバリ(マスター昇格)発動 とは限りません。
orchestrator は 障害検知からマスター昇格完了までの各ポイントで、任意のスクリプトを実行するためのHookが設けられています。
PreFailoverProcesses
で指定したスクリプトで、エラーを返すことで、リカバリの発動を止めることができます。
フェイルオーバーに関する Hook)
* OnFailureDetectionProcesses * 障害検知時 * PreFailoverProcesses * フェイルオーバー発動前 * PostMasterFailoverProcesses * マスターのフェイルオーバー後 * PostFailoverProcesses * レプリカも含めて、全てのフェイルオーバーが完了したタイミング
--
FailureDetectionPeriodBlockMinutes
の説明には、anti-spam mechanism
と書いてあります。
これは、OnFailureDetectionProcesses
フックで、障害通知を行っているようなケースを想定して、「アンチスパム」と表現しているのでしょう。
FailureDetectionPeriodBlockMinutes is an anti-spam mechanism that blocks orchestrator from notifying the same detection again and again and again.
まとめ
RecoveryPeriodBlockSeconds
は短期間にフェイルオーバーが連続発生しないようにするためのパラメータ- 障害の検知(FailureDetection)= リカバリ(マスター昇格)発動 とは限らない
FailureDetectionPeriodBlockMinutes
は 障害継続時 にOnFailureDetectionProcesses
で指定したスクリプトを実行する間隔
僕が本当に知りたかったこと
ごく短時間のダウンではフェイルオーバーを発動させたくないんだが、Hookで作り込むしかないんだろうか(誰か教えてください)
*1:チェックする間隔はまた別のパラメータなので注意
*2:スマートスタイルの記事でも、FailureDetectionPeriodBlockMinutes がフラッピング対策と説明されているので、同じように考えてしまう人は多そう http://blog.s-style.co.jp/2018/11/2875/