Oracle Cloud Infrastructure環境でKafkaを動かしてみる

# はじめに

Oracle Cloud Infrastructure上でKafkaを使用するには、いくつかの選択肢があります。

- PaaSを利用する ([Oracle Event Hub Cloud Service](https://cloud.oracle.com/ja_JP/event-hub))
- IaaSでComputeノード上に構築する
  
後者の場合、[Terraformスクリプトで事前定義済みの構成を簡単にdeploy](https://github.com/cloud-partners/oci-confluent) する方法があります。が、今回は使用できるCloudリソース(VM数)の都合で、1台のCompute Node上に手動インストールしたものを利用しました。

## 環境
- Oracle Cloud Infrastructure 上 の Computeインスタンス (VM Instance)
- OS: CentOS 7
- Private IPアドレス：10.0.1.3　とする
    - Oracle Cloud Infrastructure 環境で Computeインスタンスを作成すると、VCN(仮想ネットワーク)内で使用するPrivate IPアドレスと、グローバルにアクセス可能なPublic IPアドレスが付与されます

## インストール内容
- Confluent社が配布するディストリビューション(Confluent Platform)のOSS版
    - confluent-platform-oss-2.11
- rootユーザで rpmインストール
- Kafkaの起動停止は confluentユーザで行う

# インストール

rootで実行

```
# rpm --import http://packages.confluent.io/rpm/3.2/archive.key

# cat /etc/yum.repos.d/confluent.repo
[Confluent.dist]
name=Confluent repository (dist)
baseurl=http://packages.confluent.io/rpm/3.2/7
gpgcheck=1
gpgkey=http://packages.confluent.io/rpm/3.2/archive.key
enabled=1

[Confluent]
name=Confluent repository
baseurl=http://packages.confluent.io/rpm/3.2
gpgcheck=1
gpgkey=http://packages.confluent.io/rpm/3.2/archive.key
enabled=1

# yum clean all
# yum install confluent-platform-oss-2.11
```

## ユーザとディレクトリの作成

```
# mkdir /var/lib/zookeeper
# mkdir /var/lib/kafka <== 今回はすでに存在していた
# chmod a+w /var/lib/zookeeper (乱暴だが一旦コレで)
# chmod a+w /var/lib/kafka (同上)
# adduser confluent
# passwd confluent
```

## 設定ファイルの編集(rootで)

OCI上の別のComputeと通信できるよう、IPアドレスを設定する。(オリジナルの設定ファイルではlocalhostでのみ通信可能)

それぞれ設定ファイルを編集。以下のエントリを探してlocalhost指定ではなくPrivate IPアドレスを指定するよう変更する。

- 後でKafka Connectを動かすので、ここではKafka Connect用の設定ファイルも一緒に編集している。(/etc/kafka/connect-distributed.properties)

```:/etc/kafka/server.properties
listeners=PLAINTEXT://10.0.1.3:9092
```

```:/etc/kafka/connect-distributed.properties
bootstrap.servers=10.0.1.3:9092
```

## 起動
confluentユーザで実施。zookeeper, kafka server, kafka connectorを順に起動。

- 後でKafka Connectを動かすので、ここでは schema-registry と Kafka Connect(connect-distributed) も一緒に起動している。

```
$ /usr/bin/zookeeper-server-start /etc/kafka/zookeeper.properties
$ /usr/bin/kafka-server-start /etc/kafka/server.properties
$ /usr/bin/schema-registry-start /etc/schema-registry/schema-registry.properties
$ connect-distributed /etc/kafka/connect-distributed.properties
```

# Kafkaを動かしてみる

TOPICの作成 (TOPIC名:mytest1とする)

```
$ kafka-topics --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic mytest1
```

Consumerの起動

```
$ kafka-console-consumer --bootstrap-server 10.0.1.3:9092 --topic mytest1
```

Producerの起動

```
$ kafka-console-producer --broker-list 10.0.1.3:9092 --topic mytest1
```

Producer側のコンソールに何か入力すると、Consumer側のコンソールに同じ文字列が表示される。
ここでは、「hello world!」と入力。

consumer側(起動したコンソール)：

```
$ kafka-console-consumer --bootstrap-server 10.0.1.3:9092 --topic mytest1
hello world! <-- Producer側から投入したメッセージが表示される
```

# (Optional): VNCのインストール

作業効率化目的でVNCをインストールし起動

```
# yum groupinstall "Server with GUI"
# yum install vnc-server　

$ vncserver :1
```

# (Optional): PORTの開放とFirewall設定

リモートマシンからのTOPICへの投入ができるよう設定する。具体的には、Oracle CloudのVCN(仮想ネットワーク)のPORT開放と、VMインスタンスのFirewall設定を行う。

[設定方法はこちら](https://qiita.com/mikika/items/f61ba65fe4cf70c2d6f0#%E3%81%93%E3%81%AE%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E7%92%B0%E5%A2%83%E5%9B%BA%E6%9C%89%E3%81%AE%E8%A8%AD%E5%AE%9A%E5%A4%89%E6%9B%B4) 
※PORT 9092と5901に読み替えて実施。(Kafka:9092, VNC:5901)


# 参考
- [チュートリアル : Oracle Cloud Infrastructure を使ってみよう](https://community.oracle.com/docs/DOC-1019313)
- [Confluent - Installation - RPM packages via yum](https://docs.confluent.io/3.2.0/installation.html#rpm-packages-via-yum)