HBaseの原則 - 分散システムのスナップショットを再生する方法ですか?(復刻版)

スナップショット(スナップショット)の基礎

スナップショットは、ストレージ・システムとデータベースシステムのサポート機能がたくさんあります。スナップショットは、ファイルシステム全体または特定の時点で鏡の中のディレクトリです。(ミラーは一度データが完全に一致していなければならないデータを取得するためのロックの必要性、)データファイルのミラーリングはロックのコピーに最も単純で、粗な方法で、この期間のため、元のデータのコピーは、任意のフォームを許可していません削除更新は、読み取り専用操作を提供し、コピーが完了した後、ロックを解除します。状況は多くの時間を過ごすためにバインドされている大量のデータの下で、長い時間が必然的に長い時間のためのクライアントのコピーをロックにつながる、このように関連するデータの実際のコピーは、生産ラインを許容することができないでいる、削除するように更新することはできません。

スナップショットメカニズムはデータをコピーしない、それは、元のデータへのポインタとして理解することができます。HBaseのではLSMシステム構造のこのタイプは、比較的容易に理解することであり、我々は一度ディスク上のHBaseのデータファイルに落ちたが、もはや更新または操作を編集、削除の場所に許可されていることを知らないあなたは更新を削除したい場合、あなたは追加の新しいファイルを書き込むことができます(HBaseの更新なしインターフェイスで、削除コマンド)も追加書き込みされています。新しい参照(ポインタ)あり、再作成し、新しいファイルへの他、新たに書き込まれたデータを書き込むことができるだけで現在のテーブル内のすべてのファイルを与えるこのメカニズムのスナップショットのテーブルを実現。下図のように:



1

 

スナップショット・プロセスは、3つの主要な手順が含まれます。

すべてのデータが更新を書かれたことはできません。この時点で、世界的なロックを追加、および削除1.

2. Memstoreフラッシュがファイルにデータをキャッシュします(オプション)

3.すべてのHFILE新しいファイルがスナップショットのメタデータであるポインタを、参照されています

拡張思考:LSMクラスシステムは、アップデートインプレースストレージシステムがそれをどのように他の非LSMシステムを実現するスナップショットのことを理解することが比較的容易で、実際のですか?

スナップショット機能は、何を達成するために?

HBaseのは、機能の非常にコアのスナップショットで、異なる用途のスナップショットを使用するなどの機能の多くを達成することができます:

  1. 全額/増分バックアップ:すべてのデータベースニーズデータの高い信頼性を実現するために、バックアップ機能を持っているために、スナップショットは、オンラインバックアップテーブルを達成するために非常に簡単にすることができ、およびオンラインビジネスへの影響のための要求は非常に小さいです。バックアップデータを使用して、ユーザは迅速に異常が発生した場合に指定されたスナップショットポイントにロールバックすることができます。定期的な増分バックアップにフルバックアップに基づいてビンログを使用して増分バックアップ。
  • 使用シーン一つは:1日のスナップショットが記録されたデータのスナップショットを保存した後、一般的な、重要なビジネスデータでは、少なくとも推奨され、そして定期的なクリーニングはあなたにロールバックすることができます前に、ロールバックが必要な場合は、重要なビジネス・エラーが発生している場合は、スナップショットの有効期限が切れスナップショットポイント。
  • 利用シーン2:クラスタのメジャーアップグレードを行いたい場合は、それはあなたが任意の異常がすぐにアップグレードする前にロールバックすることができ、アップグレード後のアップグレードは、実行のための重要なテーブルのスナップショットを作成する前に一度お勧めします。

       2.データの移行:あなたはデータの移行を達成するために、ExportSnapshotは別のクラスタにエクスポートスナップショット機能を使用することができます

  • 使用シナリオ:データAの部屋、部屋Aラックなどのマシンまたは十分でないビットが別のクラスタB大容量にクラスタ全体を移行する必要があり、ストップ移行プロセスを取り込むことができないことがよくあるケース室オンラインマイグレーション。基本的な考え方は、スナップショットの移行がクラスタB内のデータの総量を回収し、その後、B室にクライアント要求をリダイレクトするために2つを待ってから、更新データ複製技術の増分レプリケーションクラスタA、クラスタデータの整合性を使用して使用することです。具体的な手順を参照することができます:https://www.cloudera.com/documentation/enterprise/5-5-x/topics/cdh_bdr_hbase_replication.html#topic_20_11_7
  • 利用シーン2:など監査レポート、月次レポート、として、その後、ハイブ\スパークや他のオフラインOLAP分析を使用し、HDFSにデータをエクスポートするために使用スナップショット表

