【Apache Zookeeper】zoo.cfgの設定

はじめに

Apache Zookeeperの動作は、zoo.cfgという設定ファイルによって管理されます。
今回は、zoo.cfgの設定内容について解説していきます。

設定

必須オプション

下記に示すオプションは、必須の設定項目です。

項目内容
clientPortクライアント接続をリッスンするポート。
dataDirZooKeeperがインメモリデータベースのスナップショットを保存する場所。特に指定がない限り、データベースの更新のトランザクションログ。
tickTimeミリ秒単位で測定された、ZooKeeperによって使用される基本的な時間単位である1ティックの長さ。ハートビートとタイムアウトを調整するために使用される。最小セッションタイムアウトはtickTimeの2倍になる。

任意オプション

下記に示すオプションは、任意の設定項目です。
これらを使用して、ZooKeeperサーバーの動作をさらに微調整できます。
一部は、Javaシステムプロパティを使用して設定することも可能です。

項目内容
dataLogDirトランザクションログをdataDirではなくdataLogDirに書き込むようにマシンに指示する。これにより、専用のログデバイスを使用できるようになり、ロギングとスナップホット間の競合を回避できる。
globalOutstandingLimit(特にクライアントが多い場合)クライアントは、ZooKeeperがリクエストを処理するよりも速くリクエストを送信できる。キューに入れられたリクエストが原因でZooKeeperのメモリが不足するのを防ぐために、ZooKeeperはクライアントを抑制して、システムに未処理のリクエストがglobalOutstandingLimitを超えないようにする。デフォルトの制限は1,000。
preAllocSizeシークを回避するために、ZooKeeperはトランザクションログファイルのスペースをpreAllocSizeで指定したKBのブロックで割り当てる。デフォルトのブロックサイズは64MB。ブロックのサイズを変更する理由の1つは、スナップショットがより頻繁に取得される場合にブロックサイズを小さくするため。(snapCountも参照すること)
snapCountZooKeeperはトランザクションをトランザクションログに記録する。snapCountトランザクションがログファイルに書き込まれると、スナップショットが開始され、新しいトランザクションログファイルが作成される。デフォルトのsnapCountは10,000。
traceFileこのオプションが定義されている場合、リクエストはtraceFile.year.month.dayという名前のトレースファイルに記録される。このオプションを使用すると、有用なデバッグ情報が得られるが、パフォーマンスに影響する。
maxClientCnxnsIPアドレスで識別される1つのクライアントがZooKeeperアンサンブルの1つのメンバーに対して行うことができる同時接続数を(ソケットレベルで)制限する。これは、ファイル記述子の枯渇など、特定のクラスのDoS攻撃を防ぐために使用される。デフォルトは10。これを0に設定すると、同時接続の制限が完全になくなる。
clientPortAddressクライアント接続をリッスンするアドレス (IPv4、IPv6、ホスト名)、つまり、クライアントが接続を試みるアドレス。これはオプション項目である。デフォルトでは、サーバー上の任意のアドレス/インターフェース/NICのclientPortへの接続がすべて受け入れられるようにバインドされる。
minSessionTimeoutサーバーがクライアントにネゴシエーションを許可するミリ秒単位の最小セッションタイムアウト。デフォルトはtickTimeの2倍。
maxSessionTimeoutサーバーがクライアントにネゴシエーションを許可するミリ秒単位の最大セッションタイムアウト。デフォルトはtickTimeの20倍。
fsync.warningthresholdmsトランザクションログ (WAL) のfsyncがこの値よりも長くかかると、警告メッセージがログに出力される。値はミリ秒単位で指定され、デフォルトは1000。この値は、システムプロパティとしてのみ設定できる。

クラスターオプション

下記に示すオプションは、サーバーのアンサンブルで使用するように設計されています。
サーバーのクラスターを展開する場合に設定します。
一部は、Javaシステムプロパティを使用して設定することも可能です。

