3重化システムは2重化冗長より稼働率が低くなることがある


概要

zookeeperなどの3重化システムの稼働率を計算すると、2重化冗長より悪くなることがあります。
その理由を解説いたします。

前置き

Kafka(Confluent)を取り扱うようになりました。
KafkaやHadoopで利用されているzookeeperの冗長は3重化ですよって言うと、最近は2重化ではシステム停止になることがから3重化でより稼働率を上げるのが普通なのですねって言われました。でも、実はzookeeperなどえ利用されている3重化システムの稼働率は、2重化より悪くなるんです。そして、その理由などを納得していただくことは非常に難しかったので、3重化について詳しく解説したいと思います。

3重化の考え方

3重化されたzookeeperの障害時の動作について

3重化されたzookeeperは、障害時に以下のような動作をします。

稼働中サーバ 故障中サーバ サービス影響
3台 0台 正常運用
2台 1台 運用継続(縮退運用)
1台 2台 運用停止(復旧停止)
0台 3台 全停止

注意すべきは、2台故障時に運用が止まることです。

稼働率の計算

分かりやすく比べるために、稼働率0.9のサーバで2重化と3重化の状態を以下の通り記しました。

  • 2重化の場合
サーバA サーバB この状態になる確率
正常 正常 $0.9\times 0.9=0.81$
正常 故障 $0.9\times (1-0.9)=0.9$
故障 正常 $(1-0.9)\times 0.9=0.9$
故障 故障 $(1-0.9)\times (1-0.9)=0.01$

システム稼働率は、①+②+③=0.99
計算式: $ (1-x)^2 $

  • 3重化の場合
サーバA サーバB サーバC この状態になる確率
正常 正常 正常 $0.9\times 0.9\times 0.9=0.729$
正常 正常 故障 $0.9\times 0.9\times (1-0.9)=0.081$
正常 故障 正常 $0.9\times (1-0.9)\times 0.9=0.081$
故障 正常 正常 $(1-0.9)\times 0.9\times 0.9=0.081$
正常 故障 故障 $0.9\times (1-0.9)\times (1-0.9)=0.009$
故障 正常 故障 $(1-0.9) \times 0.9 \times (1-0.9)=0.009$
故障 故障 正常 $(1-0.9)\times (1-0.9)\times 0.9=0.009$
故障 故障 故障 $(1-0.9) \times (1-0.9) \times (1-0.9)=0.001$

zookeeperの場合、2台正常でなければならないので、①~④が稼働中のため
稼働率は ①+②+③+④ = 0.972
計算式: $ x^3 + 3(1-x)x^2 = (3-2x)x^2 $

稼働率の比較

上記の通り2重化では99%の稼働率があるのに3重化すると97.2%に下がることが分かります。
この通り、必ずしも3重化システムが稼働率が高くならないこなります。
(注意)
3重化システムでも、全てが1台でも正常であれば稼働中となれば、稼働率は99.9%となり2重化より高いくなります。

3重化システムの目的

zookeeperの場合、HadoopやKafkaなどから現状を常に更新しており常に正しいデータを保持しており
正しいデータがあれば、それほど苦にならず復旧を行うことができますが、データ破損するとシステム復旧が困難になるだけではなく
大事な顧客のデータなどが消失してしまいます。
困難な復旧作業になるぐらいなら、1時的にシステムを止めて復旧を楽にする考えがあるので、2台故障時はデータ保護(動作を止めてデータの更新をさせなくする)ことでより大きな障害になることを防いでいるのです。
これは、万が一の障害時が起きても2次被害3次被害を出さないため最善の策です。

まとめ

3重化システムの場合の2台故障を稼働中とすると2重化冗長より稼働率が悪くなります。
ただし、3重化は2次被害、3次被害を起こさせず正常リカバリ化するための必要な方法です。

(補足)
全ての3重化システムがこの稼働率計算に当てはまるわけではありません。必ず、2台故障時の動作を確認するようにお願いします。