HBaseのスナップショットの使用Daquanの

最も一般的に使用されるコマンドはAスナップショットスナップショット、restore_snapshot、clone_snapshot ExportSnapshotを持っており、ツール、次のように、特定の使用は次のようになります。

  • テーブル「sourceTable」スナップショット「snapshotName」をプレイするには、スナップショットは、データの移動を伴わない、それがオンライン完了することができます。
HBaseの>スナップショット 'sourceTable'、 'snapshotName'
  • 指定された回復のスナップショットは、元のデータに置き換えられます回復プロセスは、テーブルには、すべての更新は、スナップショットのポイントの後に失われます、スナップショットのポイントに戻ります。無効スワップに元のテーブルの必要性がrestore_snapshot操作を実行することに注意してください。
HBaseの> restore_snapshot 'snapshotName'
  • 新しいテーブルを復元するスナップショットは、データの動きを伴わない回復プロセスは、それが数秒で完了することができます。それを行う方法好奇心旺盛で、レッツは、以下の分解を聞きます。
HBaseの> clone_snapshot 'snapshotName'、 'tableNameの'
  • Aをクラスタに移動スナップショットデータクラスタBにExportSnapshotコマンド使用、ExportSnapshotレベルはHDFS動作がパラレルMRデータ移行で使用される場合、MR装置の開口部に移行する必要があります。HMASTERとHRegionServerこのプロセスに関与していない、したがってない追加のメモリオーバーヘッドおよびオーバーヘッドGC。唯一の影響はExportSnapshotも、帯域幅の使用を制限するためのパラメータ-bandwidthアドレスにこの問題を設定し、追加の帯域幅とデータのIO負荷時のコピーのDNの必要性です。
HBaseのorg.apache.hadoop.hbase.snapshot.ExportSnapshot \ 
    -snapshot MySnapshot -copy-からHDFS:// SRV2:8082 / HBaseの\ 
    -copy-にHDFS:// SRV1:50070 / HBaseの-mappers 16 -bandwidth 1024 \

HBaseのスナップショット分散アーキテクチャ - 2フェーズ・コミット

指定されたテーブルのスナップショットを実行するように動作可能なHBaseの、スナップショットは、実際には、すべての実行領域の対応表についても同様です。領域領域の実装スナップショットに関与するすべてのいずれか完了しているか、まだ実行し始めていないことを保証するメカニズムの必要性が、中間状態を表示されないように領域の一部が未完成、そのような特定の領域の終了として、複数のリージョンサーバーに分散として。

スナップショットの保証アトミックに分配二相コミットプロトコル(2PC)を使用してのHBase。2PCは、一般に、コーディネータからなり、複数の参加者からなる、二相に分かれ、全体のトランザクションのコミットは:相を調製し、相コミット。これは準備段階のコーディネータは、すべての参加者に送信されるコマンドを準備し、すべての参加者は、(ロックリソースなど)は、適切なリソースを取得し、動作確認を行うために準備を始め、通常の仕事のコアが準備操作で行われ、正常に実行することができます。そして、コーディネーター準備応答に戻りました。受け取った後、コーディネーターは、地域の永続状態をコミット(すべての参加者が提出する準備ができていることを示す)参加者全員返された応答を作成し、フェーズ・コミット入力し、コーディネータはすべての参加者にコミットコマンドを送信し、参加者が受け取りました通常、操作およびリリースリソースをコミット操作は非常に簡単でコミットした後にコマンドをコミットします。

スナップショットのHBase使用2PCプロトコル・アーキテクチャを構築する方法を見てみましょう次のように続いて、基本的な手順は次のとおりです。