項目内容
electionAlg使用する選出方法の実装。”0″は元のUDPベースのバージョンに対応し、”1″は高速リーダー選出の非認証UDPベース バージョンに対応し、”2″は高速リーダー選出の認証済みUDPベース バージョンに対応し、 “3”は高速リーダー選出のTCPベースバージョンに対応する。現在、デフォルトは”3″。
initLimitフォロワーがリーダーに接続して同期できるようにする時間 (ティック単位)(tickTimeを参照)。ZooKeeperが管理するデータ量が多い場合は、必要に応じてこの値を増やす必要がある。
leaderServesリーダーはクライアント接続を受け入れるかどうか。デフォルトは”yes”。リーダーマシンは更新を調整する。読み取りスループットをわずかに犠牲にして更新スループットを高めるには、クライアントを受け入れず、調整に集中するようにリーダーを構成できる。
server.x=[hostname]:nnnnn[:nnnnn] などZooKeeperアンサンブルを構成するサーバー。サーバーが起動すると、データディレクトリ内のファイルmyidを検索して、自分がどのサーバーであるかを判断する。このファイルにはサーバー番号がASCIIで含まれており、この設定の左側にあるserver.xのxと一致する必要がある。
クライアントが使用するZooKeeperサーバーを構成するサーバーのリストは、各ZooKeeperサーバーが持つZooKeeperサーバーのリストと一致する必要がある。
ポート番号はnnnnnの2つである。最初のフォロワーはリーダーに接続するために使用し、2 番目のフォロワーはリーダー選出に使用する。リーダー選出ポートは、electionAlgが”1″、”2″、”3″(デフォルト)の場合にのみ必要。electionAlgが”0″の場合、2番目のポートは不要。1台のマシンで複数のサーバーをテストする場合は、サーバーごとに異なるポートを使用できる。
syncLimitフォロワーがZooKeeperと同期できる時間(ティック単位)(tickTimeを参照)。フォロワーがリーダーに大きく遅れをとっている場合、フォロワーは削除される。
group.x=nnnnn[:nnnnn]階層的なクォーラム構築を可能にする。”x”はグループ識別子で、”=”記号に続く数字はサーバー識別子に対応する。割り当ての左側は、コロンで区切られたサーバー識別子のリスト。グループはばらばらでなければならず、すべてのグループの結合はZooKeeperアンサンブルでなければならないことに注意する。
weight.x=nnnnn“group”とともに使用され、定足数を形成するときにサーバーに重みを割り当てる。この値は、投票時のサーバーの重みに対応する。ZooKeeperには、リーダーの選出やアトミックブロードキャストプロトコルなど、投票が必要な部分がいくつかある。デフォルトでは、サーバーの重みは”1″。構成でグループが定義されていて、重みが定義されていない場合、”1″がすべてのサーバーに割り当てられる。
cnxTimeoutリーダー選出通知の接続を開くためのタイムアウト値を設定する。electionAlgで”3″を使用している場合にのみ適用される。

認証と承認のオプション

下記に示すオプションを使用すると、サービスによって実行される認証/承認を制御できます。
Javaシステムプロパティのみ設定が可能です。

項目内容
Zookeeper.DigestAuthenticationProvider.superDigestデフォルトでは、この機能は無効になっている。
ZooKeeper アンサンブル管理者が”super”ユーザーとして znode 階層にアクセスできるようにする。特に、”super”ユーザーとして認証されたユーザーの ACL チェックは行われない。
org.apache.zookeeper.server.auth.DigestAuthenticationProvider を使用してsuperDigestを生成し、”super:<password>”の 1 つのパラメーターを指定して呼び出すことができる。アンサンブルの各サーバーを起動するときに、生成された”super:<data>”をシステムプロパティ値として指定する。
(ZooKeeper クライアントから)ZooKeeper サーバーへの認証時に、”digest”のスキームと”super:<password>”の認証データを渡す。ダイジェスト認証は認証データをプレーンテキストでサーバーに渡すことに注意する。この認証方法は、(ネットワーク経由ではなく)ローカルホストまたは暗号化された接続でのみ使用することを勧める。

安全ではないオプション

下記に示すオプションは便利ですが、使用するときは注意してください。
それぞれのリスクは、変数が何をするかの説明とともに説明されています。
Javaシステムプロパティを使用して設定することも可能です。

項目内容
forceSync更新の処理を終了する前に、更新をトランザクションログのメディアに同期する必要がある。このオプションがnoに設定されている場合、ZooKeeperは更新をメディアに同期する必要はない。
jute.maxbufferこのオプションは、Javaシステムプロパティとしてのみ設定できる。Zookeeperプレフィックスない。znodeに格納できるデータの最大サイズを指定する。デフォルトは0xfffff、つまり1MB未満。このオプションを変更する場合、すべてのサーバーとクライアントでシステムプロパティを設定する必要がある。そうしないと、問題が発生する。これは本当に健全性チェック。ZooKeeperは、KB単位のサイズでデータを保存するように設計されている。
skipACLACLチェックをスキップする。これにより、スループットが向上するが、データツリーへのフルアクセスが誰にでもできるようになる。

おわりに

zoo.cfgの設定内容について解説しました。

最新情報をチェックしよう!