k2hdkcとはなんですか?
K2HDKC (K2Hash based Distributed Kvs Cluster) は、Yahoo! JAPANオリジナルのNoSQL(key value store)ライブラリk2hashをベースとしたオープンソースの分散KVS(Key Value Store)です。
背景
Yahoo! JAPANではさまざまな分散KVS製品を使っていますが、K2HDKCは、K2HASHをベースに、高速、高可用性、拡張性、低メンテナンスコストなどを目的として開発されました。
K2HDKCという分散KVSを作ることで、K2HASH の性能とCHMPX のスケーラビリティと冗長性を維持しつつ、運用コストをさげることにも成功しました。
K2HASH とCHMPX は、2016年にすでにオープンソース化されている製品です。
K2HASH
大量のキーやデータを扱える、高速かつオリジナルな機能を持ったkvsライブラリ
CHMPX
ネットワークをまたぐプロセス間におけるバイナリ通信を行うための通信ミドルウエア
概要
K2HDKCクラスタは、複数のサーバーノードで構成されています。K2HDKCへアクセスするクライアントプログラムからはK2HDKCライブラリのAPIを利用するだけでアクセスできる構成となっています(図1を参照)。
図1. 概要
サーバーノードの構成
サーバーノードは、K2HASHデータ、CHMPX(サーバーノード)、および K2HDKC プログラムで構成されています。
CHMPX(サーバーノード)
K2HDKC プログラムおよびK2HASHへの操作はCHMPXプロセスを通した通信コマンドで実現されています。
K2HDKC
K2HDKCプログラムが、CHMPX(サーバーノード)からの通信コマンドを処理し、K2HASHファイルを管理し、操作します。
K2HASH
K2HASHファイルにはデータが保存されます。
クライアントプログラムの構成
クライアントは、2つのコンポーネントで構成されます。
CHMPX
CHMPX プロセスは、クラスタのサーバーノードの障害があった場合でも、耐久性のある通信を提供します。
K2HDKCライブラリを利用したクライアントプロセス
CHMPX を通して通信コマンドでK2HDKCクラスタの操作を行います。
可用性
K2HDKCクラスタ内のすべてのノードは同じ役割を持ち、データはK2HDKCクラスタのノード間で均等に分散されます。
hash値 による分散
- CHMPXのDELIVERMODE設定値などに依存して、データの保管ノードが決定されます。
- 対象となるhash値(キーにより求められる)を持つサーバーは、ハッシュ値とクラスター内のサーバーノードの数によって決まります。
- 以降の説明では、メインとなる対象のノードを メインサーバーノード と呼びます。
データの複製
- データは、必ずメインサーバーノードに保管されます。
- CHMPXのREPLICA設定の値に応じて、K2HDKCクラスタ内にデータの複製を持つことができます。
- REPLICA値が1の場合には、複製が1つ作られます。
- 複製を持つK2HDKCクラスタのノードを、レプリカノードと呼びます。
- レプリカノードは、メインサーバーノードの時計回り(hash値に応じて時計回りにノードが配置されていると仮定して)に決定されます。
障害発生時
K2HDKCクラスタのノードに障害が発生し、クライアントプログラムがメインサーバーノードに到達できない場合、自動的にレプリカノードから目的のデータにアクセスできます。
レプリカノードの数を調整することにより、高可用性を実現できます。
一貫性
メインサーバーノードの障害復旧後、データ一貫性を保証するために、メインサーバーノードは復旧後に自動的にレプリカノードからデータを復元します。この機能を Automatic Merge と呼びます。
補足:CHMPXのREPLICA値を1以上の設定が可能です。 2の場合、レプリカノードは2ノードになります。
K2HDKCクラスタのノードを増減する場合、各サーバーノードが保持するデータは自動的に再配置されます。この機能をAutomatic Scaling機能と呼びます。
ストレージ
K2HDKCクラスタが使うストレージは、K2HASH で実装されています。
K2HDKCと、K2HASH は密接に関係しています。
K2HASHの3種類のデータ保管方法
K2HDKCクラスタのデータの保管方法は、K2HASH に依存してます。
K2HASHは、データを以下の3種類のいずれかの方法で保管することができ、K2HDKCクラスタでも同様に3つの方法が提供されます。
メモリ
- オンメモリ(揮発)上にデータを保管します。
- 高速な読み込み/書き込みができます。
- 一時的な保管
データは、K2HDKCプロセスの終了とともに消えます。 - 復元
K2HDKCクラスタノードの障害発生後に復旧した場合、すべてのデータを復元する必要があるため、再起動後のレプリカノード間のデータ同期コストは高価です。
フルマッピングファイル
- ファイルにデータを保管し、そのファイルをmmapした状態でアクセスします。
- 高速な読み込み/書き込みができます。
- データは永続的に利用できます。
- 復元
K2HDKCクラスタノードの障害発生後に復旧した場合、差分のデータのみ復元するため、再起動後のレプリカノード間のデータ同期コストは適切で最小となります。
部分的なマッピングファイル
- ファイルにデータを保管し、そのファイルの一部分のみ(インデックスのみ)をmmapした状態でアクセスします。
- 大容量データの保管に適しています。
- データは永続的に利用できます。
- 復元
K2HDKCクラスタノードの障害発生後に復旧した場合、差分のデータのみ復元するため、再起動後のレプリカノード間のデータ同期コストは適切で最小となります。