TOP Database



abstract


BigTable

  • 数千台のコモディティなサーバでペタバイト級の大量データを扱うために開発されたデータベース
  • スケーラブルかつ高パフォーマンスで高可用性を実現するデータベースを目指して開発

CAP定理

CAPはConsistency(一貫性)、Availability(可用性)、Partition-tolerance(分断耐性)の頭文字をとったもの
分散システムにおいてこの3つを同時に満たすことはできないという定理
==>定理の本質はPartition-toleranceを担保すると同時に、ConsistencyとAvailabilityの両方を満たすことはできない
==>HBaseは、ConsistencyとPartition-toleranceをとったCP型のデータベース
Consistencyデータの更新があった場合にすべてのクライアントは同じデータが見えること
Availabilityノードに障害が発生した際に、すべてのクライアントはデータのいくつかの複製を発見することができること
Partition-tolerance分散システムのネットワークが切断されてもサービスを継続することができること


Master

マスタ型のアーキテクチャでは、中央管理するサーバが存在

Processes

HBaseでは、HMasterとHRegionServerという2種類のプロセスが存在
HMasterマスタとなりHRegionServerの管理やコーディネーションを行う
HRegionServerクライアントと実際にデータのやりとりを行う
  • データのやりとりに関してはHMasterを経由することはないので、HMasterがボトルネックになることはない
  • HMasterはホットスタンバイを立てることができて自動フェイルオーバーが可能

data model

論理データモデル

多次元ソートマップ
  • Tableという概念が存在
  • Tableには複数のRowが存在(RowKeyで一意に特定)
  • Rowには1つ以上のColumnが存在(すべてのRowは、RowKeyを使って常に辞書の順にソートされている)
  • Columnはテーブル作成時に定義する必要がなく、後から自由に追加する可能
  • Tableには1つ以上のColumnFamilyが存在
  • ColumnはいずれかのColumnFamilyに所属することになる
  • ColumnFamilyはテーブル作成時に定義する必要がある
  • それぞれのColumnには、複数のバージョン(基本的にはTimestampで管理)を持たせることができ、バージョンごとに値(Value)を持つことができる

物理データモデル

  • 列指向のストレージフォーマットを採用(ColumnFamilyごとにファイルを分けてディスクに保存)
  • データはRowKeyの範囲でファイルを分割(RowKeyの範囲で分割された単位をRegionと呼ぶ。Regionが各HRegionServerに割り当てられ負荷を分散)
  • RowKey,ColumnFamily,Column,Timestamp,Valueがセットで格納される
  • 同じRowで複数のColumnの値が存在する場合は、同じRowKeyのエントリーが複数存在(Columnも辞書順でソートされて格納される)
  • 値がNULLであるColumnを保存しない
  • バージョンは、RowKeyやColumnが同じでTimestampのみが違うエントリーとして管理

Hadoop分散ファイルシステム

Hadoop
  • Hadoop分散ファイルシステム(HDFS)上に構築
  • HDFSに保存されたデータはレプリケーションされる
  • HBaseはHDFSクライアントを用いてレプリケーションなどを意識せず透過的にファイルアクセスを行う
  • HDFSにはNameNodeとDataNodeというプロセスがある(NameNodeがマスタとするマスタ型のアーキテクチャ)
  • NameNodeが単一障害点になってしまうという問題はHadoop HAというソリューションにより、NameNodeのホットスタンバイを立て解決

ScaleOut

  • HRegionServerの台数を増やすことによって、性能がスケールしていく
  • HRegionServerの台数が多くなると障害の起きる確率も高くなるが、障害時にはRegionの再割当てを行い自動的にフェイルオーバーされる

Write

書き込み時の処理
1WAL(Write Ahead Log)をHDFSに書き込み
2メモリ内にデータを追加
  • WALの書き込みは、ディスクへのシーケンシャルな書き込みになるので高速
  • 2に関してもメモリ内の処理になるので高速

Scan, Filter

  • RowKeyによるレンジスキャンが可能(RowKeyでソートされた状態でデータが保存されているので)
  • フィルタを用い取得する必要のないRowをスキップできるため、スキャンの効率を大幅に高めること
  • 独自のフィルタを作成することも可能

&aname(自動シャーディング)

自動シャーディング

  • Regionという単位でデータが分割されている
  • Regionのサイズが大きくなった時に自動的に分割する機構
  • HRegionServerへのRegionの割り当てを自動的に行う機構
  • 自動シャーディングと呼び、負荷分散する。

consistency

  • 強い一貫性を持ち、古いデータが見えることはない
  • Rowに関する操作はアトミックに行われる(Rowに関する操作についてはコミットやロールバックに近いことが可能)
  • 値のインクリメントやCAS操作が可能

Merit

  • RDB(SQL etc)で扱いきれないような大規模なデータを扱う場合
    • 自動シャーディングによって負荷が分散
    • HRegionServerを増設することで性能をスケールする
  • 運用面でメリット
    • 障害時に自動的にフェイルオーバーされる

Note

  • HBaseをスタンドアロンモードで動かす場合、HDFSをインストールせず、HBaseのみインストール
  • HBaseをインストールする前にJavaのインストールが必要(HBaseはJava6に依存.Java7は不可)

Download

Install

$ tar -zxvf hbase-0.94.3.tar.gz
$ cd hbase-0.94.3
$ export JAVA_HOME=<Javaのインストールパス>
起動
$ bin/start-hbase.sh
起動したら、http://localhost:60010/master-statusにアクセス

停止
$ bin/stop-hbase.sh

Access

HBase shellを起動

$ bin/hbase shell

Table作成

"tbl"という名前のTableを作成し、"fam"という名前のColumnFamilyを定義
$ create "tbl", "fam"

データput

putの第1引数はTable、第2引数はRowKey、第3引数はColumnFamily:Column、第4引数は値を指定
$ put "tbl", "row1", "fam:col1", "val1"

データget

$ get "tbl", "row1", "fam:col1"

データ更新

$ put "tbl", "row1", "fam:col1", "val2"
$ get "tbl", "row1", "fam:col1"

バージョン数指定get

$ get "tbl", "row1", {COLUMN => "fam:col1", VERSIONS => 2}
HBaseではColumnに対して複数のバージョン(デフォルトで3)を持つことができる
バージョン数を指定しなかった場合は最新のバージョンの値を取得

データdelete

$ delete "tbl", "row1", "fam:col1"
$ get "tbl", "row1", "fam:col1"

Columnが複数ある場合にRowをまるごと削除

$ deleteall "tbl", "row1"

scan

$ put "tbl", "row1", "fam:col1", "val1"
$ put "tbl", "row1", "fam:col2", "val2"
$ put "tbl", "row2", "fam:col1", "val3"
$ put "tbl", "row3", "fam:col1", "val4"
$ put "tbl", "row4", "fam:col1", "val5"
$ scan "tbl"

LIMIT指定による取得するRow数限定

$ scan "tbl", {LIMIT => 2}

RowKeyの範囲(STARTROWやSTOPROW)を指定

STOPROWに指定したRowKeyは含まれない
$ scan "tbl", {STARTROW => "row2"}
$ scan "tbl", {STOPROW => "row3"}
$ scan "tbl", {STARTROW => "row2", STOPROW => "row4"}

Filter

TimestampsFilterを使って、timestampが1357045624980のColumnを取得
$ scan "tbl", {FILTER => "TimestampsFilter (1357045624980)"}

Ref


HBaseを触ってみよう
HBaseのアーキテクチャを理解しよう
HBql ... HBaseをSQLライクに扱うプロジェクト

管理人/副管理人のみ編集できます