okuyamaを導入するまでに知っておきたいサーバリソースとの4つの関係
続いてMasterNodeですが、MasterNodeはClientとDataNodeの間を橋渡しするGatewayの役目と、DataNodeの管理を行います。ただしMasterNodeを複数台で構築した場合、全てのNodeが2種類の役目を担う訳ではありません。
MasterNodeの内1台がGatewayとDataNode管理を行い、残りはGatewayだけを行います。両方の役目を担うNodeをMainMasterNodeと呼びます。図3はMasterNode.propertiesで、MasterNodeを定義してる箇所です
図3:MasterNode定義部分 |
ここで定義されている(2)がMainMasterNodeとなります。つまり、(1)と(2)の設定内容が一致した場合に、自身がMainMasterNodeとして起動します。(3)は全てのMasterNodeが定義されており、MainMasterNodeはここの設定を利用して、DataNodeの状態を全てのMasterNodeに伝播します。そして、ここに定義された順番でMainMasterNode障害時にMainMasterNodeに昇格します。
※設定ファイルが利用されるのは起動時の初期化処理のみとなり、以降は設定の動的変更に対応すため全てのMasterNdoeが共有できるように、DataNodeに通常のデータと同じように永続化されそちらの変更などを検知して稼働します。
以上のように、2種類のMasterNodeが存在するため、それぞれでメモリの使い方は異なります。MainMasterNodeを担当する可能性が高いノード、つまり、(3)の先頭よりに定義されているMasterNodeには、Clientとの仲介時に発生するデータをメモリ内に展開する容量と、DataNodeのデータ復旧、再配置時のデータ転送の中間点として利用されるメモリ容量が必要になります。MainMasterNode以外は、Clientとの仲介時における転送分の容量が最低限必要になります。それぞれ図4の計算式で求めることが可能です。
図4:MasterNodeで必要なメモリ容量の計算式 |
上記は最低限なので、ここにその他のMasterNodeを構成する要素が利用するメモリが加算されます。この場合、少なくとも128MBはその他の要素として検討することをお勧めします。
最後にDataNodeですが、DataNodeはデータを保存する役目を果たすので、保存方式によって利用するメモリ量は大きく異なります。そのため、一概にこれだけあれば良いとは言えません。ただし、どのデータをメモリに保持するかは細かく決定できますので、そちらに関しては次の章で詳しく解説させていただきます。それ以外の部分は先ほどのMasterNodeと同じ計算式で求めることが可能です。
図5:DataNodeで必要なメモリ容量の計算式 |
そして、DataNodeはデータの保存にメモリを利用した場合にメモリ空間を効率的に利用するSerializeMapという機能を持っています。これはJavaのメモリ空間上にデータを保存する際、インスタンス化されたJavaのObjectではなく、デシリアライズ後に圧縮したbyte型の配列で保持するという機能です。この機能を使うことで(デ)シリアライズオーバーヘッドと引き換えにメモリ空間を効率的に利用できるようになります。DataNode.propertiesに図6の設定を行うことで利用可能です。
図6:SerializeMap機能の設定 |