Roma、Fairyについてひとことふたこと

古橋貞之の日記

個々のデータのサイズがある程度均一で、個々のデータに対するアクセスがある程度均一で、ノードの数よりデータの数の方がずっと多いなら、「ランダムにばらまく」で均等に分散(容量と負荷の分散)ができる。具体的な実装に踏み込めば、データのキー名をハッシュ関数に掛けて、ハッシュ結果に一番近いIDを持つノードと、その次のノードにデータを持たせればいい。3重化するなら、そのまた次のノードにも持たせる。実際、この方法を使うのではないかと思う。

ただしこの方法だと、一つのデータがどんどん大きくなっていくと、あるノードは空き容量がたくさんあるのに、あるノードだけが容量不足になってしまったりする。それに加えてその大きなデータへのアクセスが集中すると、特定のノードにだけアクセスが集中してしまう。そこのところはどうするのだろうか。各ノードの負荷に応じてデータの移動させたりするのだろうか。

予想としては、データのサイズもアクセスも均一で、ノードの数よりデータの数の方がずっと多いことを前提として(と言うか、それが前提とできる環境で使うためのシステムを作る)、最適化は実装しないという方向だと思うが、どうだろう。ぜひオープンに開発していただきたい限りである。





分散ストレージに関して、もう一つ思うところがある。トランザクションはどうするのだろう。

2つの互いに関連性を持ったデータを書き込もうとして、片方を書き込んだ段階で読み込みが発生したりする。このときに、両方の書き込みが終わるまで読み込みを待たせたり、両方とも書き終わるまではどちらも書き込んでいないデータを読み込ませたりしたい。分散環境だと複数のノードが同じデータを持っていたりするから、どのノードから読み込んでも同じデータが読み出せるようにしたい。これを可能にするのか否か。

これを可能にしようとする(トランザクションを実装する)と、書き込みや読み込みがとても遅くなる。書き込みが遅くなるなら許せるかもしれないが、読み込みも「今読み込んじゃってもOKですか?」と聞かないといけなかったりして、やっぱり遅くなる。トランザクションができなくても良いなら、ずっと速くできる。



それから、分散したデータでトランザクションするのは、実装が難しいらしい(私はやらない…)

Romaはトランザクションを実装するのだろうか。勝手な予想としては、単一のデータが中途半端に読み込まれることはないけど、複数のデータ間の整合性は保証しないよということで、トランザクションは実装しないと思う。テータの分散方法と合わせて要注目。

気になるところです。