5.3. ZooKeeper の設定
Kafka は ZooKeeper を使用して設定データを保存し、クラスターの調整を行います。レプリケーションされた ZooKeeper インスタンスのクラスターを実行することが強く推奨されます。
5.3.1. 基本設定
最も重要な ZooKeeper 設定オプションは次のとおりです。
tickTime
- ZooKeeper の基本時間単位 (ミリ秒)。ハートビートとセッションのタイムアウトに使用されます。たとえば、最小セッションタイムアウトは 2 ティックになります。
dataDir
-
ZooKeeper がトランザクションログとインメモリーデータベースのスナップショットを保存するディレクトリー。これは、インストール時に作成された
/var/lib/zookeeper/
ディレクトリーに設定する必要があります。 clientPort
-
クライアントが接続できるポート番号。デフォルトは
2181
です。
config/zookeeper.properties
という名前の ZooKeeper 設定ファイルの例が、Streams for Apache Kafka のインストールディレクトリーにあります。ZooKeeper でレイテンシーを最小限に抑えるために、別のディスクデバイスに dataDir
ディレクトリーを配置することが推奨されます。
ZooKeeper 設定ファイルは /opt/kafka/config/zookeeper.properties
に置く必要があります。設定ファイルの基本的な例は以下で確認できます。設定ファイルは kafka
ユーザーが読み取りできる必要があります。
tickTime=2000 dataDir=/var/lib/zookeeper/ clientPort=2181
5.3.2. ZooKeeper クラスター設定
多くの実稼働環境では、レプリケーションされた ZooKeeper インスタンスのクラスターをデプロイすることが推奨されます。安定した高可用性 ZooKeeper クラスターの実行は、信頼できる ZooKeeper サービスにとって重要です。ZooKeeper クラスターは ensembles とも呼ばれます。
ZooKeeper クラスターは通常、奇数のノードで構成されます。ZooKeeper では、クラスター内のほとんどのノードが稼働している必要があります。以下に例を示します。
- 3 つのノードで設定されるクラスターでは、少なくとも 2 つのノードが稼働している必要があります。これは、1 つのノードが停止していることを許容できることを意味します。
- 5 つのノードで構成されるクラスターでは、少なくとも 3 つのノードが使用可能である必要があります。これは、2 つのノードが停止していることを許容できることを意味します。
- 7 つのノードで構成されるクラスターでは、少なくとも 4 つのノードが使用可能である必要があります。これは、3 つのノードが停止していることを許容できることを意味します。
ZooKeeper クラスターにより多くのノードがあると、クラスター全体の回復力と信頼性が向上します。
ZooKeeper は、偶数のノードを持つクラスターで実行できます。ただし、ノードを追加してもクラスターの回復力は向上しません。4 つのノードで設定されるクラスターでは、少なくとも 3 つのノードが利用可能で、1 つのノードがダウンしているノードのみを許容する必要があります。そのため、3 つのノードのみを持つクラスターとまったく同じ回復力があります。
理想的には、異なる ZooKeeper ノードを異なるデータセンターまたはネットワークセグメントに置く必要があります。ZooKeeper ノードの数を増やすと、クラスターの同期に費やされたワークロードが増えます。ほとんどの Kafka のユースケースでは、3、5、または 7 つのノードで設定される ZooKeeper クラスターで十分です。
3 つのノードで設定される ZooKeeper クラスターは、利用できないノードを 1 つだけ許容できます。つまり、クラスターノードがクラッシュし、別のノードでメンテナンスを実施している場合、ZooKeeper クラスターが利用できなくなります。
レプリケーションされた ZooKeeper 設定は、スタンドアロン設定でサポートされるすべての設定オプションをサポートします。クラスタリング設定にさらにオプションが追加されます。
initLimit
-
フォロワーがクラスターリーダーに接続して同期できるようにする時間。時間はティック数として指定されます (詳細は
tickTime
オプション を参照してください)。 syncLimit
-
フォロワーがリーダーの背後にあることのできる時間。時間はティック数として指定されます (詳細は
tickTime
オプション を参照してください)。 reconfigEnabled
- 動的再設定を有効または無効にします。サーバーを ZooKeeper クラスターに追加または削除するには、有効にする必要があります。
standaloneEnabled
- ZooKeeper が 1 つのサーバーでのみ実行されるスタンドアロンモードを有効または無効にします。
上記のオプションの他に、すべての設定ファイルに ZooKeeper クラスターのメンバーである必要があるサーバーのリストが含まれている必要があります。サーバーレコードは server.id=hostname:port1:port2
の形式で指定する必要があります。以下に詳細を説明します。
id
- ZooKeeper クラスターノードの ID。
hostname
- ノードが接続をリッスンするホスト名または IP アドレス。
port1
- クラスター内通信に使用されるポート番号。
port2
- リーダーエレクションに使用されるポート番号。
以下は、3 つのノードで設定される ZooKeeper クラスターの設定ファイルの例になります。
tickTime=2000 dataDir=/var/lib/zookeeper/ initLimit=5 syncLimit=2 reconfigEnabled=true standaloneEnabled=false server.1=172.17.0.1:2888:3888:participant;172.17.0.1:2181 server.2=172.17.0.2:2888:3888:participant;172.17.0.2:2181 server.3=172.17.0.3:2888:3888:participant;172.17.0.3:2181
4 文字のコマンドを使用するには、zookeeper.properties
で 4lw.commands.whitelist=*
を指定します。
myid
ファイル
ZooKeeper クラスターの各ノードには、一意の ID
を割り当てる必要があります。各ノードの ID
は myid
ファイルで設定し、/var/lib/zookeeper/
のように dataDir
フォルダーに保存する必要があります。myid
ファイルには、テキストとして ID
が記述された単一行のみが含まれている必要があります。ID
には、1 から 255 までの任意の整数を指定することができます。このファイルは、各クラスターノードに手動で作成する必要があります。このファイルを使用すると、各 ZooKeeper インスタンスは設定ファイルの対応する server.
行の設定を使用して、そのリスナーを設定します。また、他の server.
行すべてを使用して、他のクラスターメンバーを特定します。
上記の例では、3 つのノードがあるので、各ノードは値がそれぞれ 1
、2
、および 3
の異なる myid
を持ちます。
5.3.3. 認証
デフォルトでは、ZooKeeper はどのような認証も使用せず、匿名の接続を許可します。ただし、Simple Authentication and Security Layer (SASL) を使用した認証の設定に使用できる Java Authentication and Authorization Service (JAAS) をサポートします。ZooKeeper は、ローカルに保存されたクレデンシャルと DIGEST-MD5 SASL メカニズムを使用した認証をサポートします。
5.3.3.1. SASL を使用した認証
JAAS は個別の設定ファイルを使用して設定されます。JAAS 設定ファイルを ZooKeeper 設定と同じディレクトリー (/opt/kafka/config/
) に置くことが推奨されます。推奨されるファイル名は zookeeper-jaas.conf
です。複数のノードで ZooKeeper クラスターを使用する場合は、JAAS 設定ファイルをすべてのクラスターノードで作成する必要があります。
JAAS はコンテキストを使用して設定されます。サーバーとクライアントなどの個別の部分は、常に別の コンテキスト で設定されます。コンテキストは 設定 オプションで、以下の形式となっています。
ContextName { param1 param2; };
SASL 認証は、サーバー間通信 (ZooKeeper インスタンス間の通信) とクライアント間通信 (Kafka と ZooKeeper 間の通信) に対して別々に設定されます。サーバー間の認証は、複数のノードを持つ ZooKeeper クラスターにのみ関連します。
サーバー間の認証
サーバー間の認証では、JAAS 設定ファイルには 2 つの部分が含まれます。
- サーバー設定
- クライアント設定
DIGEST-MD5 SASL メカニズムを使用する場合、認証サーバーの設定に QuorumServer
コンテキストが使用されます。暗号化されていない形式で、接続できるすべてのユーザー名とパスワードが含まれている必要があります。2 つ目のコンテキスト QuorumLearner
は、ZooKeeper に組み込まれるクライアント用に設定する必要があります。また、暗号化されていない形式のパスワードも含まれます。DIGEST-MD5 メカニズムの JAAS 設定ファイルの例は、以下を参照してください。
QuorumServer { org.apache.zookeeper.server.auth.DigestLoginModule required user_zookeeper="123456"; }; QuorumLearner { org.apache.zookeeper.server.auth.DigestLoginModule required username="zookeeper" password="123456"; };
JAAS 設定ファイルの他に、以下のオプションを指定して、通常の ZooKeeper 設定ファイルでサーバー間の認証を有効にする必要があります。
quorum.auth.enableSasl=true quorum.auth.learnerRequireSasl=true quorum.auth.serverRequireSasl=true quorum.auth.learner.loginContext=QuorumLearner quorum.auth.server.loginContext=QuorumServer quorum.cnxn.threads.size=20
KAFKA_OPTS
環境変数を使用して、JAAS 設定ファイルを Java プロパティーとして ZooKeeper サーバーに渡します。
su - kafka export KAFKA_OPTS="-Djava.security.auth.login.config=/opt/kafka/config/zookeeper-jaas.conf"; /opt/kafka/bin/zookeeper-server-start.sh -daemon /opt/kafka/config/zookeeper.properties
サーバー間の認証の詳細は、ZooKeeper Wiki を参照してください。
クライアント/サーバー間の認証
クライアント/サーバー間の認証は、サーバー間の認証と同じ JAAS ファイルで設定されます。ただし、サーバー間の認証とは異なり、サーバー設定のみが含まれます。設定のクライアント部分は、クライアントで実行する必要があります。認証を使用して ZooKeeper に接続するように Kafka ブローカーを設定する方法は、Kafka インストール セクションを参照してください。
JAAS 設定ファイルにサーバーコンテキストを追加して、クライアント/サーバー間の認証を設定します。DIGEST-MD5 メカニズムの場合は、すべてのユーザー名とパスワードを設定します。
Server { org.apache.zookeeper.server.auth.DigestLoginModule required user_super="123456" user_kafka="123456" user_someoneelse="123456"; };
JAAS コンテキストの設定後、以下の行を追加して ZooKeeper 設定ファイルでクライアント/サーバー間の認証を有効にします。
requireClientAuthScheme=sasl authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider authProvider.2=org.apache.zookeeper.server.auth.SASLAuthenticationProvider authProvider.3=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
ZooKeeper クラスターの一部であるすべてのサーバーに authProvider.<ID>
プロパティーを追加する必要があります。
KAFKA_OPTS
環境変数を使用して、JAAS 設定ファイルを Java プロパティーとして ZooKeeper サーバーに渡します。
su - kafka export KAFKA_OPTS="-Djava.security.auth.login.config=/opt/kafka/config/zookeeper-jaas.conf"; /opt/kafka/bin/zookeeper-server-start.sh -daemon /opt/kafka/config/zookeeper.properties
Kafka ブローカーでの ZooKeeper 認証の設定に関する詳細は、「ZooKeeper の認証」 を参照してください。
5.3.3.2. DIGEST-MD5 を使用したサーバー間の認証の有効化
この手順では、ZooKeeper クラスターのノード間で SASL DIGEST-MD5 メカニズムを使用した認証を有効にする方法を説明します。
前提条件
- Streams for Apache Kafka がホストにインストールされている。
- ZooKeeper クラスターが複数のノードで 設定 されている。
SASL DIGEST-MD5 認証の有効化
すべての ZooKeeper ノードで、
/opt/kafka/config/zookeeper-jaas.conf
JAAS 設定ファイルを作成または編集し、以下のコンテキストを追加します。QuorumServer { org.apache.zookeeper.server.auth.DigestLoginModule required user_<Username>="<Password>"; }; QuorumLearner { org.apache.zookeeper.server.auth.DigestLoginModule required username="<Username>" password="<Password>"; };
ユーザー名とパスワードは両方の JAAS コンテキストで同一である必要があります。以下に例を示します。
QuorumServer { org.apache.zookeeper.server.auth.DigestLoginModule required user_zookeeper="123456"; }; QuorumLearner { org.apache.zookeeper.server.auth.DigestLoginModule required username="zookeeper" password="123456"; };
すべての ZooKeeper ノードで、
/opt/kafka/config/zookeeper.properties
ZooKeeper 設定ファイルを編集し、以下のオプションを設定します。quorum.auth.enableSasl=true quorum.auth.learnerRequireSasl=true quorum.auth.serverRequireSasl=true quorum.auth.learner.loginContext=QuorumLearner quorum.auth.server.loginContext=QuorumServer quorum.cnxn.threads.size=20
すべての ZooKeeper ノードを 1 つずつ再起動します。JAAS 設定を ZooKeeper に渡すには、
KAFKA_OPTS
環境変数を使用します。su - kafka export KAFKA_OPTS="-Djava.security.auth.login.config=/opt/kafka/config/zookeeper-jaas.conf"; /opt/kafka/bin/zookeeper-server-start.sh -daemon /opt/kafka/config/zookeeper.properties
5.3.3.3. DIGEST-MD5 を使用したクライアント/サーバー間の認証の有効化
この手順では、ZooKeeper クライアントと ZooKeeper との間で SASL DIGEST-MD5 メカニズムを使用した認証を有効にする方法を説明します。
前提条件
- Streams for Apache Kafka がホストにインストールされている。
- ZooKeeper クラスターが 設定され、実行されている。
SASL DIGEST-MD5 認証の有効化
すべての ZooKeeper ノードで、
/opt/kafka/config/zookeeper-jaas.conf
JAAS 設定ファイルを作成または編集し、以下のコンテキストを追加します。Server { org.apache.zookeeper.server.auth.DigestLoginModule required user_super="<SuperUserPassword>" user<Username1>_="<Password1>" user<USername2>_="<Password2>"; };
super
は自動的に管理者特権を持たせます。このファイルには複数のユーザーを含めることができますが、Kafka ブローカーが必要とする追加ユーザーは 1 つだけです。Kafka ユーザーに推奨される名前はkafka
です。以下の例は、クライアント/サーバー間の認証の
Server
コンテキストを示しています。Server { org.apache.zookeeper.server.auth.DigestLoginModule required user_super="123456" user_kafka="123456"; };
すべての ZooKeeper ノードで、
/opt/kafka/config/zookeeper.properties
ZooKeeper 設定ファイルを編集し、以下のオプションを設定します。requireClientAuthScheme=sasl authProvider.<IdOfBroker1>=org.apache.zookeeper.server.auth.SASLAuthenticationProvider authProvider.<IdOfBroker2>=org.apache.zookeeper.server.auth.SASLAuthenticationProvider authProvider.<IdOfBroker3>=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
authProvider.<ID>
プロパティーは、ZooKeeper クラスターの一部であるすべてのノードに追加する必要があります。3 ノードの ZooKeeper クラスターの設定例は以下のようになります。requireClientAuthScheme=sasl authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider authProvider.2=org.apache.zookeeper.server.auth.SASLAuthenticationProvider authProvider.3=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
すべての ZooKeeper ノードを 1 つずつ再起動します。JAAS 設定を ZooKeeper に渡すには、
KAFKA_OPTS
環境変数を使用します。su - kafka export KAFKA_OPTS="-Djava.security.auth.login.config=/opt/kafka/config/zookeeper-jaas.conf"; /opt/kafka/bin/zookeeper-server-start.sh -daemon /opt/kafka/config/zookeeper.properties
5.3.4. 認可
ZooKeeper はアクセス制御リスト (ACL) をサポートし、内部に保存されているデータを保護します。Kafka ブローカーは、他の ZooKeeper ユーザーが変更できないように、作成するすべての ZooKeeper レコードに ACL 権限を自動的に設定できます。
Kafka ブローカーで ZooKeeper ACL を有効にする方法は、「ZooKeeper の認可」 を参照してください。
5.3.5. TLS
ZooKeeper は、暗号化または認証用に TLS をサポートします。
5.3.6. その他の設定オプション
ユースケースに基づいて、以下の追加の ZooKeeper 設定オプションを設定できます。
maxClientCnxns
- ZooKeeper クラスターの単一のメンバーへの同時クライアント接続の最大数。
autopurge.snapRetainCount
-
保持される ZooKeeper のインメモリーデータベースのスナップショットの数。デフォルト値は
3
です。 autopurge.purgeInterval
-
スナップショットをパージするための時間間隔 (時間単位)。デフォルト値は
0
で、このオプションは無効になります。
利用可能なすべての設定オプションは、ZooKeeper のドキュメント を参照してください。