理系学生日記

おまえはいつまで学生気分なのか

なぜぼくがConsulに心奪われるのか

ちょっと来週の中央線 Meetup で発表する Consul の資料をつくっているんだけど、つくっていたらすごい興奮してきて異常に興奮してきて、 いややっぱり Consul ってスゴいんすよみたいな熱い気持ちを吐露したくなったので発表資料まだぜんぜん作ってないんですけどここに発露します。

いつもは結構確認しながらエントリかくんですけど今日は一気に短時間でガーって書いたのでまちがいとかたくさんあると思いますけどごめんね。

かつて思い描いていた分散システムの未来

なにがすごいかって、やっぱり自律分散的なところで Gossiping と Raft を使って整合性のある情報共有ができるようになっているっていうところがすごいと思うんですよ。 むかしから情報共有に関する研究されてたし、ぼくも足をつっこんではいたんですけど、実際に使いやすいプロダクトとして実現されたらやっぱりオォ〜〜ってなるじゃないですか。いまさらだけどさ。

いやべつに Raft 使えば整合性のある情報共有は可能なんだけど、そうなるとなかなかスケールしないみたいなんですよね。Raft 結構めんどいから。

そしたら Consul は Raft の Peer は 1 クラスタあたり 3 台とか 5 台にして、あと数千とか数万台のノードは Gossiping (SWIM) しとけば良いですよっていうアーキテクチャを採用してきた。 そういうノードは、とりあえず自ノードと自ノード上で動くサービスを監視してその結果を Gossiping しとけば良くて、その結果を Anti-Entropy として Consul Server (Raft の Peer) に同期しておけば、あとは Consul Server が Raft でよろしくやってくれる。

f:id:kiririmode:20180729000308p:plain

これでなんか、情報共有できるじゃん。Raft で選出された Leader が倒れても、情報は他の Raft Peer にレプリケーションされてるから SPoF ないし。 やっぱり分散システムで SPoF ないっていうところにこだわってるのすごい良いなと思います。

SWIM は SWIM ですごいきれいで、こういうタイプの情報伝搬システムってどうしてもコミュニケーションの負荷がでかくなりがちなんだけど、その問題をいいかんじに解決してくれてる。 情報伝搬と分散故障検出を組み合わせて、こういうの実現するのってすごい。HashiCorp すごい。

共有するデータによって広がる未来

Consul というとどうしても Service Discovery とその応用が注目されがちな気がしているんですが、Service Discovery は ノードや Service のヘルスチェックの結果を共有することから生まれるユースケースの一つでしかなくて、Consul のユースケースはもっと広範だと思ってます。

たぶん自律分散システムの上で設定情報を共有しようと思ったのが Consul の Key-Value Store だと思うし、 ロックを共有できれば良いんじゃねってのが consul lock でできる分散ロック/分散セマフォに繋がってるように思います。 Consul Connect なんてのは、証明書と通信ルールを Consul 上で共有できるからできていることだと思います。

大げさかもしれないけど、Consul を分散システム上の情報共有システムと見立てることで、そのユースケースってかなり広大な感じがしていて、 その広大な平野がちょっとずつ見えてきている気がする。

伝搬システムとしても

共有とともに伝搬システムとしても使うことができて、ネイティブなヤツだと、consul exec でノードに適当なコマンドを実行させたりできるし、 consul watchconsul event の組み合わせで、イベントに反応させるシステムをつくることもできる。

そういうのをきれいに利用したのが stretcher だと思うし、まだ他にも応用例ってたくさんありそう。

他のプロダクトとの組み合わせ

で、そういう Consul のユースケースを広げるプロダクトも魅力的なの多くて、たとえば consul の key-vaule store で環境変数を一元管理したら楽じゃねってのが envconsul ってヤツで、 なにかっていうと、consul の key-value store に環境変数のせてることを前提にそれを監視するデーモンです。

このデーモンはサブプロセスを立ち上げられるようになってて、k/v store 上の環境変数に変更があったら、その環境変数を反映したサブプロセスを再起動してくれるっていう機能を持ってて、12 factor app さんどうぞ的なヤツです。

ほかにも、consul って基本的にノードにインストールすることが前提なんだけど、世の中にはそういうことができないノードってのがあって、 なんかめっちゃレガシーなシステムとか、なんかのアプライアンスとかあるじゃないですか。そういうのの上で動くサービスとかもチェックとかできるようにっていうのが、consul-esm ってヤツ。

あと、たぶん一番有名なのは consul-template だと思うけど、これはググったらいくらでも解説記事あるので、そっち見たら便利さが分かると思う。

あとなんか consul に完全対応した Reverse Proxy で Fabio とかいうのもあって、Consul のヘルスチェック結果をそのままバランシングに使えたりする。

そういうわけで

ぼくはけっこうすごいプロダクトだなって思っていて、Consul Connect は成功するかわからんけど、Consul はこれからもどんどん利用されてほしいなって思うし、 今後とも注目を続けていきたいなと思う所存です。