駄文型

プログラミングとか英語とかの話題を中心にした至極ちゃらんぽらんな日記です。

kafka-docker でローカルに kafka クラスタを構築する

参考

環境

  • OS X El Captain 10.11.6
  • docker 17.03.1-ce
  • docker-compose 1.11.2

手順

1. Download kafka-docker

$ git clone git@github.com:wurstmeister/kafka-docker.git

2. Update docker-compose.yml

docker-compose.yml を編集して zookeeper の Port と KAFKA_ADVERTISED_HOST_NAME を変更します。

version: '2'
services:
  zookeeper:
    image: wurstmeister/zookeeper
    ports:
      - "2181:2181" # "2181"に変更する
  kafka:
    build: .
    ports:
      - "9092"
    environment:
      KAFKA_ADVERTISED_HOST_NAME: 192.168.99.100 # ifconfig で調べる
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

3. Start the cluster

起動します。

$ docker-compose up -d

4. Scale Kafka instances

Kafkaのインスタンスを2つにしてみます。

$ docker-compose scale kafka=2

5. Note ZK_PORT

Kafka Shell に入る前に zookeeper コンテナのポートを確認しておきます。

                Name                              Command               State                          Ports
-----------------------------------------------------------------------------------------------------------------------------------
66f23109d78a_kafkadocker_zookeeper_1   /bin/sh -c /usr/sbin/sshd  ...   Up      0.0.0.0:32774->2181/tcp, 22/tcp, 2888/tcp, 3888/tcp
kafkadocker_kafka_1                    start-kafka.sh                   Up      0.0.0.0:32775->9092/tcp
kafkadocker_kafka_2                    start-kafka.sh                   Up      0.0.0.0:32773->9092/tcp

この場合、 ZK_PORT32774 でした。

6. Start Kafka Shell

Kafka Shell を起動して Kafka の設定を行います。

$ ./start-kafka-shell.sh $DOCKER_HOST_IP $ZK_HOST:$ZK_PORT
  • $DOCKER_HOST_IP: DockerホストのIP。 dockcer-compose.ymlKAFKA_ADVERTISED_HOST_NAME に設定した値。
  • $ZK_HOST: この場合は $DOCKER_HOST_IP と同じ。
  • $ZK_PORT: 5.で調べた値。

7. Create Topic

トピック名 topicパーティション数4でトピックを作成します。トピックについては こちらkafka-topics.sh の詳しい使い方は こちら

$ $KAFKA_HOME/bin/kafka-topics.sh --create --topic topic \
--partitions 4 --zookeeper $ZK --replication-factor 1 # `$KAFKA_HOME/bin/` は省略できました。

確認

1. Describe topic

トピック名、パーティション数などを確認します。

$ ./start-kafka-shell.sh $DOCKER_HOST_IP $ZK_HOST:$ZK_PORT
$ $KAFKA_HOME/bin/kafka-topics.sh --describe --topic topic --zookeeper $ZK
Topic:topic     PartitionCount:4        ReplicationFactor:1     Configs:
        Topic: topic    Partition: 0    Leader: 1002    Replicas: 1002  Isr: 1002
        Topic: topic    Partition: 1    Leader: 1010    Replicas: 1010  Isr: 1010
        Topic: topic    Partition: 2    Leader: 1009    Replicas: 1009  Isr: 1009
        Topic: topic    Partition: 3    Leader: 1010    Replicas: 1010  Isr: 1010 

2. Start a producer

kafka-console-producer.shkafka-console-consumer.sh を使ってみます。まずは producer を起動します。

$ $KAFKA_HOME/bin/kafka-console-producer.sh --topic=topic \
--broker-list=`broker-list.sh`

3. Start a consumer

次に、別のシェルから consumer を起動します。 producer 側のシェルに入力した文字が表示されれば成功です!

$ ./start-kafka-shell.sh $DOCKER_HOST_IP $ZK_HOST:$ZK_PORT
$ $KAFKA_HOME/bin/kafka-console-consumer.sh --topic=topic --zookeeper=$ZK

おわり

コンテナを止めます。

$ docker-compose stop

ハマったところ

  1. zookeeper コンテナのポート設定
    • 2181:2181 から 2181 に変更する必要がありました。
  2. KAFKA_ADVERTISED_HOST_NAME の設定
    • チュートリアルに「Macの場合は docker-machine ip で確認した値を入れる」とあったので、docker-machine上でコンテナを立ち上げないとだめなのか?といろいろ右往左往してしましました。
  3. start-kafka-shell.sh に渡す zookeeper のポート
    • docker-compose ps あるいは docker ps で確認する必要があったのですが、はじめは間違った値を入れていました。
  4. トピックの設定
    • パーティション数を4にしたかったのですが、うまくいかずに kafka-topics.sh --delete したり kafka-topics.sh --alter したりしてました。

続編: kafka-docker で作った kafka クラスタに Elixir クライアントから接続する - 駄文型