Multi Raftライブラリの開発

Rust製「lol」というフザけた名前のRaftライブラリを公開しました

を書いたのは2020年の9月らしい。 今では星は150を超えて、 興味を持ってくれる人もたまに現れるようになった。 このくらいになってくると、飽きたから辞めますは許されなくなってくるが、 そもそも飽きてもいない。 最高のRaftライブラリにしたい。

2023年の9月に、再設計をして Multi Raft化することを構想した。 それから半年かけたが、膨大なリワークの結果、 ようやく新しいバージョンをリリースすることが出来た。 名前は"lol"から"lolraft"に変えた。 これは、スレッドなどでエゴサするときに偽陽性が高すぎるからである。

https://github.com/akiradeveloper/lolraft

ユーザから急かされたりしたが、 まさか「Eiken 1st gradeの勉強で忙しいから遅れてる」とは言えず、 英語もやりつつ、泣きながらというかわめきながら開発した。

Multi Raftというのはシャーディングのことである。 例えば分散KVSを作ることを考えると、Kの範囲によって 独立のRaftクラスタを作ることで性能をスケールさせることが出来る。

Raftクラスタを構成するノードをRaftプロセスと呼ぶことにすると、 lolもそうであったように、ふつうは 1つのOSプロセスが1つのRaftプロセスをサーバ実装する。 lolの場合、Tonicを使ってgRPCサーバとして実装している。

しかしこのようにしてMulti Raftを実現しようとすると、 クラスタ間でリソースを共有するために通信が必要になったりして、 効率が悪くなる。

そこで、1つのOSプロセスの中に複数のRaftプロセスを持てるようにする。 そうすると、これらのRaftプロセスはOSの中でメモリを共有することすら出来るようになり、 最適化の可能性が広がる。

lolraftの場合、各OSプロセス(gRPCサーバ、RaftNodeと呼ぶ)の中のRaftプロセス(RaftProcess)は LaneIdというIDによって識別される。Laneは1つのシャードに相当する。 ユーザがやることは、RaftProcessに与えるアプリケーション型(RaftApp)やストレージ型(RaftLogStore)を実装することだけである。 あとはそれをRaftNodeにLaneIdとともに登録して、gRPCサーバを立てればよい。

とりあえず、半年ずっとやり続けてきた開発が一段落したので、 しばらくは頭をゆっくり休めようと思う。 本当に疲れてしまった。 そして4月になったら土浦の予科練平和記念館に行く予定だ。 おれのじいさんは予科練の甲種13期で土浦にいた。 つくばを去る前に、一度見に行きたい。

comments powered by Disqus
Built with Hugo
テーマ StackJimmy によって設計されています。