相を調製1. HMASTERは「/取得-snapshotname」ノード飼育係、及びスナップショット情報がこのノード(スナップショットテーブル情報)に書かれて作ります。リージョンサーバーの現在のターゲットテーブルが存在する場合、それはコマンドを無視しない場合、このノードへのすべてのリージョンサーバーモニタ後、キャリー/取得-snapshotnameノードのスナップショット・テーブル情報に基づいて、確認します。宛先の表がノートには、ここで、各地域のスナップショット操作を実行するために、それぞれ、すべての領域を介して、存在する場合はスナップショット操作の結果は、最終的なフォルダを作成しますが、一時フォルダに書き込まれていません。リージョンサーバーの実装が完了した後作成します。新しい子ノード/取得-snapshotname /中/取得-snapshotnameノードは、ノードはリージョンサーバー上の準備作業のすべての関連領域のnodex完全なスナップショットを表すnodex。

2.フェーズコミット:すべてのリージョンサーバーは/新規ノード取得-snapshotname下の子ノードに対応している作業の準備スナップショットが完了したら、準備作業のHMASTERと考えスナップショットが完全に完了します。表現、新しいノード/達し-snapshotnameを作成しますマスターは、コマンドのリージョンサーバーが参加することをコミット送信します。すべてのリージョンサーバーは/達し-snapshotnameノードを監視し、スナップショットの操作をコミットを実行し、操作をコミットした後だけで最終文書に一時フォルダから生成された結果にステージフォルダを準備するために、非常に簡単です。新しい子ノードの実装が完了した後/達し-snapshotname / nodexで/達し-snapshotnameノード、スナップショットnodeX作業の完了を表すノード。

3.段階アボート:一定時間/取得-snapshotname内のノードの数が条件を満たさない場合、タイムアウトスナップショットの準備作業の思うHMASTER、(リージョンサーバー完了していない製剤があります)。新HMASTERは別の新しいノード/アボート-snapshotnameは、このコマンドのすべてのリージョンサーバーのリスニングの後、一時フォルダに生成されたスナップショットの結果をクリーンアップしますします。

それはHMASTERがコーディネーターを務め、このシステムで見ることができ、リージョンサーバーは、参加者の役割を果たしました。HMASTERと飼育係リージョンサーバー間の通信は、同時に、トランザクションの状態は、飼育係のノードに記録されている、ことによって達成しました。メインケースダウンHMASTER可用性HMASTERの下では、主カットからHMASTERは、トランザクションを提出することを中止または継続することを決定することができる飼育係の状態に基づいています。

スナップショットコア実装

セクションのアーキテクチャレベルから分散系中の原子のスナップショット操作を完了する方法について説明。つまり、各領域はそれのスナップショットを実現するための方法ですか?そして、どのようにすべての結果のHMASTER領域スナップショットの概要?

どのように地域のスナップショットを実現しますか?

基本的な原理では、スナップショットが実際にデータをコピーしませんが、メタデータの利用ポインタ参照のシリーズを作成するために言及しました。そのメタデータは、具体的な種類のメタデータの何をすべきか?次のように実際には全体のプロセスは基本的にスナップショット:

2

 

次のようにフラグメントデバッグログを対応します:

snapshot.FlushSnapshotSubprocedure:フラッシュスナップショットの領域一新:yunxin、user1359,1502949275629.77f4ac61c4db0be9075669726f3b72e6。開始... 
snapshot.SnapshotManifest:保管'一新:yunxin、user1359,1502949275629.77f4ac61c4db0be9075669726f3b72e6。' スナップショットのための地域情報。
snapshot.SnapshotManifest:hfilesのための参照を作成
snapshot.SnapshotManifest:[] hfilesのスナップショットの参照を追加します

注:地域に生成スナップショットファイルのスナップショット・プロセスは、特に高速で、一つの領域に生成スナップショットファイルを参照することは困難であるため、通常、一時的なファイルである、/hbase/.hbase-snapshot/.tmp下のディレクトリを生成します。

どのようにHMASTER要約領域のスナップショットのすべての結果?

