独自のシャーディング ソリューションを構築しています。各 ID は次のように構成されます。
- シャード ID (小さい整数)
- テーブル タイプ ID (小さい整数)
- 増分番号 (big int)
元。00001000010000000015
私は仮想シャードを使用しているので、すべてのシャードを 1 つのサーバーに向けることができます。より多くの容量が必要な場合は、別のサーバーを追加して仮想シャードの一部をそのサーバーに向けるだけで、次回は新しいサーバーにデータが書き込まれます。最初のサーバーではなく、少なくともデータを移動して構成ファイルで変更するまで、読み取りは2つのサーバーに送信されます。
私の問題は、増分番号にあります。それらをユニークにしたい。mysql で特定のテーブルに build int incremental id を使用するのは良くありません。データを別のサーバーに移動する可能性があり、そこにそのテーブルの増分番号を使用する別のデータがある可能性があるため、重複した ID を取得する可能性があるためです。
したがって、私の質問は、その ID を生成する外部テーブルを使用せずに、スケーラブルな方法で一意の ID を生成するにはどうすればよいかということです。Pinterest がこれをどのように解決したかをご紹介します。各テーブルに、シャードごとに異なる値でスキップする増分値を与えることを考えたので、すべてのシャードの増分値は決して同じではありません。
アイデアは、Amazon RDS を使用して独自のシャーディング ソリューションを構築することです。そのため、レプリカは既にそこにあり、スレーブをマスターに昇格させて両方のサーバーのデータを削除し、シャーディング設定ファイルを変更するだけでよいため、バランスを取るのは簡単です。Amazon RDS を使用して簡単にスケーリングできるソリューションを構築することは可能であり、現在他の企業が提供するものよりもはるかに安価になると思います (すでに宿題をしました)。
URL で GUID を使用したくありません。長い数字を使っても構いません。Pinterest、Tumblr、Facebook、その他多くは Guid を使用していないため、それらが解決策であることはわかっています。数値 ID を使用したいことを考慮して、どの解決策が最も効果的かを知りたいだけです。
ASP.NET C# でアプリケーションを開発しています