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

[kafka\-docker でローカルに kafka クラスタを構築する \- 駄文型](http://koheikimura.hatenablog.com/entry/2017/05/15/190000)より。

## 参考
- [wurstmeister/kafka-docker: Dockerfile for Apache Kafka](https://github.com/wurstmeister/kafka-docker)
- [Kafka Docker](http://wurstmeister.github.io/kafka-docker/)
- [Kafka in Dockerで分散メッセージングシステムを構築する - Qiita](http://qiita.com/masato/items/a13277842c245745c29b)

## 環境
- 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` を変更します。

```wurstmeister/kafka-docker/docker-compose.yml
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
起動します。

```sh
$ docker-compose up -d
```

### 4. Scale Kafka instances
Kafkaのインスタンスを2つにしてみます。

```sh
$ 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_PORT` は `32774` でした。

### 6. Start Kafka Shell
Kafka Shell を起動して Kafka の設定を行います。

```sh
$ ./start-kafka-shell.sh $DOCKER_HOST_IP $ZK_HOST:$ZK_PORT
```

- `$DOCKER_HOST_IP`: DockerホストのIP。 `dockcer-compose.yml` で `KAFKA_ADVERTISED_HOST_NAME` に設定した値。
- `$ZK_HOST`: この場合は `$DOCKER_HOST_IP` と同じ。
- `$ZK_PORT`: 5．で調べた値。

### 7. Create Topic
トピック名 `topic` 、パーティション数4でトピックを作成します。トピックについては [こちら](https://kafka.apache.org/intro#intro_topics)。 `kafka-topics.sh` の詳しい使い方は [こちら](https://kafka.apache.org/documentation/#basic_ops)。

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

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

```sh
$ ./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.sh` と `kafka-console-consumer.sh` を使ってみます。まずは producer を起動します。

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

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

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

## おわり
コンテナを止めます。

```sh
$ docker-compose stop
```

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