如何确保docker kafka服务中的唯一代理ID

时间:2018-02-16 18:41:29

标签: docker apache-kafka docker-swarm

我想创建一个可伸缩的kafka集群,但每个kafka实例都需要一个唯一的代理ID。确保这一点的好方法是什么?

您可以在下面找到我用于部署我的应用程序的撰写文件。我正在使用docker stack deploy --compose-file docker-compose.yml mystack将其部署到我的docker swarm。目前,代理ID设置为1,但是当我将kafka实例的数量从1增加到2时,这将无效。 docker service scale <KAFKA-SERVICE-ID>=2,这就是我要解决的问题。

---
version: '3'
services:
  zookeeper:
    image: confluentinc/cp-zookeeper:latest
    environment:
      ZOOKEEPER_SERVER_ID: 1
      ZOOKEEPER_CLIENT_PORT: 22181
      ZOOKEEPER_TICK_TIME: 2000
      ZOOKEEPER_INIT_LIMIT: 5
      ZOOKEEPER_SYNC_LIMIT: 2
      ZOOKEEPER_SERVERS: localhost:22888:23888
    network_mode: host
    extra_hosts:
      - "moby:127.0.0.1"
  kafka:
    image: confluentinc/cp-kafka:latest
    network_mode: host
    depends_on:
      - zookeeper
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:22181
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:19092
    extra_hosts:
      - "moby:127.0.0.1"

2 个答案:

答案 0 :(得分:2)

事实证明,默认情况下,如果你没有为kafka分配一个经纪人ID,那么zookeeper会自动为kafka分配一个唯一的经纪人ID。因此,您可以安全地扩展或降低kafka服务,而无需考虑您自己的经纪人ID管理。有关详细信息,请参阅http://kafka.apache.org/090/documentation.html(搜索&#34; zookeeper序列从MaxReservedBrokerId + 1&#34开始;对于表中的相关行)。默认情况下,MaxReservedBrokerId为1000,因此您的第一个自动分配的代理ID将为1001,并且当您添加其他kafka容器时,zookeeper将按顺序分配。所以你的第二个kafka容器的经纪人ID为1002等。

答案 1 :(得分:0)

很好回答你的问题..你是否尝试使用环境变量......就像这样

$arr = array (
 'class_name' => array (1,2), 
 'zone1_price' => array ('a','s' ),
 'zone2_price' => array ('b', 't' ),
 'zone3_price' => array ('c', 'u' ),
 'zone4_price' => array ('d', 'v' )
);

$newarray = [];
foreach($arr as $key => $val){
    $newarray[$key] = $val[0];
}

注意针对KAFKA_BROKER_ID执行的替换,如果服务在同一节点上缩放,您可能还会遇到端口问题,但这是一个不同的问题需要解决。

因此,在扩展之前,只需将变量的值更改为某个不同的值,您也可以将其编写为脚本。

有关此内容的更多信息,请访问https://docs.docker.com/compose/environment-variables/#the-env-file

服务启动后,您可以在控制台日志中看到代理ID

version: '3'
services:
     zookeeper:
        image: confluentinc/cp-zookeeper:latest
        environment:
          ZOOKEEPER_SERVER_ID: 1
          ZOOKEEPER_CLIENT_PORT: 22181
          ZOOKEEPER_TICK_TIME: 2000
          ZOOKEEPER_INIT_LIMIT: 5
          ZOOKEEPER_SYNC_LIMIT: 2
          ZOOKEEPER_SERVERS: localhost:22888:23888
        network_mode: host
        extra_hosts:
          - "moby:127.0.0.1"
      kafka:
        image: confluentinc/cp-kafka:latest
        network_mode: host
        depends_on:
          - zookeeper
        environment:
          KAFKA_BROKER_ID: ${TAG}
          KAFKA_ZOOKEEPER_CONNECT: zookeeper:22181
          KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:19092
        extra_hosts:
          - "moby:127.0.0.1"