sql >> データベース >  >> NoSQL >> MongoDB

大規模な分散システムでのObjectIdとUUIDの衝突確率

    私の場合、ほとんどのIDは、限られたサーバーセット内ではなく、多数のモバイルクライアント内で生成されます。この場合、正当な懸念があるのではないかと思います。

    それは私には非常に悪いアーキテクチャのように聞こえます。 2層アーキテクチャを使用していますか?モバイルクライアントがデータベースに直接アクセスできるのはなぜですか?本当にネットワークベースのセキュリティに依存したいですか?

    とにかく、衝突確率についてのいくつかの審議:

    UUIDもObjectIdも、そのサイズに依存しません。つまり、どちらもランダムな数値ではありませんが、衝突の可能性を体系的に削減しようとするスキームに従います。 ObjectIdの場合、その構造は次のとおりです。

    • UNIXエポックから4バイト秒
    • 3バイトのマシンID
    • 2バイトのプロセスID
    • 3バイトカウンター

    これは、UUIDとは異なり、ObjectIdは単調である(1秒以内を除く)ことを意味します。これはおそらく最も重要なプロパティです。単調なインデックスを使用すると、Bツリーがより効率的に入力され、IDによるページングが可能になり、IDによる「デフォルトの並べ替え」が可能になり、カーソルが安定します。もちろん、抽出しやすいタイムスタンプが付けられます。これらは知っておくべき最適化であり、巨大になる可能性があります。

    他の3つのコンポーネントの構造からわかるように、単一のプロセスで1kを超える挿入を実行している場合(サーバーからでも実際には不可能)、またはマシンの数が増えると、衝突が発生する可能性が非常に高くなります。約10を過ぎた場合(誕生日の問題を参照)、または1台のマシンのプロセス数が大きくなりすぎた場合(これもランダムな数値ではありませんが、マシン上で本当に一意ですが、2バイトに短縮する必要があります) 。

    当然、衝突が発生するには、すべてで一致する必要があります。 これらの側面があるため、2台のマシンが同じマシンハッシュを持っている場合でも、クライアントはまったく同じ秒と同じプロセスIDに同じカウンター値を挿入する必要がありますが、そうです、これらの値は衝突する可能性があります。

    >

    1. バックアップを使用してMongoDBの一般的な障害シナリオを修正する

    2. 部分的に定義されたスキーマを使用したドキュメントのマッピング

    3. Mongodb$whereクエリはnodejsで常にtrue

    4. Redis接続/バッファサイズの制限を超えました