Difference between revisions of "Apache Kafka"

From berki WIKI
Jump to: navigation, search
Line 1: Line 1:
  
  
 
+
file: confluentinc_swarm1.yaml
<source lang="yml">
+
<source lang="yaml">
 
version: '3.2'
 
version: '3.2'
 
services:
 
services:
 
   zookeeper:
 
   zookeeper:
     image: wurstmeister/zookeeper
+
     image: confluentinc/cp-zookeeper:5.1.2
 
     networks:
 
     networks:
 
       - kafa-net
 
       - kafa-net
Line 13: Line 13:
 
         constraints:
 
         constraints:
 
         - node.role == worker
 
         - node.role == worker
 +
    environment:
 +
      ZOOKEEPER_CLIENT_PORT: 32181
 +
      ZOOKEEPER_TICK_TIME: 2000
 +
      ZOOKEEPER_SYNC_LIMIT: 2
 
   kafka:
 
   kafka:
     image: wurstmeister/kafka:latest
+
     image: confluentinc/cp-kafka:5.1.2
 
     networks:
 
     networks:
 
       - kafa-net
 
       - kafa-net
 
     ports:
 
     ports:
       - target: 9094
+
       - target: 29092
         published: 9094
+
         published: 29092
 
         protocol: tcp
 
         protocol: tcp
 
         mode: host
 
         mode: host
Line 27: Line 31:
 
         - node.role == worker
 
         - node.role == worker
 
     environment:
 
     environment:
      HOSTNAME_COMMAND: "kafka"
+
       KAFKA_ZOOKEEPER_CONNECT: zookeeper:32181
       KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
+
       KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092
       KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
+
       KAFKA_BROKER_ID: 2
      KAFKA_ADVERTISED_LISTENERS: INSIDE://:9092,OUTSIDE://_kafka:9094
+
       KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      KAFKA_LISTENERS: INSIDE://:9092,OUTSIDE://:9094
 
       KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
 
    volumes:
 
       - /var/run/docker.sock:/var/run/docker.sock
 
 
 
 
 
 
networks:
 
networks:
 
   kafa-net:
 
   kafa-net:
 
     driver: overlay
 
     driver: overlay
 
</source>
 
</source>
 +
Fontos, hogy 3.2-es verziót használjunk, mert csak abban lehet a portokat részletesen definiálni. A mode:host azt jelenti, hogy nem az ingress hálózaton publikálja a portot a swarm, hanem csak azon a node-on ahova telepítve van, tehát nem lesz load-balance-olt a kafka. Ez arra kell, hogy ha több példányban is futtatnánk, akkor az összes példány ugyan azon a porton legyen publikálva...
 +
 +
 +
<pre>
 +
# docker node ls
 +
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS
 +
kse3a58x6f34o7wp7mxum7nux    worker2            Ready              Active             
 +
n39y1bvv50r7o12bijmm57kl2    worker0            Ready              Active             
 +
ux3lwoqql2hiv6l9ylyx2rkar *  mg0                Ready              Active              Leader
 +
zwumqwkmo32zkg79gqztff397    worker1            Ready              Active             
 +
</pre>
 +
 +
 +
<pre>
 +
docker stack deploy -c confluentinc_swarom.yml confluent
 +
Creating service confluent_kafka
 +
Creating service confluent_zookeeper
 +
</pre>
 +
 +
 +
Keressük meg melyik node-on van a kafka.
 +
<pre>
 +
# docker service ps confluent_kafka
 +
ID                  NAME                IMAGE                        NODE        DESIRED STATE  PORTS
 +
w74azzl3qzwa        confluent_kafka.1  confluentinc/cp-kafka:5.1.2  worker1    Running        *:29092->29092
 +
</pre>
 +
Lépjünk be ssh-val a worker1 node-ra, majd lépjünk be az ott futó Kafka konténerbe.
 +
 +
 +
<pre>
 +
