【Kafka】--bootstrap-serverと--zookeeperの違い

Kafkaのコマンドを扱っていると、コマンドの種類によって --bootstrap-server を指定する場合と --zookeeper を使う場合とがあって少し混乱する。どう違うのかを調べてみた。

bootstrap-serverとは

bootstrap-serverとして指定するのは、他でもないKafkaのbrokerである。brokerはKafkaクラスタを構成するサーバそのものであり、ProducerやConsumerとの間のリクエスト・レスポンスのキューイングや、ディスクへのデータの書き込み・読み出しなどを行っている。すなわち、brokerがTopicやPartitionを作り出しているともいえる。
多くの場合brokerは複数台設定されており、データの分散を可能にしている。

zookeeperとは

zookeeperはKafkaに限ったものではなく、分散データ処理を行う多くのシステムで使われている。zookeeperは分散システムを協調させるためのサービスであり、以下のようなことを行ってくれる。

  • ノード間での設定ファイルの共有
  • リソースのロック
  • 各ノードの状態管理

これにより、分散システム自体は各ノード間の状態の整合性を気にすることなく、データ処理に集中できる。

Kafkaでのzookeeperの役割は、既存Topicの設定確認や変更、ACLの管理など。詳細は以下のページが詳しい。

https://www.quora.com/What-is-the-actual-role-of-Zookeeper-in-Kafka-What-benefits-will-I-miss-out-on-if-I-don

Kafkaのコマンドにおける両者の役割

両者の役割をふまえると、求める操作の違いによってbootstrap-serverとzookeeperのどちらに接続すべきか異なることがわかる。基本的に、上記ページにあるzookeeperの役割に含まれる操作の際は --zookeeper が必要になる。
例えば、 kafka-configs.sh を使ってTopicの設定を変更したい場合は --zookeeper を指定する。一方、 kafka-topics.sh でTopicを新たに作る場合や、 kafka-console-producer.sh , kafka-console-consumer.sh でデータの送受信を行う場合は、brokerに接続すれば良いので --bootstrap-server を指定すればよい。

なお、1.0.0より前のKafkaでは、kafka-console-consumerを使う際にもzookeeperに接続していた。さらに、2.2.0より前は kafka-topics.sh もzookeeper接続が必須だった。Zookeeperに依存した操作をKafkaに寄せていく流れがあるようだ。