在Docker群上构build一个多节点的Kafka集群
我find了这个卡夫卡的docker形象
https://hub.docker.com/r/spotify/kafka/
我可以使用链接中logging的命令轻松创build一个docker容器
docker run -p 2181:2181 -p 9092:9092 --env ADVERTISED_HOST=`boot2docker ip` --env ADVERTISED_PORT=9092 spotify/kafka
这很好。 但是我想configuration一个运行在docker swarm上的“多个”节点的Kafka集群。
我怎样才能做到这一点?
编辑28/11/2017:
Kafka添加了listener.security.protocol.map
到他们的configuration 。 这允许你设置不同的监听地址和协议,这取决于你是在群内还是群外,并且阻止Kafka被Docker中发生的任何负载平衡或ip转换弄糊涂。 Wurstmeister有一个工作的docker图像和示例撰写文件在这里 。 我尝试了一段时间后,几个docker机节点设置为一个群体,它似乎工作。
tbh虽然我只是附加一个Kafka图像覆盖networking,并运行卡夫卡控制台命令时,我想现在与它进行交互。
希望有所帮助
老东西下面
我一直在使用docker swarm模式的Docker 1.12
创build节点
docker-machine create -d virtualbox master docker-machine create -d virtualbox slave master_config=$(docker-machine config master | tr -d '\"') slave_config=$(docker-machine config slave | 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 $slave_config swarm join --token $worker_token $master_ip:2377 eval $(docker-machine env master)
创buildzookeeper服务
docker service create --name zookeeper \ --constraint 'node.role == manager' \ -p 2181:2181 \ wurstmeister/zookeeper
创build卡夫卡服务
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
尽pipe由于某种原因,这只能在入口或用户定义的覆盖networking内工作,如果您尝试通过其中一台客户机连接到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中的新的网状networking和负载平衡可能会干扰Kafka连接。
获取主机容器我有一个烧瓶应用程序在本地运行,我curl
from flask import Flask from flask import request app = Flask(__name__) @app.route('/') def hello_world(): return request.remote_addr
以前的方法提出了一些问题:
- 如何指定zookeeper节点的ID?
- 如何指定卡夫卡节点和动物园pipe理员节点的ID?
#kafka configs echo "broker.id=${ID} advertised.host.name=${NAME} zookeeper.connect=${ZOOKEEPERS}" >> /opt/kafka/config/server.properties
一切都应该可以在覆盖networking中解决。
而且,在这个问题中,由于路由网状networking无法创buildKafka服务和发布端口,因此不要使用ingress
networking。
我认为最好的select是通过使用docker和swarm组合来指定你的服务。 我将用一个例子来编辑答案。
在server.properties中设置broker.id = -1以允许kafka自动生成代理标识。 在群模式中有用。