IT・ビッグデータ徒然ブログ

関西でインフラ、データ基盤系のエンジニアになりたい

分散システムを知らない人がRaftを理解するまで(分散システムとはから合意アルゴリズムの解説まで)

個人的に2〜3年まえくらいからHadoopを触るきっかけがあり、
そこからHadoopに限らず分散システムという仕組みにすごく興味があります。

その中で今回はRaftというアルゴリズムについて勉強しているので、それをまとめようとブログに手を伸ばしました。
せっかくなのでそもそも分散システムってなんやねん!ってところから自分なりにさくっとまとめてみます。

どちらかとざっくり解説なので、詳細を知りたい方は一番後ろにある参考文献を参照ください。

Raftとは

分散システム上における合意アルゴリズムである。
etcd, Counsil等で実装されている。

ここでキーワードとなるのが、

  • 分散システムとは?
  • 合意とは?

になります。

分散システムとは

複数の計算機をネットワーク上で相互接続、結合させて、協調動作をさせることでパフォーマンスの向上と耐障害性を確保させるシステムです。

もう少し簡単に言えば、複数のサーバを1つの大きなサーバと見立てて処理を行うものだと思っていただければわかりやすいと思います。

分散システムのメリットは

主に上に上げた、

  • パフォーマンスの向上
  • 耐障害性の確保

が主なメリットになります。

パフォーマンスの向上

例えばある1台のサーバ上で100万件のデータ処理をした場合、その処理時間が1分だとします。
ですが、もう一台の同スペックのサーバを用意して、2台のサーバ上で100万件のデータを2分割(50万件ずつ)処理させたとしましょう。

単純計算ですが、結果は30秒になるのではないでしょうか。 またこれを3台、4台、・・・10台、更にそれ以上と多くのサーバを用意すればその分各サーバが処理する件数が大幅に削減され、結果的に処理にかかる時間を短縮させることができます。

このように1台だとはるかな時間がかかってしまうような処理でも、
サーバを増設することでパフォーマンスを向上させることができます。

ちなみに、
そんなことしなくてもいいスペックのサーバ買えばいいじゃん
と思われた方。

ご名答です。

複数サーバを束ねなくたって、1台のサーバのスペックを上げる方法もあります。
(前者のやり方をスケールアウト、後者のやり方をスケールアップと呼ばれることもあります)

また分散システムでは各サーバ間でのネットワーク通信が大量に発生するため、 オーバーヘッドが1台に比べると大幅に増加します。
そのため、サーバ1台で1分かかる処理が2台に分散させると30秒になるなんてことはなく、
かなり多くのサーバを使ってやっと効果的になるレベルです。

ただしスケールアップ戦略には以下の問題もあります。

  • スペックの見積もりが甘いとサーバを購入しなおしになる危険性
  • サーバを買い替えた場合、既存のサーバをそのシステム上では活用できない
  • 耐障害性に対応できない

耐障害性の確保

スケールアップ戦略の問題として上げている耐障害性もカバーしているのが、分散システムの特徴です。

耐障害性とは、サーバが故障したとしても処理を継続できることと定義しておきます。
例えば1台のサーバでなんらかの処理をしている場合に、そのサーバが故障してしまったらその処理を継続することは不可能になります。

ですが、分散システムでは複数台でデータをレプリケーションさせたり、
処理を実行することによって例えサーバが故障したとしてもクライアント側はそれを認識することなく使用することができます。

分散システムの課題

ここまで分散システムの良い面を取り上げてきましたが、
ここからは分散システムの課題を取り上げていきます。

分散システムにおける課題としては、

  • 故障したことを確実に検知する
  • 各サーバ間における整合性の保障(合意)

があります。

故障したことを確実に検知する

上に述べたように分散システム上では耐障害性を確保できると話しました。
ですが、とりあえず分散システムを組んだだけでは耐障害性を確保することはできません。
分散システム上ではサーバが故障することを前提として議論を進めていくケースが一般的です。(故障モデル)

ここで注意すべき点は死人に口無し、つまり死んだサーバは自分が死んだことを分散システム上で伝えられない点にあります。
そのためハートビートやらで分散システム全体が各サーバを監視するなどして各サーバの生死を確認する必要があります。

整合性の保障

もう一つの課題は整合性です。
分散システムは複数のサーバを結合させてあたかも一つのシステムのように動作することが前提の仕組みです。
そのため、ここのサーバ間での整合性が担保できないとシステムが一気に狂ってきます。

例えば、5台のサーバで分散システムを構築しているとしましょう。
そして分散システム上で以下の変数が定義されているとします。

x = 5;
y = 10;

ある1台のサーバが

x = 20;

と再定義し、この値をすべてのサーバに知らせるとします。
ですが、その際に一時的に一つのサーバのネットワークが分断されたとします。 そうするとそのサーバ上では値が更新されず、結果的に不整合が発生します。
このように故障モデルでは不整合となりうるケースが多く存在します。

そこで大事になってくるのは、合意という考え方です。

合意問題とは

あるプロセスについて、すべてのサーバにおいて同じ値(合意値)をもつこと。

具体例は先に述べたとおりですが、分散システムにおいてこの合意をとることがかなり重要なポジションであることはここまでおわかりいただけたのではないでしょうか。

改めてRaftについて

分散システム上における合意アルゴリズムである。
etcd, Counsil等で実装されている。 Paxosに理解可能性を高めたアルゴリズムである。

Paxosとは

また書きます。

分散処理システム (情報工学レクチャーシリーズ)

分散アルゴリズム

www.slideshare.net

www.slideshare.net

www.slideshare.net