Apache HBase リージョン(Regions)
Apache HBase は、行キーで辞書順にソートされたテーブルに大容量データを保存する。テーブルは複数のリージョン(Region)に分散され、リージョンはさらに複数の RegionServer に分散される。Apache HBase でテーブルを作成すると、デフォルトリージョンが割り当てられる。
Apache HBase リージョンは水平方向に拡張可能である。これには開始キーと終了キーが含まれ、該当する行を基準にソートされ、連続した形式で保存される。HBase は強い一貫性を提供するため、複数のリージョンに同じ行キーを保存しない。リージョンは複数の RegionServer に負荷を分散し、要件に応じて負荷分散とフェイルオーバーも行う。データが増加する場合、リージョンは手動または自動で分割される。
リージョン数
RegionServer ごとに中大規模(5-20GB)のリージョンを少数(20-200個)使用することが推奨される。リージョンの標準数は100個である。
リージョンを考慮する際のいくつかの要素を見てみよう。
- リージョン数を選択する際の制限要因は、利用可能なヒープ領域である。MemStore にはリージョンごと、カラムファミリーごとにほぼ 2MB が必要であり、リージョンが100個、リージョンごとに3つのカラムファミリーがある場合、MemStore のヒープ領域要件は 600MB である。リージョンが少ないほど MemStore のヒープ要件は少なくなる。
- 多数のリージョンは、多数の小さな flush を生成する。各 flush が StoreFile を作成すると多数の StoreFile が作成されるため、より多くの compaction が必要になる。また、MemStore および StoreFile インデックスにはより多くのヒープ領域が必要である。
- master が RegionServers にリージョンを割り当て、再割り当てする必要があるため、多数のリージョンは master に負荷を生む。また、master はロードバランシングのためにリージョンを移動する必要がある。
リージョン割り当て(Region Assignment)
Apache HBase でリージョンは、以下のように master によって割り当てられる。
- master は assignment manager を開始する。
- assignment manager は hbase:meta メタデータで既存の割り当てを確認する。
- RegionServer が利用可能な場合、割り当ては保存される。
- RegionServer がオンライン状態でなければ、load balancer が呼び出され、リージョンを別の RegionServer に割り当てる。
- hbase:meta メタデータが新しい割り当てで更新される。
リージョンフェイルオーバー(Region failover)
RegionServer は失敗する可能性があり、複数の RegionServer がデータを提供するため、RegionServer のリージョンが利用できなくなることがある。ZooKeeper は RegionServer のエラーを検出し、master はリージョンに類似した Row Key を持つ別の RegionServer でフェイルオーバーを開始する。
リージョンローカリティ(Region Locality)
Region Locality は、RegionServer に対するリージョンの近接性を示す。これはクラスター全体で HDFS ブロックレプリケーションによって達成される。
レプリカ配置ポリシーは HDFS のレプリカ配置ポリシーであり、次のとおりである。
- 1つ目のレプリカはローカルノードに配置される。
- 2つ目のレプリカは別ラック(rack)の任意ノードに配置される。
- 3つ目のレプリカは2つ目のレプリカと同じラック(rack)に配置されるが、このときは別ノードに配置される。
リージョンの利点(Benefits of Regions)
リージョンの利点は、分散データストア、パーティショニング、自動シャーディングと拡張性、リージョン分割である。
それぞれ詳しく見てみよう。
分散データストア
分散データストアの設計は、テーブルに複数のリージョンを使用する Apache HBase の設計と一致する。ノードクラスター全体に大きなテーブルのリージョンを分散すると、高可用性を得られる。
パーティショニング
データテーブルは複数のリージョンに保存され、リージョンはデータを分割する。これで該当テーブルのデータにアクセスするには、別のリージョンからアクセスする必要がある。複数のリージョンがあれば、データを高速に配信できる利点がある。
自動シャーディングと拡張性
自動シャーディングプロセスは、リージョンの行キー数が多くなりすぎたときに、リージョンをおよそ2つの半分に分割するために使用される。HBase で水平拡張性の基本単位はリージョンであり、リージョンごとに行を共有する。
リージョン分割
しきい値を超えるとリージョンが分割される。これはリージョンを分割し、分割されたリージョンをオフラインにする RegionServer によって処理される。その後、2つの分割リージョンが hbase:meta に追加され、RegionServer で開かれ、master に報告される。リージョン分割は基本的に自動だが、手動で実行することもできる。HBase リージョン分割ポリシーは hbase.regionserver.region.split.policy で構成される。