docker - 在 docker swarm 上搭建多节点 Kafka 集群

标签 docker apache-kafka docker-swarm

我为 Kafka 找到了这个 docker 镜像

https://hub.docker.com/r/spotify/kafka/

我可以使用链接中记录的命令轻松创建 docker 容器

docker run -p 2181:2181 -p 9092:9092 --env ADVERTISED_HOST=`boot2docker ip` --env ADVERTISED_PORT=9092 spotify/kafka

这很好。但我想配置一个在 docker swarm 上运行的“多”节点 Kafka 集群。

我该怎么做?

最佳答案

2017 年 11 月 28 日编辑:

Kafka 将 listener.security.protocol.map 添加到他们的 config .这允许您根据您是在集群内部还是外部设置不同的监听器地址和协议(protocol),并防止 Kafka 被 docker 中发生的任何负载平衡或 IP 转换弄糊涂。 Wurstmeister has a working docker image和示例 compose file here .前段时间我尝试了这个,将几个 docker 机器节点设置为一个集群,它似乎可以工作。

虽然我只是将 Kafka 图像附加到覆盖网络并在我现在想与之交互时运行 Kafka 控制台命令。

希望有帮助


下面的旧东西

我一直在使用 docker swarm 模式在 docker 1.12 上尝试这个

创建节点

docker-machine create -d virtualbox  master
docker-machine create -d virtualbox  worker
master_config=$(docker-machine config master | tr -d '\"')
worker_config=$(docker-machine config worker | tr -d '\"')
master_ip=$(docker-machine ip master)
docker $master_config swarm init --advertise-addr $master_ip --listen-addr $master_ip:2377
worker_token=$(docker $master_config swarm join-token worker -q)
docker $worker_config swarm join --token $worker_token  $master_ip:2377
eval $(docker-machine env master)

创建动物园管理员服务

docker service create --name zookeeper \
    --constraint 'node.role == manager' \
    -p 2181:2181 \
    wurstmeister/zookeeper

创建 kafka 服务

docker service create --name kafka \
    --mode global \
    -e 'KAFKA_PORT=9092' \
    -e 'KAFKA_ADVERTISED_PORT=9092' \
    -e 'KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092' \
    -e 'KAFKA_ZOOKEEPER_CONNECT=tasks.zookeeper:2181' \
    -e "HOSTNAME_COMMAND=ip r | awk '{ ip[\$3] = \$NF } END { print ( ip[\"eth0\"] ) }'" \
    --publish '9092:9092' \
    wurstmeister/kafka

尽管出于某种原因,这只能在入口或用户定义的覆盖网络中工作,如果您尝试通过其中一台 guest 计算机连接到 Kafka,则与 Kafka 的连接将中断。

更改公布的 IP 并没有让事情变得更好......

docker service create --name kafka \
    --mode global \
    -e 'KAFKA_PORT=9092' \
    -e 'KAFKA_ADVERTISED_PORT=9092' \
    -e 'KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092' \
    -e 'KAFKA_ZOOKEEPER_CONNECT=tasks.zookeeper:2181' \
    -e 'KAFKA_LOG_DIRS=/kafka/kafka-logs' \
    -e "HOSTNAME_COMMAND=curl 192.168.99.1:5000" \
    --publish '9092:9092' \
    wurstmeister/kafka

我认为 docker 中的新网状网络和负载平衡可能会以某种方式干扰 Kafka 连接......

为了获取主机容器,我在本地运行了一个 flask 应用程序,我 curl

from flask import Flask
from flask import request

app = Flask(__name__)

@app.route('/')
def hello_world():
    return request.remote_addr

关于docker - 在 docker swarm 上搭建多节点 Kafka 集群,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37428269/

相关文章:

docker - 如何使用领事初始化Docker群

docker - Docker Swarm工作人员如何进行 self 检查?

docker - 使用裸机服务器开始使用 docker swarm

docker - 如何将Web前端链接到后端

postgresql - 在 docker 中使用 pg_dump 出现“没有现有的本地集群适合”错误

node.js - 如何在nodejs中创建带分区的kafka主题?

java - 当从不同主题中具有相同键的主题加载 GlobalKTable 时会发生什么?

ubuntu - aufs au_opts_parse :1155:docker[2010] unknown option dirperm1

python - 从Docker容器中的Django + Celery对API超时进行故障排除

apache-kafka - 无论如何,对于kafka Streams应用程序中的不同输入主题,是否可以使用不同的 auto.offset.reset 策略?