Key-Value Store

DynamoDBは俗に言うNoSQLデータベース(Key-Value Store)であり、テーブルの操作は全てAWSが提供するREST APIから行う。操作は全てアトミック操作として処理されるため、処理途中の状態を観測することはできない。(例えば、 ハッシュキー + レンジキー の組み合わせを取得したい場合、まず ハッシュキーでアイテムの一覧を取得取得した一覧からレンジキーで抜き出し という操作が組み合わされている)

ここでは一般的なKey-Value Storeがどういったものかを、DynamoDBの用語と合わせて解説したい。

分散ハッシュテーブルとハッシュキー

Key-Value Storeとは、所謂 分散ハッシュテーブル(DHT)の実装である。分散ハッシュテーブルにはデータベースシャーディング(パーティショニングとも)という技術が用いられており、これは、データを保存する場所を複数箇所用意してそれぞれをノード(パーティション)として扱う手法だ。保存する場所は複数存在するが、利用者からは1つの巨大なデータベースに見える。

[いいかんじの画像]

さて、分散ハッシュテーブルはどのようにして複数のノードに対してデータを保存していくのか。

分散ハッシュテーブルを実現するためには、まずデータを保存するためのノード(データの保存場所)を複数用意し、それぞれのノードに一意な識別子を割り当てる。例えば、ノード 01abc など。そして、データの書き込みリクエストを受けた時に分散ハッシュテーブルは、どのパーティションにデータを保存するかをデータの ハッシュキー (RDBでいう主キー、id)とノードの識別子で判別する。読み取りリクエストも同じ仕組みだ。

例えば、 101 というハッシュキーを持つデータの書き込みリクエストを受け付けた場合。マスターノードなどの手によって、ハッシュキーはまずハッシュ関数で処理される。ハッシュ関数で処理された 101 はハッシュ化されて dbc0f00… といった値になり、値の1桁目が d なので、このデータはノード d に書き込むと判断される。(DynamoDBの実装もこれで、DynamoDBがハッシュキーをハッシュ関数で処理し、書き込む先のパーティションを選択する)

[書き込み]

次に、同じく 101 というハッシュキーを持つデータの読み取りリクエストを受け付けた場合。先と同じようにハッシュ関数で処理した結果、データはノード d に書き込まれていることが分かるので、他のノードに一切の負荷をかけることなくデータを取り出せる。

[読み取り]

データを特定する際にも最低限のデータ量だけを調べれば良いので、RDBに比べて非常に高速だ。実際、ノードが増えればそれだけ読み取り性能が上がる。

しかし、分散ハッシュテーブルにも弱点はある。ハッシュキーによって複数のノードへの書き込みと高速な読み取りが可能になったが、これには ハッシュキー 以外での検索ができなくなるという弊害がある。分散ハッシュテーブルでは、RDBのようにSQLを使って柔軟にデータを引き出すことは出来ない。ハッシュキー以外で検索したい場合、まず全ノードから全データを取得し、そこから検索するしかないということだ。(つまり、ハッシュキー以外での検索は非常に遅い)

このことから、分散ハッシュテーブルで実装されたDynamoDBは効率的なアクセスや設計の自由度のために、一定の「検索の自由度」を諦めていることが分かる。

レンジキー

DynamoDBを使うと分かるが、DynamoDBでは ハッシュキー のみのテーブルと、 ハッシュキーレンジキー の2つのキーを扱うテーブルを利用できる。この レンジキー というものは、検索の自由度が低いDynamoDBに、最低限の検索能力を付与するためのキーである。

ハッシュキー単体で利用する場合、ハッシュキーはそのデータを特定するために一意なものでなければならない。しかし レンジキー と合わせて利用する場合、ハッシュキーは複数の存在を許され、代わりに ハッシュキー + レンジキー の組み合わせで一意になることが求められる。

[画像]

ハッシュキー がノードの特定だとすると、 レンジキー は特定後の検索だ。SQLは利用できないが、レンジキーを使って多少の範囲検索、条件分岐などが可能になる。例えば、レンジキーにUnixタイムスタンプなどを指定することで、あるハッシュキーのどこかの日付のデータだけを一度に取得することが出来る。

補足

これで、Key-Value StoreとDynamoDBの雰囲気は掴めてもらえたかと思う。ハッシュキーをうまく分散させることができれば、期待通りの性能が得られる。しかし、ハッシュキーを固定値にするなどして1つのノードにアクセスが集中してしまうと、どうしてもパフォーマンスが低下してしまう。この部分は注意しなければならない。

ユーザーIDなどのユニークな文字列などを使い、うまくハッシュキーが分散する設計にできるかどうかがDynamoDBを利用するにあたって重要な点である。

参考

results matching ""

    No results matching ""