如何为docker容器订购kafka启动shell脚本?

gcxthw6b  于 2021-06-07  发布在  Kafka
关注(0)|答案(3)|浏览(381)

我正在尝试将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语句必须在服务器创建之后。
有什么好办法来安排启动顺序?

ut6juiuv

ut6juiuv1#

基本上你想先开始zk,然后是Kafka。然后以某种方式等到Kafka准备好(这是棘手的部分),与Kafka一起完成你的工作(例如,在你的案例中创建主题),然后等到Kafka和zk完成(中断时会发生什么)。

start-zookeeper &
ZK_PID=$!
start-kafka &
KAFKA_PID=$!

# that's the tricky part

wait_for_kafka
create-topic.sh

wait "${KAFKA_PID}"
wait "${ZK_PID}"

如前所述,Kafka的准备可能很棘手——以下方法可能会有所帮助:
等待Kafka响应读取请求(例如,使用 kafka-topic.sh --list (定期)
创建pocket consumer/adminclient(java kafka 0.11+)并获取元数据(类似于上述要点)
检查日志/控制器等的jmxbean是否存在。
正在检查侦听端口可用性

yv5phkfx

yv5phkfx2#

docker compose涵盖了许多在脚本中实现的编排任务。
这个 depends_on 以及 healthcheck 服务配置可用于创建适当的服务依赖关系,其中服务b在运行前等待服务a“正常”。
尽管compose还没有定义短时间运行任务的概念,但是主题创建始终可以在启动时运行,因此立即退出的附加服务可以正常工作。
github上有一个compose定义、dockerfile和check脚本来实现这个依赖项设置。

version: "2.1"

services:

  zookeeper:
    image: deployable/kafka:latest
    command: zookeeper
    ports:
     - "2181:2181"
    healthcheck:
      test: [ "CMD", "/kafka/check.sh", "zookeeper" ]
      interval: 30s
      timeout: 5s
      retries: 3

  kafka:
    image: deployable/kafka:latest
    command: kafka
    environment:
      ADVERTISE_LISTENERS: 'localhost:9092'
    ports:
     - "9092:9092"
    depends_on:
      zookeeper:
        condition: service_healthy
    healthcheck:
      test: ["CMD", "/kafka/check.sh", "kafka" ]
      interval: 30s
      timeout: 5s
      retries: 3

  kafka-setup:
    image: deployable/kafka:latest
    command: setup
    depends_on:
      kafka:
        condition: service_healthy
    environment:
      KAFKA_TOPIC: my-test-topic
4xy9mtcn

4xy9mtcn3#

我建议将主题创建 Package 到单独的脚本中,该脚本在尝试创建主题之前暂停,并在后台运行kafka服务器。比如:

start-zookeeper &
create-topic.sh &
start-kafka

create-topic.sh如下所示:

sleep 5s
kafka-topics --create...

p、 不过,与其睡觉,不如通过睡眠来了解Kafka的情况 nc -z

相关问题