HMASTER全領域の完了後に実行要約スナップショット動作(CONSOLIDATE)、マニフェストマニフェストスナップ、スナップショット要約ファイルがHDFSディレクトリパスに見ることができる単一の領域にすべての合計:/hbase/.hbase -snapshot / snapshotname / data.manifest。以下の3つのファイル、スナップショットディレクトリがあることに注意してください:

3

其中.snapshotinfo为snapshot基本信息,包含待snapshot的表名称以及snapshot名;data.manifest为snapshot执行后生成的元数据信息,即snapshot结果信息。可以使用hadoop dfs -cat /hbase/.hbase-snapshot/snapshotname/data.manifest 查看:

4

clone_snapshot如何实现呢?

前文提到snapshot可以用来搞很多大事情,比如restore_snapshot、clone_snapshot以及export snapshot等等,这节就来看看clone_snapshot这个功能具体是如何实现的。直接进入正题,整个步骤可以概括为如下:

  1. 预检查:确认目标表没有进行snapshot操作以及restore操作,否则直接返回错误
  2. 在tmp文件夹下新建表目录并在表目录下新建.tabledesc文件,在该文件中写入表schema信息
  3. 新建region目录:这个步骤是clone_snapshot和create table最大的不同,新建的region目录是依据snapshot manifest中信息确定的,region中有哪些列族?列族中有哪些HFile文件?都来源于此。

此处有一个很有意思的事情是clone_snapshot克隆表的过程中并不涉及数据的移动,那不禁要问克隆出的表中文件是什么文件?与原表中数据文件之间的对应关系如何建立?这个问题的解决和split过程中reference文件的解决思路基本一致,不过在clone_snapshot中并不称作reference文件,而叫做linkfile,和reference文件不一样的是linkfile文件没有任何内容,只是在文件名上做了文章,比如原文件名是abc,生成的linkfile就为:table=region-abc,通过这种方式就可以很容易定位到原表中原始文件的具体路径:xxx/table/region/hfile,因此就可以不需要移动数据了。

5

上图中LinkFile文件名为music=5e54d8620eae123761e5290e618d556b-f928e045bb1e41ecbef6fc28ec2d5712,根据定义我们知道music为原始文件的表名,5e54d8620eae123761e5290e618d556b为引用文件所在的region,f928e045bb1e41ecbef6fc28ec2d5712为引用文件,如下图所示:

6

我们可以依据规则可以直接根据LinkFile的文件名定位到引用文件所在位置:***/music/5e54d8620eae123761e5290e618d556b/cf/f928e045bb1e41ecbef6fc28ec2d5712,如下图所示:

7
       4. 将表目录从tmp文件夹下移动到hbase root location

       5. 修改meta表,将克隆表的region信息添加到meta表中,注意克隆表的region名称和原数据表的region名称并不相同(region名称与table名称相关,table名不同,region名称就肯定不会相同)

       6. 将这些region通过round-robin方式立刻均匀分配到整个集群中,并在zk上将克隆表的状态设置为enabled,正式对外提供服务

 

其他需要注意的

不知道大家有没有关注另一个问题,按照上文的说法我们知道snapshot实际上是一系列原始表的元数据,主要包括表schema信息、原始表所有region的region info信息,region包含的列族信息以及region下所有的hfile文件名以及文件大小等。那如果原始表发生了compaction导致hfile文件名发生了变化或者region发生了分裂,甚至删除了原始表,之前所做的snapshot是否就失效了?

从功能实现的角度来讲肯定不会让用户任何时间点所作的snapshot失效,那如何避免上述所列的各种情况下snapshot失效呢?HBase的实现也比较简单,在原始表发生compact的操作前会将原始表复制到archive目录下再执行compact(对于表删除操作,正常情况也会将删除表数据移动到archive目录下),这样snapshot对应的元数据就不会失去意义,只不过原始数据不再存在于数据目录下,而是移动到了archive目录下。

大家可以做一下这样一个实验看看:

1. 使用snapshot给一张表做快照,比如snapshot ’test’,’test_snapshot’
2. 查看archive目录,确认不存在目录:/hbase-root-dir/archive/data/default/test
3. 对表test执行major_compact操作:major_compact ’test’
4. 再次查看archive目录,就会发现test原始表移动到了该目录,/hbase-root-dir/archive/data/default/test就会存在

