NOSQLの新顔、分散KVS「okuyama」の機能
(2)マスター・ノード
マスター・ノードは、okuyamaへのクライアント・インタフェースを提供するとともに、データ・ノードの管理を行います。
クライアントが直接接続するインタフェースを提供
クライアントのプロトコルの違いを吸収するのも、このノードの役割です。現在対応しているプロトコルは、以下の通りです。
- オリジナル
okuyama専用のプロトコル。okuyamaの持つすべての機能を高速に利用可能。
- memcached
キー・バリュー・ストアの中で最もよく利用されている、memcachedライブラリのプロトコル。アスキー・プロトコルのみに対応しており、現在は以下のコマンドを利用可能です。
- get
- set
- add
- delete
- gets
- cas
- incr
- decr
flagおよびexpireTimeも利用できます。ただし、memcachedプロトコルで受信したコマンドをokuyama用に内部で変換しているため、処理能力は専用プロトコルよりも低下します。
- http
httpプロトコル。GETでのデータ取得に限って利用できます。
データ・ノード管理
データ・ノード管理の機能として、データ入出力、データ・ノードの動的追加、死活管理、障害時のフェール・オーバー、自動リカバリを行います。
- データ入出力
複数のサーバーでデータを分散管理する場合、ユーザーからリクエストのあったデータをどのサーバーが保持しているのかを知る必要があります。分散されたデータを管理する方法には、大きく以下の2種類があります。
- メタサーバー方式:
すべてのデータの保存先を、何らかの方法で記録し管理します。 - アルゴリズム方式:
保存依頼のあったデータを、何らかのアルゴリズムを使って、常に特定の値に変換します。変化した値を使って保存先を特定します。
okuyamaは、アルゴリズム方式を採用しています。サポートしているアルゴリズムは、ModとConsistentHashingの2種類です。Modアルゴリズムは分散方法がシンプルですが、ノードの変更に弱いという特性があります。ConsistentHashingは、アルゴリズムは若干複雑になりますが、ノードの追加に強いという特性があります。
あらかじめデータ数やサーバー数が限定されている場合はModでシンプルに分散し、データ数の増減が予想できない場合はConsistenteHasingを採用するのがよいと思います。
アルゴリズムを用いてデータ保存先を決定した後は、実際にデータ・ノードに対するデータ保存や取り出しを行います。この際、同時に同じデータを保存するデータ・ノードを最大3台まで設定できます。
- メタサーバー方式:
- ノードの動的追加
データ・ノードを追加することで、処理能力を向上させ、保存容量を拡大できます。ノードを追加すると、追加ノードに対して、従来のノードのデータの一部を再配置する処理が自動的に行われます。
データの再配置中でも、データの取得、更新、削除は、すべて行うことができます。この仕組みは、データの移行中に、ノード追加前と追加後の2つのノードの配置表を用いて実現しています。マスター・ノードに関しても、同様に無停止で追加することが可能です。
- データ・ノードの死活監視、フェール・オーバー、オート・リカバリ
データ・ノードの管理は、マスター・ノード内の代表ノードが担当して実施しています。一定間隔でPingによる死活監視を実施し、状態を監視しています。応答がない場合は停止ノードとしてマークし、その情報を別のマスター・ノードに伝播します。
データ・ノードが復旧した場合は、リカバリ処理を実施します。この際も、生存しているノードに処理を行わせることで、データ・アクセスが可能です。また、マスター・ノードの障害で代表ノードが停止した場合は、ほかのマスター・ノードが自動的に代表ノードに昇格します。
図2-3: データ・ノード障害時のフェール・オーバー(左)、マスター・ノードの自動昇格(右)(クリックで拡大)