我正在尝试将Kafka服务器装箱。kafka服务器的正常启动顺序如下:
A: start Zookeeper server
B: start Broker server
C: create topic
项目 A
以及 B
是一个长期运行的过程。以及 C
需要等待 B
跑上来。
所以我写了一个dockerfile ENTRYPOINT
为上述序列执行shell脚本:
# !/bin/sh
$KAFKA_HOME/bin/zookeeper-server-start.sh $KAFKA_HOME/config/zookeeper.properties &
$KAFKA_HOME/bin/kafka-server-start.sh $KAFKA_HOME/config/server.properties &
$KAFKA_HOME/bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test_topic
但是,在运行由此构建的docker映像时遇到了三个问题:
docker需要 ENTRYPOINT
进程将长期运行,而上面的脚本不会(只要主题创建完成,它就会退出)
brokerserver语句(第二个)是一个长时间运行的过程。目前我不得不把它作为后台进程使用结束 &
,否则它后面的语句根本不会执行(但是将其设置为后台也有问题:主题创建会立即执行,而代理服务器还没有准备好。)
我无法将broker server语句作为最后一个长时间运行的进程,因为topic creation语句必须在服务器创建之后。
有什么好办法来安排启动顺序?
3条答案
按热度按时间ut6juiuv1#
基本上你想先开始zk,然后是Kafka。然后以某种方式等到Kafka准备好(这是棘手的部分),与Kafka一起完成你的工作(例如,在你的案例中创建主题),然后等到Kafka和zk完成(中断时会发生什么)。
如前所述,Kafka的准备可能很棘手——以下方法可能会有所帮助:
等待Kafka响应读取请求(例如,使用
kafka-topic.sh --list
(定期)创建pocket consumer/adminclient(java kafka 0.11+)并获取元数据(类似于上述要点)
检查日志/控制器等的jmxbean是否存在。
正在检查侦听端口可用性
yv5phkfx2#
docker compose涵盖了许多在脚本中实现的编排任务。
这个
depends_on
以及healthcheck
服务配置可用于创建适当的服务依赖关系,其中服务b在运行前等待服务a“正常”。尽管compose还没有定义短时间运行任务的概念,但是主题创建始终可以在启动时运行,因此立即退出的附加服务可以正常工作。
github上有一个compose定义、dockerfile和check脚本来实现这个依赖项设置。
4xy9mtcn3#
我建议将主题创建 Package 到单独的脚本中,该脚本在尝试创建主题之前暂停,并在后台运行kafka服务器。比如:
create-topic.sh如下所示:
p、 不过,与其睡觉,不如通过睡眠来了解Kafka的情况
nc -z