Kafka with Docker Swarm - 如何执行 Kafka 命令

Kafka with Docker Swarm - How to execute Kafka commands

刚接触Kafka,有点迷茫

到目前为止,我已经使用这些命令创建了两台 docker 机器,一个管理器和一个工人:

docker-machine create manager
docker-machine create worker1

我已将这两个节点添加到 docker 群中。

docker@manager:~$ docker node ls                                                                                                                                                                             
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
6bmovp3hr0j2w5irmexvvjgzq *   manager             Ready               Active              Leader              19.03.5
mtgbd9bg8d6q0lk9ycw10bxos     worker1             Ready               Active                                  19.03.5

我想在 docker swarm 中创建一个 kafka 集群。我的 docker-compose.yml 看起来像这样

version: '3.2'
services:
  zookeeper:
    image: wurstmeister/zookeeper
    ports:
      - "2181:2181"
  kafka:
    image: wurstmeister/kafka:latest
    ports:
      - target: 9094
        published: 9094
        protocol: tcp
        mode: host
    environment:
      HOSTNAME_COMMAND: "hostname | awk -F'-' '{print $}'"
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
      KAFKA_ADVERTISED_LISTENERS: INSIDE://:9092,OUTSIDE://_{HOSTNAME_COMMAND}:9094
      KAFKA_LISTENERS: INSIDE://:9092,OUTSIDE://:9094
      KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

其中 hostname | awk -F'-' '{print $}' 命令 returns manager of worker.

然后我使用 docker stack deploy -c docker-compose.yml kafka 命令部署 returns

Creating network kafka_default
Creating service kafka_zookeeper
Creating service kafka_kafka

我检查过该服务是 运行 docker service ls

ID                  NAME                MODE                REPLICAS            IMAGE                           PORTS
ttprq3ak98om        kafka_kafka         replicated          0/1                 wurstmeister/kafka:latest       
vxdhkaonrbpe        kafka_zookeeper     replicated          0/1                 wurstmeister/zookeeper:latest   *:2181->2181/tcp

然后我使用 docker service scale kafka_kafka=2 扩展服务。当我执行 docker service ps kafka_kafka 我得到

ID                  NAME                IMAGE                       NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
ydn64mwvlasr        kafka_kafka.1       wurstmeister/kafka:latest   worker1             Running             Running 27 minutes ago                       *:9094->9094/tcp
shkpd2jv6s29        kafka_kafka.2       wurstmeister/kafka:latest   manager             Running             Running 27 minutes ago                       *:9094->9094/tcp

到目前为止,我有一个 ZooKeeper 和两个 Kafka 代理。一名经纪人负责经理,一名经纪人负责工人。这意味着 worker 上的代理复制了 manager 上的代理?

另外我想知道如何运行 Kafka 命令在这一步。假设我想创建一个主题。我怎样才能做到这一点?我必须从这里下载 Kafka 二进制文件:https://kafka.apache.org/downloads?如果答案是肯定的,我必须部署 zookeeper 服务器吗?不是已经运行ning了吗?

到运行容器内的kafka命令需要先获取kafka容器id

$ docker ps -a  
  CONTAINER ID                 IMAGE  
   1239075412         wurstmeister/kafka:latest  

现在获取kafka的这个容器id(在你的情况下会有所不同)

$ docker exec -it 1239075412 sh  

日志存在于以下文件夹中

# cd kafka/kafka-logs-1239075412  

kafka 命令将出现在此容器类型 kafka- 中,然后按两次 Tab
您将获得所有用于创建 topics 等的 kafka 命令。

This means that the broker on worker replicates the broker on manager?

就你的问题而言,Kafka可以说是无主。所有代理功能均等,它们的进程仅相互通信以进行复制。

(如果你想深入内部,你可以研究一下控制器进程,它运行在其中一个代理上)

I have to strat the zookeeper server? Is it not running already?

是的,是的。参考 - kafka_zookeeper 图片。

Suppose that I want to create a topic. How can I achieve this?

好吧,您完全可以跳过使用 CLI 命令并使用另一个容器,例如 Kafka topic manager

I have to download Kafka binary from here

否则,是/否。如果您想从您的主持人 创建主题 ,那么是的。 在容器内 也适用(提示:学习 docker-compose exec