# docker-machine ssh worker1
 +
                        ##        .
 +
                  ## ## ##        ==
 +
              ## ## ## ## ##    ===
 +
          /"""""""""""""""""\___/ ===
 +
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
 +
          \______ o          __/
 +
            \    \        __/
 +
              \____\_______/
 +
_                _  ____    _            _
 +
| |__  ___  ___ | |_|___ \ __| | ___  ___| | _____ _ __
 +
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
 +
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__|  <  __/ |
 +
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
 +
Boot2Docker version 17.12.0-ce, build HEAD : 378b049 - Wed Dec 27 23:39:20 UTC 2017
 +
Docker version 17.12.0-ce, build c97c6d6
 +
</pre>
 +
 +
 +
Majd a kafak vezérlő script-ekkel hozzunk létre egy topikot, majd egy producer-el tegyünk bele üzeneteket, amit kiolvasunk majd egy consumer-el:
 +
<pre>
 +
docker@worker1:/$ docker ps
 +
CONTAINER ID        IMAGE                       
 +
2f32b3ecaabd        confluentinc/cp-kafka:5.1.2
 +
</pre>
 +
 +
<pre>
 +
docker@worker1:/$ docker exec -it 2f32b3ecaabd /bin/bash
 +
root@2f32b3ecaabd:/#
 +
</pre>
 +
 +
A kafka-topic paranccsal hozzuk létre az adam nevű topoicot. A parancsnak meg kell adni a zookeeper elérhetőségét. Mivel swarm stack ben fut a kafak és a zookeeper, a kafka konténeren belül használhatjuk a stack beli nevét a zookeeper-nek mivel közös overlay hálózaton van a kafka konténerrel.
 +
<pre>
 +
# host zookeeper
 +
zookeeper has address 10.0.2.8
 +
Host zookeeper not found: 3(NXDOMAIN)
 +
 +
/usr/bin/kafka-topics --create --zookeeper zookeeper:32181 --replication-factor 1 --partitions 1 --topic adam
 +
Created topic "adam".
 +
</pre>
 +
 +
Listázzuk ki a topic-okat:
 +
<pre>
 +
root@2f32b3ecaabd:/# /usr/bin/kafka-topics --list --zookeeper zookeeper:32181
 +
__confluent.support.metrics
 +
adam
 +
</pre>
 +
 +
 +
Indítsuk el a Kafka producer-t és küldjünk be pár üzenetet. A bootstrap-server-nek a kafka domain névvel hivatkozhatunk, mert ez volt a stack-ben a service neve, így ezt fel fogja oldani a swarm DNS szerver. Minden ENTER leütéssel egy új üzenetet küldünk be a topic-ba.
 +
<pre>
 +
root@2f32b3ecaabd:/# /usr/bin/kafka-console-producer --broker-list kafka:29092 --topic adam
 +
>msg1
 +
>msg2
 +
</pre>
 +
 +
 +
Töltsük le a lokális gépünkre a Kafka-t és navigáljunk a bin mappába, majd indítsuk el a comnsumer-t a lokális gépen. A Kafa bootstrap-server-nek a worker1 node IP címét kell megadni, ahol a Kafa fut.
 +
<pre>
 +
[adam@adamDell2 bin]$ ./kafka-console-consumer.sh --bootstrap-server 192.168.42.95:29092 --topic adam --from-beginning
 +
msg1
 +
msg2
 +
</pre>

Revision as of 11:06, 23 March 2019


file: confluentinc_swarm1.yaml

version: '3.2'
services:
  zookeeper:
    image: confluentinc/cp-zookeeper:5.1.2
    networks:
      - kafa-net
    deploy:
      placement:
        constraints:
         - node.role == worker
    environment:
      ZOOKEEPER_CLIENT_PORT: 32181
      ZOOKEEPER_TICK_TIME: 2000
      ZOOKEEPER_SYNC_LIMIT: 2
  kafka:
    image: confluentinc/cp-kafka:5.1.2
    networks:
      - kafa-net
    ports:
      - target: 29092
        published: 29092
        protocol: tcp
        mode: host
    deploy:
      placement:
        constraints:
         - node.role == worker
    environment:
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:32181
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092
      KAFKA_BROKER_ID: 2
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
networks:
  kafa-net:
    driver: overlay

Fontos, hogy 3.2-es verziót használjunk, mert csak abban lehet a portokat részletesen definiálni. A mode:host azt jelenti, hogy nem az ingress hálózaton publikálja a portot a swarm, hanem csak azon a node-on ahova telepítve van, tehát nem lesz load-balance-olt a kafka. Ez arra kell, hogy ha több példányban is futtatnánk, akkor az összes példány ugyan azon a porton legyen publikálva...


# docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS
kse3a58x6f34o7wp7mxum7nux     worker2             Ready               Active              
n39y1bvv50r7o12bijmm57kl2     worker0             Ready               Active              
ux3lwoqql2hiv6l9ylyx2rkar *   mg0                 Ready               Active              Leader
zwumqwkmo32zkg79gqztff397     worker1             Ready               Active              


docker stack deploy -c confluentinc_swarom.yml confluent
Creating service confluent_kafka
Creating service confluent_zookeeper


Keressük meg melyik node-on van a kafka.

# docker service ps confluent_kafka
ID                  NAME                IMAGE                         NODE        DESIRED STATE   PORTS
w74azzl3qzwa        confluent_kafka.1   confluentinc/cp-kafka:5.1.2   worker1     Running         *:29092->29092

Lépjünk be ssh-val a worker1 node-ra, majd lépjünk be az ott futó Kafka konténerbe.


# docker-machine ssh worker1
                        ##         .
                  ## ## ##        ==
               ## ## ## ## ##    ===
           /"""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
           \______ o           __/
             \    \         __/
              \____\_______/
 _                 _   ____     _            _
