mita2 database life

主にMySQLに関するメモです

MySQL Orchestrator RecoveryPeriodBlockSeconds と FailureDetectionPeriodBlockMinutes の違い

Orchestrator

orchestrator は マスターの障害検知およびレプリカのマスター昇格(フェイルオーバー)を自動で行うソフトウェアです。 MySQLのマスター昇格といえば、MHAがデファクトスタンダードでしたが、MHAはメンテナンスモードになって久しい・・・ということで、最近は orchestrator が使われることが多い印象です。メルカリさんで使われたりしているようです。

github.com

アンチ フラッピング機構 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/