Apache Kafkaの環境構築 + Quickstart


Kafkaを環境構築から、サクッと触ってみる。
環境はvirtualbox-vagrant-ansibleで作る

# 環境

- macos 10.12.5
- Vagrant 1.9.7
- ansible 2.3.1.0
- VirtualBox 5.1.24

# quickstart

https://kafka.apache.org/quickstart
に記載していることをやってみる。

本来provider-blaker-consumerと３つの役割ごとにサーバを立てるべきだが、quickstartでは一つのサーバで実行している。

## 構築

### vagrant Vagrantfile

- Ubuntu 16.04 LTS “Xenial Xerus”を利用する。

```Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/xenial64"

  config.vm.provider "virtualbox" do |vb|
     vb.memory = "2048"
  end

  config.vm.provision "ansible_local" do |ansible|
    ansible.playbook = "playbook.yml"
  end
end
```

### ansible playbook.yml

- Kafkaの動作にはscalaとjavaが必要。
- 20170723時点で最新バージョン(kafka_2.11-0.11.0.0.tgz)


```playbook.yml
- hosts: all
  become: yes

  vars:
    scala_version: "2.11"
    kafka_version: "0.11.0.0"

    install_dir: "/opt"
    symlink_name: "kafka"
    kafka_name: "kafka_{{ scala_version }}-{{ kafka_version }}"
    kafka_download_url: "http://ftp.yz.yamagata-u.ac.jp/pub/network/apache/kafka/{{ kafka_version }}/{{ kafka_name }}.tgz"

  tasks:
  - name: ensure openjdk8 present
    apt:
      name: "openjdk-8-jdk"
      state: present
      update_cache: yes

  - name: ensure kafka present
    unarchive:
      remote_src: yes
      src: "{{ kafka_download_url }}"
      dest: "{{ install_dir }}"

  - name: ensure symlink present
    file:
      src: "{{ install_dir }}/{{ kafka_name }}"
      dest: "{{ install_dir }}/{{ symlink_name }}"
      mode: 0755
      state: link
```

## Kafkaを動かしてみる

インストールしたフォルダに移動

```
$ cd /opt/kafka
```

フォルダ構成はこんな感じになってる。

```
kafka/
	config/ #サーバの設定ファイルなどが保管
	bin/ #起動やテストのシェル類
	libs/ #libs zookeeperをはじめとるlibが保管
	site-docs/ #tgz本体を保管
	LICENSE
	NOTICE
```

Kafka(Broker)の裏で、[Zookeeper](https://ja.wikipedia.org/wiki/Apache_ZooKeeper)というサービスを動かす必要がある。大規模な分散処理はZooKeeperを利用しているんですね。

ZooKeeperを起動(localhost:2181)

```
$ bin/zookeeper-server-start.sh config/zookeeper.properties
```

Kafka(Broker localhost:9092)の起動

```
$ bin/kafka-server-start.sh config/server.properties
```

topic作成

```
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
```

作成したtopicを確認

```
$ bin/kafka-topics.sh --list --zookeeper localhost:2181
test
```

Producer,Consumerの動作についてはシェルが用意されており、それらを叩くことでテストができる。（実際の利用時はAPI形式になるんだっけな、ここではあくまで動作のテスト）

メッセージ送信（Producer）
※メッセージ入力し終えたらCtrl+Cで抜ける
```
$ bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
>This is a test message
>This is a second test message
```

メッセージの受信（Consumer）

```
$bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
This is a test message
This is a second test message
```

## マルチクラスタ化する（未完了）

同一サーバ上でポートを変えてマルチクラスタを実装してみる。（本来なら別環境で構築するんだろうけど、設定を見ればどこを変えればいいかはなんとなく見えてくる）

config/server.propertiesを編集

```
$ sudo cp config/server.properties config/server-1.properties
$ sudo cp config/server.properties config/server-2.properties
```


…つかれたので今日はおしまい。また気分が向いたらquickstart編までは書き切ります。


# 参考

本家
https://kafka.apache.org

Kafkaの説明がよく分かるサイト
http://deeeet.com/writing/2015/09/01/apache-kafka/
http://fuji-151a.hatenablog.com/entry/2014/02/23/231639

vagrant,ansibleを利用した環境構築の際に参考にしたサイト
https://github.com/eucuepo/vagrant-kafka
http://bufferings.hatenablog.com/entry/2017/05/02/163901