| |__   ___   ___ | |_|___ \ __| | ___   ___| | _____ _ __
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__|   <  __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
Boot2Docker version 17.12.0-ce, build HEAD : 378b049 - Wed Dec 27 23:39:20 UTC 2017
Docker version 17.12.0-ce, build c97c6d6


Majd a kafak vezérlő script-ekkel hozzunk létre egy topikot, majd egy producer-el tegyünk bele üzeneteket, amit kiolvasunk majd egy consumer-el:

docker@worker1:/$ docker ps
CONTAINER ID        IMAGE                        
2f32b3ecaabd        confluentinc/cp-kafka:5.1.2 
docker@worker1:/$ docker exec -it 2f32b3ecaabd /bin/bash
root@2f32b3ecaabd:/# 

A kafka-topic paranccsal hozzuk létre az adam nevű topoicot. A parancsnak meg kell adni a zookeeper elérhetőségét. Mivel swarm stack ben fut a kafak és a zookeeper, a kafka konténeren belül használhatjuk a stack beli nevét a zookeeper-nek mivel közös overlay hálózaton van a kafka konténerrel.

# host zookeeper
zookeeper has address 10.0.2.8
Host zookeeper not found: 3(NXDOMAIN)

/usr/bin/kafka-topics --create --zookeeper zookeeper:32181 --replication-factor 1 --partitions 1 --topic adam
Created topic "adam".

Listázzuk ki a topic-okat:

root@2f32b3ecaabd:/# /usr/bin/kafka-topics --list --zookeeper zookeeper:32181
__confluent.support.metrics
adam


Indítsuk el a Kafka producer-t és küldjünk be pár üzenetet. A bootstrap-server-nek a kafka domain névvel hivatkozhatunk, mert ez volt a stack-ben a service neve, így ezt fel fogja oldani a swarm DNS szerver. Minden ENTER leütéssel egy új üzenetet küldünk be a topic-ba.

root@2f32b3ecaabd:/# /usr/bin/kafka-console-producer --broker-list kafka:29092 --topic adam
>msg1
>msg2


Töltsük le a lokális gépünkre a Kafka-t és navigáljunk a bin mappába, majd indítsuk el a comnsumer-t a lokális gépen. A Kafa bootstrap-server-nek a worker1 node IP címét kell megadni, ahol a Kafa fut.

[adam@adamDell2 bin]$ ./kafka-console-consumer.sh --bootstrap-server 192.168.42.95:29092 --topic adam --from-beginning
msg1
msg2