概要
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台故障時の動作を確認するようにお願いします。