「NoSQL」の分野に数年滞在した後、今ではその性質が非常に「リレーショナル」な問題を抱えています。今日、私は以前とはまったく異なる目でデータストアを見ています。Riakのようなものは、単一の障害点、「メンテナンスのためのダウン」などに耐えることができないという方法で私を台無しにしました。これは、非常に高い要件を持たない(またはまだ)個人的なプロジェクトです。
おそらく、私の問題は解決が非常に「簡単」だからです。少なくとも概念レベルでは(RDBM自体がテーブルにもたらす制約を無視して)。
少量の「共有」データがあり、自由に複製できます。ハード一貫性の要件はありません。これはダイナモのようなデータベースに保存でき、無限に拡張できます。ただし、可能であれば、単一のデータベースを使用したいと考えています。
「ユーザーごとの」データがたくさんあります。つまり、すべてのユーザーが絶対に妥当なサイズのデータを持っている多くのユーザーが、単一のPostgreSQLノードに保存するのに本当に適しています。最大で数万件のレコードについて話しています。
クロスユーザーに問い合わせる必要はなく、クロスユーザーの原子性は必要ありません。
これは非常に簡単に実現できます。少なくとも「NoSQLの目」で見ているときは。
ここに私の素朴なスターターのアイデアがあります:
極端な場合、ユーザー全体をRiakの単一のキー/値としてシリアル化できます。もちろん、数メガバイトのデータを絶えずデシリアライズするのは遅いので、PostgreSQLの使用を検討しています。各ユーザーのデータ内に原子性/トランザクションが必要なため、Riak K / Vの多くは不要です。
ユーザーごとにSQLiteデータベースを使用し、GlusterFSのようなものを使用して冗長性と可用性を実現できます。これはおそらく、PostgreSQLを使用しても同様に良いものが見つからない場合に選択するソリューションです。長所:本当にうまくスケールダウン/スケールアップできます; 短所:SQLiteよりもPostgreSQLの型と厳格さを好む
したがって、PostgreSQLシャーディングソリューションから私が理想的に要求するものは次のとおりです。
- すべてのユーザーのデータのコピーを(異なるマシン上に)自動的に保持します。ユーザー/シャードごとにマスターノードを動的に切り替えることができる(以前のマスターがダウンした場合)。
- サーバーノードを追加/削除することにより、動的にスケールアップ/ダウンすることができます。たいていはRiakができるように。
- アプリケーションが、どのノードといつ通信するかを知る必要はありません。