今回は,Kaiの設定とチューニングについて詳しく説明します。
なお,本連載が対象とする Kaiのバージョンは0.4,ErlangのバージョンはR13Bです。
データ管理の単位 = バケット
ここでは,Kai設定ファイル内の number_of_bucketsについて説明します。
number_of_bucketsは,ノード間での負荷の偏りや,データ配置の計算コストを調整するために使用します。ノード数が数十程度であれば,デフォルト設定のまま変更する必要はありません。
Kaiでは,担当ノードの決定やデータの再配置を行なう際,効率を高めるため,データをバケットという単位でまとめて扱います。バケットとは,32ビットのハッシュ空間をnumber_of_bucketsに指定された値で均等に分割したものです。
バケット数(number_of_buckets)が少ないと,ノードごとの担当データ量に偏りが生じるため,上手に負荷分散されません。極端な例ですが,バケットが一つであるならば,全てのデータが特定のノードに集中してしまいます。
一方で,バケット数が多いと,データを操作するときの処理量が大きくなります。大雑把な見積もりではありますが,ノード数が数十程度であれば,バケット数は,1,000~100,000の範囲が適当だと思われます。
なお,デフォルトでは1,024に設定してあります。もし,設定を変更するのであれば、以下の点に注意してください。
- なるべく,クラスタ内の総仮想ノード数よりも大きな値にする(仮想ノードについては後述します)
- クラスタを構成する全てのノードで,必ず,同じ値を設定する
(1) は,負荷分散のため,(2) は,データを操作するときの計算結果を,クラスタを構成する全ノードで一致させるために必要な条件となります。バケット数は,なるべく,将来の仮想ノードの増加を考慮して決めてください。
仮想ノードによるデータ配置の重み付け
ここでは,Kai設定ファイル内のnumber_of_virtual_nodesについて説明します。
number_of_virtual_nodesは,ノードの性能差に合わせて負荷を調節するために使用します。
本連載の第1回で,Kaiは,Consistent Hashingによりデータ割り当てを決定する際,リング状のハッシュ空間にノードを配置すると説明しました。
性能の高いノードには,他のノードより多くのデータを割り当てられると,より適切に負荷分散を行うことができます。Kaiでは,ノードをハッシュリングに配置する際,性能に合わせて擬似的なノードを多く配置することができます。このときの配置数をnumber_of_virtual_nodesによって設定します。
例えば,標準的な構成のノードには128を設定し,2倍のメモリを搭載したノードには256を設定します。なお,詳細は省略しますが,少なくとも100以上の数値を設定するようにしてください。
Consistent Hashingについてのより詳しい説明は,こちらのページもご参照ください。

