「最終的な」一貫性とトランザクションなし(SimpleDBとも呼ばれる)で、実際にどれくらいの距離を移動できますか?

StackOverflow https://stackoverflow.com/questions/327169

質問

本当にSimpleDBを使用したいのですが、実際のロックとトランザクションがなければ、システム全体に致命的な欠陥があるのではないかと心配しています。最終的にシステムが一貫性を持つようになるので、高読み取り/低書き込みアプリの場合は理にかなっていますが、その間の時間はどうですか?一貫性のないデータベースでの適切なクエリは、追跡するのが非常に困難な方法で、データベース全体に大混乱をもたらすようです。うまくいけば、私は心配いぼです...

役に立ちましたか?

解決

これは、一貫性とスケーラビリティ、およびある程度の可用性の間のかなり古典的な戦いです。一部のデータは常に一貫している必要はありません。たとえば、digg.comとストーリーに対するdiggの数を見てください。 " digg"に値が重複している可能性があります。 DBに" user_digg"に対して強制的に結合させるのではなく、記録します。表。その数が完全に正確でない場合は問題になりますか?おそらくない。次に、SimpleDBのようなものを使用するのが適切かもしれません。ただし、銀行システムを作成している場合は、おそらく何よりも一貫性を重視する必要があります。 :)

1日目から大規模に対処する必要があることを知らない限り、RDBMSのような単純な従来のシステムに固執します。合理的なビジネスモデルを使用して作業している場合、トラフィックが急増すると収益が急増することを願っています。次に、そのお金を使ってスケーリングの問題を解決できます。スケーリングは難しく、スケーリングは予測が困難です。あなたを傷つけるスケーリングの問題のほとんどは、あなたが決して期待しないものになります。

私はむしろサイトを地面から取り出して、トラフィックが増えたときにスケールの問題を修正するために数週間を費やし、スケールを心配するのに非常に多くの時間を費やします。 :)

他のヒント

このSimpleDB について話していると仮定すると、 「心配そうではありません。実際のDBMSとして使用しない本当の理由があります。

DBMSのトランザクションサポートから取得するプロパティは、「A.C.I.D。」という頭字語で短縮できます:原子性、一貫性、分離、および耐久性。 AとDは主にシステムのクラッシュに関係し、Cと私は通常の操作に関係しています。商用データベースを操作するとき、それらはすべて当然のこととみなされているので、1つ以上のデータベースを持たないデータベースを操作する場合、多くの厄介な驚きに遭遇する可能性があります。

アトミック性:トランザクションは完全に完了するか、まったく完了しません(つまり、完全にコミットまたはアボートします)。これは、単一のステートメント(" UPDATE table ..."など)およびより長く複雑なトランザクションに適用されます。これがない場合、問題が発生した場合(ディスクがいっぱいになった、コンピューターがクラッシュしたなど)、途中で何かが行われる可能性があります。言い換えれば、DBMSに頼って実際に指示することを行うことはできません。実際の問題はいくつでも邪魔になり、単純なUPDATEステートメントでさえ部分的に完了する可能性があるからです。

一貫性:データベースについて設定したルールは常に適用されます。たとえば、Aが常にBに等しいというルールがある場合、データベースシステムに対して誰もそのルールを破ることはできません。試行する操作はすべて失敗します。すべてのコードが完璧な場合、これはそれほど重要ではありません...しかし、本当に、いつそれが事実ですか?さらに、このセーフティネットが欠落している場合、紛失したときに物事は本当に不愉快になります...

分離:データベースで実行されたアクションは、実際には同時に実行されている(相互にインターリーブされている)場合でも、連続して(一度に1つずつ)実行されるかのように実行されます。複数のユーザーが同時にこのデータベースにアクセスしようとしていて、これがない場合、思いもよらないことはうまくいきません。アトミックステートメントでさえ、予期しない方法で相互作用し、物事を台無しにします。

耐久性:電源が切れたりソフトウェアがクラッシュした場合、進行中のデータベーストランザクションはどうなりますか?耐久性がある場合、答えは「何もありません-それらはすべて安全です」です。データベースは、「元に戻す/やり直しログ」と呼ばれるものを使用してこれを行います。ここでは、データベースに対して行うすべての小さなことは、障害後に現在の状態を再構築できるように最初に記録されます(通常は安全のために別のディスクに記録されます) 。それがなければ、上記の他のプロパティは役に立たなくなります。なぜなら、クラッシュ後も物事の一貫性が保たれることを100%確信できないからです。

これらのことはあなたにとって重要ですか?答えは、あなたがしているトランザクションのタイプと、障害の状況であなたが望むことを保証するものと関係があるすべてです。これらが必要ない場合(読み取り専用データベースなど)がありますが、些細なことをせずに何か悪いことが起こったらすぐに、それらが必要になります。たぶん、予期しないことが起こったときはいつでもバックアップに戻してもいいかもしれませんが、そうではないと思います。

これらの保護をすべて削除しても、データベースのパフォーマンスが向上するわけではないことに注意してください。実際、おそらく逆です。これは、実際のDBMSソフトウェアにはクエリパフォーマンスを最適化するための大量のコードがあるためです。そのため、SimpleDBの6つのテーブルを結合するクエリを作成する場合、そのクエリを実行する最適な方法を見つけ出すとは思わないでください。商用DBMSがインデックス付きハッシュ結合を取得し、0.5秒で取得します。無数の小さなトリックがあります

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top