非シャード DB では、自動インクリメントを使用して一意の ID を生成し、特定の行を参照できます。
DB を 12 個のシャードに分割したいと考えています。特定のシャードに挿入すると、自動インクリメント ID が一意ではなくなりました。
この問題に対処する際に誰かの経験を聞きたいです。
いくつかのアプローチ
1) 各シャードに独自の ID を与え、複合キーを使用する
2) 各シャードに独自の ID を与え、各シャードに ID 範囲を設定します
3) グローバルに一意の ID - GUID を使用する
この種の問題に対して私が使用した2つのアプローチ:
1) 2 行 (1 行は ID を示し、2 行目はデータベース ID を示します)
2) ガイドを使用する
私も同じジレンマを抱えています。私はredisソリューションを使用すると思います。redis-cloud.comのようなサービスを使用して一意の ID を生成します。そのため、シャード テーブルに挿入されたすべてのデータに対して引き続き bigint を使用できます。IT はシーケンシャルであるため、ページ分割は発生しません。さらに、ページングが非常に簡単になりました。URL で GUID を使用したくなかったので、IT はフレンドリ URL の問題を解決してくれました。さらに、Redis クラウドはスケーラブルなソリューションであり、非常に信頼性が高く、自動フェイルオーバーを備えています。
データを分割する範囲を決める必要はありません。主キーに MD5 ハッシュを使用して、シャード間でデータを均等に分割します。HA については、簡単なポイント イン タイム バックアップ/復元とレプリケーションのために Amazon RDS を使用することにしました。
Flickr も同じ手法を使用していると思いますが、奇数用と偶数用の 2 つのジェネレーターがあります。