Tech Blog
Raftって
Raftって
Raftってご存じですか? 突然ですが「Raft」ってご存じですか?ちょっと似ていますが、注目されている開発言語のRustことではありません。
訳すと「いかだ(筏)」ですね・・・ なぜ筏なのかは置いときまして、このRaftというアルゴリズムは、Kubernetesを構成する仕組みの、「etcd」中で使われており、中身を理解していくとなるほど!と感心してしまう仕組みと筆者は思っています。ですので、今日は、Kubernetesを理解する上での必要な「etcd」の中で使われている「Raft(アルゴリズム)」についてのちょっと記事としたいと思います。
この「Raft」の仕組み、簡単に説明しますと、kubernetesオブジェクトの状態や、設定などを保存するキーバリューストア型のデータベースとして、使われております。これだけだとなんだか、なぜこのアルゴリズムが使われるのか、よくわからないと思いますのでチョー簡単にかみくだきますと、「データをシステム分散して保存できて、分散したデータの整合性が取れない限り、情報を取得できない仕組み」です。(・・・と筆者は理解している)
活用方法として例えば、単一のシステムではなく、他拠点やサーバーが分離され、分散された各システムで、最終の保存情報もしくは、正しい更新の順番で保存されている整合性のとれた設定データを扱いたくなる要件が出てくると思います。Kubernetesを扱ってくると必ず課題となる部分と思います。(※設定データを確実に反映させたいとか、通信の向き先情報を誤りの無いように制御したいとか)
単一のシステムであれば、コードの中でセマフォや排他制御を使用することで解決できるかもしれませんが、システムが分散して動作する場合や、様々なシステムが非同期で動作している場合、システム間で、共通の情報を共有しなければならないときで、かつ、データを保存している場所が障害などで停止していても冗長化させて、情報を安全に取得・保存したい、で情報が正しくない場合(例えば古い場合や同期されていない情報)、情報は問題ないデータと確認できるまでは、誤った情報を取得できないようにきっとその様に実装したくなると思います。
上記の要件を満たす仕組みを1から作成しようとしますと、様々な例外処理に対応しなければならないなどの堂々巡りになってしまう可能性が大ですので「Raft」の仕組みを活用する事ですっきり簡単に解決できるというのがあると筆者は考えています。
実際に筆者もGo言語で「etcd」のソースの中に「Raft」のコードがありますので実際に実験してみましたが「etcd」のraftのサンプル(※にURL記載)は、ちょっと使いにくい&理解しにくく、etcdのコードを元にしているライブラリがありましたので、haj13/raft(※にURL記載)をつかわれる方が理解を深めるにはいいかと思います。 このブログではコードをアップはしませんが実験の雰囲気を感じていただきたいと思い実験の参考画像を添付したいと思います。実際のこのRaftの仕組みを応用した分散型のDBもOSSとしてリリースされてきておりますので、当社でも、この仕組みを応用した情報を分散させるシステムに応用していければと考えております。
▼実験イメージ
クオリティソフトでは、このブログ記事のような先進的な仕組みを取り入れて、クラウドサービスをリリースしていきたいと考えており、ちょっと堅苦しい記事になっておりますが、そういった技術を楽しみながら、まじめに取り組んでいますので、その取り組みについて記事とさせていただきました。
【付録】
ちなみに「Raft」は、Reliable(信頼性), Replicated(複製性), Redundant(冗長性), And Fault-Tolerant(耐障害性)から名付けられたようです。
※Raftアルゴリズムについては、詳しくは論文を参照いただければと思います。https://raft.github.io/raft.pdf
※実際にGo言語で書かれているサンプルがありますので実際の動きを見たい方は、こちらのURLを参照してみてください。
https://github.com/etcd-io/etcd/tree/main/contrib/raftexample
こちらで理解できないようであればhttps://github.com/shaj13/raftを参考にされるのがいいかと思います。
Hassy