Voldemortの設定のメモ。
|
|
Voldemortをインストールした場所の下にconfigというディレクトリーがあり、その下にsingle_node_clusterという単独ノードクラスターの設定ファイルがある。
Voldemortの起動時にこの設定ディレクトリーの場所を指定して起動する。
ディレクトリー | ファイル | 備考 | |
---|---|---|---|
VOLDEMORT_INSTALL/config/single_node_cluster/ | config | cluster.xml | クラスターの構成。 |
server.properties | |||
stores.xml | ストアの構成。 | ||
.temp | 勝手に作られる。 | ||
.version | 勝手に作られる。 | ||
data | 勝手に作られる。 |
Voldemortを起動すると、データディレクトリーが自動的に作られる。
環境変数VOLDEMORT_HOMEにこのディレクトリーを指定しておくと、起動時にディレクトリーを指定しない場合はVOLDEMORT_HOMEの設定が使われる。
<cluster> <name>mycluster</name> <server> <id>0</id> <host>localhost</host> <http-port>8081</http-port> <socket-port>6666</socket-port> <partitions>0, 1</partitions> </server> </cluster>
とりあえず、クライアントからの通信を受け付けるポート(6666)が記されているようだ。
stores.xmlは、ストア(RDBのテーブルに相当)の定義を記述する。
<stores> <store> <name>test</name> <persistence>bdb</persistence> <routing>client</routing> <replication-factor>1</replication-factor> <required-reads>1</required-reads> <required-writes>1</required-writes> <key-serializer> <type>string</type> </key-serializer> <value-serializer> <type>string</type> </value-serializer> </store> <view> <name>test-view</name> <view-of>test</view-of> <view-class> voldemort.store.views.UpperCaseView </view-class> <value-serializer> <type>string</type> </value-serializer> </view> </stores>
single_node_clusterでは、デフォルトで「test」という名前のストアが定義されている。
また、「test-view」という名前のビューが定義されている。[2010-06-05]
test-viewに接続すると、testに保存していた値は大文字に変換されてgetされる。
test-viewへのputは出来ない。(UpperCaseViewクラスがそういう作りになっている。)
新しいストアを定義したい場合は、store要素をコピペしてnameの値を変えればとりあえず作れる。(viewは不要)[/2010-06-05]
VoldemortのDBを再起動すると、新しいストアが反映される。
store要素でストア(RDBのテーブルに相当)を定義する。[2010-06-05]
要素名 | 備考 | |||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
name | ストアの名前。RDBのテーブル名に相当。 | |||||||||||||||||||||||||
replication-factor | データが複製される個数。 | |||||||||||||||||||||||||
preferred-reads | 成功する読み込みの個数。この個数の読み込みが成功しないとクライアントがアプリケーションに値を返さない。 省略時のデフォルトはrequired-readsと同じ値。 |
|||||||||||||||||||||||||
required-reads | 例外を発生させない、最小の読み込み個数。 | |||||||||||||||||||||||||
preferred-writes | 成功する書き込みの個数。この個数の書き込みが成功するまでクライアントの実行がブロックされる。 省略時のデフォルトはrequired-writesと同じ値。 |
|||||||||||||||||||||||||
required-writes | 例外を発生させない、最小の書き込み個数。 | |||||||||||||||||||||||||
persistence | ストアデータの保持(永続化)に使われるバックエンドシステムの指定。 | |||||||||||||||||||||||||
routing | ルーティングポリシー。今のところはclient-side routingしかサポートされていないらしい。 | |||||||||||||||||||||||||
key-serializer | キーのシリアライズ方式。(タイプの種類はDefaultSerializerFactoryのソースを参照) 指定するタイプが間違ったものであっても、実行時まで分からない。 (定義読み込み時は特にチェックされず、ストアへアクセスした時に例外が発生する)
|
|||||||||||||||||||||||||
value-serializer | 値のシリアライズ方式。指定できるタイプはkey-serializerと同じ。 |
store/persistence要素でストアのデータを保存するバックエンドシステムを指定する。[2010-06-05]
バックエンドシステムを使うには、server.propertiesのstorage.configsでそのバックエンドシステムを扱うクラスを指定する必要がある。
併せて、server.properties内にそのシステムを使う為の設定も記述する。
persistenceに指定する値は、storage.configsに指定するStorageConfigurationクラスのgetType()によって取得される値。
値 | 概要 | storage.configsに指定するクラス |
---|---|---|
bdb | berkeley db。デフォルトで使用可能。 →BDBの設定 |
voldemort.store.bdb.BdbStorageConfiguration |
mysql | MySQL。使う為には別途MySQLをインストールしておく必要あり。 →MySQLの設定 |
voldemort.store.mysql.MysqlStorageConfiguration |
memory | データサイズがJavaVMのヒープサイズより大きくなるとOutOfMemoryが発生する。 | voldemort.store.memory.InMemoryStorageConfiguration |
cache | データサイズが大きくなるとデータが破棄される。 | voldemort.store.memory.CacheStorageConfiguration |
read-only | →read-onlyの設定 →read-onlyのデータの作り方 |
voldemort.store.readonly.ReadOnlyStorageConfiguration |
stores.xmlには、store以外にviewという要素が指定できる。[2010-06-05]
これは、RDBのビューに相当する。
ストアに格納されている内容(値)を変換して表示・格納したり、表示専用扱い(書き込みを禁止する)にしたりするのに使う。
要素名 | 備考 | 例 |
---|---|---|
name | ビューの名前。RDBのビュー名に相当。 ここで指定した名前をストア名としてクライアントから接続できる。 |
test-view |
view-of | 参照元ストアの名前。 store/nameと一致していなければならない。 |
test |
view-class | データを変換するクラスの指定。 | voldemort.store.views.UpperCaseView |
value-serializer | 値のシリアライズ方式。store/value-serializerと同様。 |
view/view-class要素でビューのクラスを指定する。[2010-06-05]
voldemort.store.views.Viewを実装する必要があるが、AbstractViewTransformationを継承するのが良さそう。
package jp.hishidama.sample.voldemort;
import org.apache.log4j.Logger; import voldemort.store.Store; import voldemort.store.views.AbstractViewTransformation;
public class UpperCaseWritableView extends AbstractViewTransformation<String, String, String> { private static final Logger logger = Logger.getLogger(UpperCaseWritableView.class); @Override public String storeToView(Store<String, String> store, String k, String s) { String v = s.toUpperCase(); logger.info("storeToView: " + s + " -> " + v); return v; } @Override public String viewToStore(Store<String, String> store, String k, String v) { String s = v.toLowerCase(); logger.info("viewToStore: " + v + " -> " + s); return s; } }
クライアントからgetを実行するとサーバー側でstoreToView()が呼ばれる。
クライアントからputを実行するとサーバー側でviewToStore()が呼ばれる。
AbstractViewTransformationではUnsupportedViewOperationExceptionの例外が常に発生するようになっているので、読み込み専用のビューにしたい場合は、viewToStore()はオーバーライドしないようにすればいい。
AbstractViewTransformationの型引数は、<K,
V, S>。ちと紛らわしいが(苦笑)、
K…キーの型(store/key-serializerに合わせる)
V…ビュー側の値の型(view/value-serializerに合わせる)
S…ストア側の値の型(store/value-serializerに合わせる)
サーバー起動時のクラスパスには、この独自ビュークラスも含まれるようにしないといけない。
また、クライアント側(クライアントシェル)も同様にクラスパスを指定する必要がある
ようだ。(何に使ってるんだか分からないけど)
クライアント:ストアへ接続 | クライアント:ビューへ接続 | サーバーのログ |
---|---|---|
voldemort-shell.bat
test tcp://localhost:6666 |
voldemort-shell.bat
test-view tcp://localhost:6666 |
|
> put "hello" "World" > get "hello" version(0:3): "World" |
||
> get "hello" version(0:3): "WORLD" |
INFO voldemort.UpperCaseWritableView: storeToView: World ->
WORLD |
|
> put "hello" "Abc" > get "hello" version(0:4): "Abc" |
INFO voldemort.UpperCaseWritableView: viewToStore: Abc -> abc |
|
> get "hello" version(0:4): "abc" |
server.propertiesには、個別の設定(プロパティー)を記述する。[2010-06-05]
「#」で始まる行はコメント。
長い設定を書きたい場合は、行末に「\」を付けて次の行に続ける。
バイト数を表す場合、単位を示す接尾辞が使える。「k」「kB」「M」「MB」「G」「GB」。当然1024の倍数。
真偽値を表す場合、「true」(大文字小文字は問わない)なら真、それ以外は全て偽。
どういったプロパティーが存在するのかは、VoldemortConfigのソースを見れば分かる。
分類 | プロパティー名 | 概要 | 値の例 |
---|---|---|---|
Voldemort | voldemort.home | Voldemortサーバー起動時の第1引数 あるいは環境変数VOLDEMORT_HOME |
|
data.directory | ストアのデータを置く場所。 デフォルトは「${voldemort.home}/data」 |
||
metadata.directory | 設定ファイルのある場所。 デフォルトは「${voldemort.home}/config」 |
||
storage.configs | ストアデータの永続化に使用するバックエンドシステムを扱うクラスの指定。 StorageConfigurationを実装したクラス。 カンマ区切りで複数指定可能。 起動時に読み込みが成功すると、以下のようなログが出力される。 INFO storage.StorageService: Initializing bdb storage engine. |
voldemort.store.bdb.BdbStorageConfiguration, \ |
|
slop.store.engine | デフォルトは「bdb」。 | ||
BDB | bdb.cache.size | デフォルトは200MB。 | 1GB |
bdb.write.transactions | デフォルトはfalse。 | false | |
bdb.flush.transactions | デフォルトはfalse。 | false | |
bdb.data.directory | デフォルトは「${data.directory}/bdb」。 | ||
bdb.max.logfile.size | デフォルトは60MB。 | 60MB | |
bdb.btree.fanout | デフォルトは512。 | 512 | |
bdb.checkpoint.interval.bytes | デフォルトは20MB。 | 20MB | |
bdb.checkpoint.interval.ms | デフォルトは30秒。 | 30000 | |
bdb.enable.sorted.duplicates | デフォルトはtrue。 | true | |
bdb.one.env.per.store | デフォルトはfalse。 | false | |
bdb.cleaner.min.file.utilization | デフォルトは5。 | 5 | |
bdb.cleaner.minUtilization | デフォルトは50。 | 50 | |
bdb.cursor.preload | デフォルトはfalse。 | false | |
read-only | readonly.backups | デフォルトは1。 | 1 |
readonly.search.strategy | デフォルトはBinarySearchStrategyクラス。 | voldemort.store.readonly.BinarySearchStrategy | |
readonly.data.directory | デフォルトは「${data.directory}/read-only」。 | ||
MySQL | mysql.user | デフォルトは「root」。 | |
mysql.password | デフォルトは空文字列。 | ||
mysql.host | デフォルトは「localhost」。 | ||
mysql.port | デフォルトは3306。 | ||
mysql.database | デフォルトは「voldemort」。 | ||
max.threads | デフォルトは100。 | ||
core.threads | デフォルトはmax.threadsの半分。(最低1) | ||
socket.timeout.ms | デフォルトは4秒。 | 4000 | |
socket.buffer.size | デフォルトは32kB。 | 32kB | |
socket.keepalive | デフォルトはfalse。 | ||
enable.nio.connector | デフォルトはfalse。 | ||
nio.connector.selectors | デフォルトはプロセッサー(CPU)数。(最大8) | ||
クライアント | client.max.connections.per.node | デフォルトは5。 | |
client.connection.timeout.ms | デフォルトは4秒。 | 4000 | |
client.routing.timeout.ms | デフォルトは5秒。 | 5000 | |
client.max.threads | デフォルトは100。 | ||
client.thread.idle.ms | デフォルトは5秒。 | 5000 | |
client.max.queued.requests | デフォルトは1000。 | ||
gossip.interval.ms | デフォルトは30秒。 | 30000 | |
pusher.poll.ms | デフォルトは2分。 | 120000 | |
失敗検知 | failuredetector.bannage.period | デフォルトは30秒。 | |
failuredetector.threshold | デフォルトは80。 | ||
failuredetector.threshold.countminimum | デフォルトは10。 | ||
failuredetector.threshold.interval | デフォルトは10秒。 | ||
failuredetector.asyncrecovery.interval | デフォルトは10秒。 | ||
failuredetector.catastrophic.error.types | |||
failuredetector.request.length.threshold |