同理,如果对原始表执行delete操作,比如delete ’test’,也会在archive目录下找到该目录。和普通表删除的情况不同的是,普通表一旦删除,刚开始是可以在archive中看到删除表的数据文件,但是等待一段时间后archive中的数据就会被彻底删除,再也无法找回。这是因为master上会启动一个定期清理archive中垃圾文件的线程(HFileCleaner),定期会对这些被删除的垃圾文件进行清理。但是snapshot原始表被删除之后进入archive,并不可以被定期清理掉,上文说过clone出来的新表并没有clone真正的文件,而是生成的指向原始文件的连接,这类文件称之为LinkFile,很显然,只要LinkFile还指向这些原始文件,它们就不可以被删除。好了,这里有两个问题:

1. 什么时候LinkFile会变成真实的数据文件?

如果看过笔者上篇文章《HBase原理 – 所有Region切分的细节都在这里了》的同学,肯定看着这个问题有种似曾相识的赶脚。不错,HBase中一个region分裂成两个子region后,子region的文件也是引用文件,这些引用文件是在执行compact的时候才真正将父region中的文件迁移到自己的文件目录下。LinkFile也一样,在clone出的新表执行compact的时候才将合并后的文件写到新目录并将相关的LinkFile删除,理论上也是借着compact顺便做了这件事。

2. 系统在删除archive中原始表文件的时候怎么知道这些文件还被一些LinkFile引用着?

HBase Split后系统要删除父region的数据文件,是首先要确认两个子region已经没有引用文件指向它了,系统怎么确认这点的呢?上节我们分析过,meta表中会存储父region对应的两个子region,再扫描两个子region的所有文件确认是否还有引用文件,如果已经没有引用文件了,就可以放心地将父region的数据文件删掉了,当然,如果还有引用文件存在就只能作罢。

那删除clone后的原始表文件,是不是也是一样的套路?答案并不是,HBase用了另一种方式来根据原始表文件找到引用文件,这就是back-reference机制。HBase系统在archive目录下新建了一种新的back-reference文件,来帮助原始表文件找到引用文件。来看看back-reference文件是一种什么样的文件,它是如何根据原始文件定位到LinkFile的:

(1)原始文件:/hbase/data/table-x/region-x/cf/file-x
(2)clone生成的LinkFile:/hbase/data/table-cloned/region-y/cf/{table-x}-{region-x}-{file-x},因此可以很容易根据LinkFile定位到原始文件
(3)back-reference文件:/hbase/.archive/data/table-x/region-x/cf/.links-file-x/{region-y}.{table-cloned},可以看到,back-reference文件路径中包含所有原始文件和LinkFile的信息,因此可以有效的根据原始文件/table-x/region-x/cf/file-x定位到LinkFile:/table-cloned/region-y/cf/{table-x}-{region-x}-{file-x}

到这里,有兴趣的童鞋可以将这块知识点串起来做个简单的小实验:

(1)使用snapshot给一张表做快照,比如snapshot ’table-x’,’table-x-snapshot’

(2)使用clone_snapshot克隆出一张新表,比如clone_snapshot ’table-x-snapshot’,’table-x-cloned’。并查看新表test_clone的HDFS文件目录,确认会存在LinkFile

8

(3)元のテーブルテーブル-Xを、アーカイブにテーブルの確認に元のファイルを参照してください(必ず元のテーブルファイルのアーカイブを削除する前にはテーブルがありません作る)を削除し、アーカイブ内の後方参照ファイルがあります。シュシュ後方参照ファイル形式ハに注意してください。

9

10

(4)コマンドmajor_compact 'test_clone'、major_compactテーブル 'テーブル-X-クローン' を行います。コマンドテーブル-X-クローンファイルディレクトリLINKFILEのが存在を実行する前に確認。

(5)すべてLINKFILEがもはやファイルに、すべての実データが存在することを確認しない、ビューHDFSファイルディレクトリテーブル-X-クローンが完了した後に行わmajor_compact。

11

 

 オリジナルリンク:http://hbasefly.com/2017/09/17/hbase-snapshot/

おすすめ

転載: www.cnblogs.com/qfdy123/p/12121025.html