Couchbaseとその他のNoSQLデータベースについてよく聞かれる質問は、レコードのユニークキーを生成する方法です - より具体的には、共通リレーションシップのAUTO INCREMENT機能データベース。Couchbaseクラスタでユニークキーを生成するためにインクリメントカウンタを使用する
頻繁に言及されているCouchbaseのソリューションは、数字キーで増分を呼び出すことができる増分機能で、新しい一意の数字が順番に生成されます。
これについて私の質問は、私はレプリケーションに関して私が予見する大規模な問題の周りに頭を浮かべることはできません。
3つのCouchbaseノードのクラスタがあり、要求ログを格納しているとします。このログをキー入力して、 "requestlog_counter"というエントリを作成します。
ここでは、それぞれ20個のリクエストを1秒間に受信する4つのWebノードがあり、それぞれを「request :: {ID}」として記録する必要があるとします。これは1秒あたり80回のリクエストです。
ノード1とノード3にはわずかなネットワーク遅延がありますが、これらの40の要求のいずれかが正確に同時に受信されます。あなたのスクリプトはリクエストカウンタをインクリメントします(この例では現在1500になっています)、IDを取得します。確かに両方のCouchbaseインスタンスが1501をWebノード1と3に返す可能性があり、両方のサーバーが現在処理中の要求を「要求:1501」として格納しようとします。
今、レプリケーションはこれを処理し、本質的に最新のものが勝つでしょう。しかし、あなたは今、1つの要求の記録を失ってしまった。
実際に、重要なデータをキーイングするためのより良い方法が必要であり、絶対値と固有キーの生成に自動インクリメントを使用することは、NoSQLクラスター環境では避けなければならないことを意味します。
または、これを100%信頼できるキー生成手順の一部として実行できますか?
また、クロスデータセンターレプリケーションを使用する複数のクラスタ環境も考慮してください。
ありがとうございました。 documentation機能increment
とdecremant
をCouchbaseのために応じて、すべての
マイク
OKクロスデータセンターのレプリケーションの例を考えてみましょう。 DC1とDC2の間のリンクが5秒間脱落し、その間にDC1とDC2がそれぞれ200個の要求を受信して処理するとします。オートインクリメントが1700に増加し、両方のDCがそのIDを使用してレコードを保存しているのではなく、私たちのauto incにはどうなりますか?そのような状況でストアコマンドが失敗することはないので、アトミックでもそうでなくても、データの一貫性には何かひどい出来事が起こるでしょうか? –
私は増分が1つのクラスター内で原子であると述べました。XDCRを使用する予定の場合は、「autoincrement」にクラスタIDのようなものを追加する必要があります。私。 '要求::'または 'request::'となります。この場合、2つの同一の自動インクリメントIDを取得したとしても、そのキーは一意の 'cluster_id'を持つので一意になります。しかし、私にとっては、XDCRが必要な場合は、GUIDだけを使用してタイムスタンプのようなものを追加して、値をソートし、アトミック操作を気にしないでください。 –
m03geek
OKをクリックします。私はこの質問をしている間にこれが当てはまると考えていましたが、将来はRDBからNoSQLに移行するときに同じ質問をすることになるでしょう。あるいは、起こりそうなことは誰かがこれを考慮せず、XDCRを導入した後はすべてが崩壊することでしょう - うまくいけば何が間違っているのかを説明し、問題を解決する方法を提供してくれることを願っています。 m03geekの確認とアドバイスをありがとう。 –