2011-07-31 9 views
7

HBaseが各列ファミリを別々のHFileに格納していることと、行が多くの列ファミリにまたがる可能性があることを考慮してください。 HBaseは、複数の列ファミリにまたがる行のput/delete操作が実際には原子的であることをどのように保証しますか?HBaseはどのように行レベルの原子性を保証しますか?

+0

私の知る限り、どの行操作(Put/Delete/checkAndPutなど)でも操作の順序はappend - > sync - > memstoreです。また、すべてのKeyValueにタイムスタンプがあり、列ファミリ内に複数のバージョンのKeyValueペアを格納できます(列ファミリのバージョンによって決まります)。 RowLockを使用して、操作が完全に安全であることを確認することもできます。 – frail

答えて

6

その列に何列のファミリがあっても、1つのregionserverに移動し、regionserverが領域WAL(Hlog)に編集を書き込み、次に書き込みが同期化されます、データはmemstoreに追加されて提供されます。それから、memstoreが限界に達すると、memstoreはディスクにフラッシュされます。 regionserverに何らかの問題が発生し、それがクラッシュ/死滅/プラグが引っ張られた場合、WALはすべてが一貫性を保つように実行できます。詳細については、HBASE-2283およびHbase Architecture 101を参照してください。

+0

リンクありがとうございます。私は実際にHBaseがすべてのHFiles(Put/Delete呼び出しのために1列以上の列ファミリに触れた場合に複数のHFilesが関わることになります)への書き込みを確実にする方法に興味がありました。しかし、あなたが言及したように、このアップデートはWALから引き続き検索できるので、HBaseはそのクライアントのアトミック性を保証することができます。 –

+0

正確には、WALは、とりわけ、複数のhfile問題を回避するために使用されます。 – cftarnas

1

HBaseは、現在、すべての列ファミリを同時にフラッシングすることによって複数のHFilesを書き込むにもかかわらず、行レベルの原子性を実現しています。フラッシュは、最大の列ファミリが構成されたフラッシュサイズに達するとトリガされます。追加のMemStoreレベルのタイムスタンプがあり、MemStoreの読み込みで複数バージョンの同時実行制御が可能ですが、HFilesに書き込まれるキー/値には存在しません。列単位のフラッシュ(効率を改善するための望ましい機能)に切り替えるには、同様のタイムスタンプをファイル形式に追加する必要があります。

関連する問題