• dockercompose zookeeper、kafka集群 ⚓


    docker-compose zookeeper、kafka集群   ⚓

    原文链接:https://zlxian.com/index.php/archives/258/

    version: '3'
    services:
      zoo1:
        image:  zookeeper
        restart: unless-stopped
        hostname: zoo1
        ports:
          - "2181:2181"
          - "2881:2888"
          - "3881:3888"
        container_name: zookeeper
        networks:
           zoo_net:
              ipv4_address: 172.18.0.2
        extra_hosts:
          - "zoo1:172.18.0.2"
          - "zoo2:172.18.0.3"
          - "zoo3:172.18.0.4"
        volumes:
          - "/root/kafka/zoo1data:/data"
          - "/root/kafka/zoo1data_log:/datalog"
        environment:
          ZOO_MY_ID: 1
          ZOO_SERVERS: server.1=zoo1:2881:3881;2181 server.2=zoo2:2882:3882;2181 server.3=zoo3:2883:3883;2181
    
      zoo2:
        image:  zookeeper
        restart: unless-stopped
        hostname: zoo2
        container_name: zookeeper2
        networks:
           zoo_net:
              ipv4_address: 172.18.0.3
        extra_hosts:
          - "zoo1:172.18.0.2"
          - "zoo2:172.18.0.3"
          - "zoo3:172.18.0.4"
        ports:
          - "2182:2181"
          - "2882:2888"
          - "3882:3888"
        volumes:
          - "/root/kafka/zoo2data:/data"
          - "/root/kafka/zoo2data_log:/datalog"
    
        environment:
          ZOO_MY_ID: 2
          ZOO_SERVERS: server.1=zoo1:2881:3881;2181 server.2=zoo2:2882:3882;2181 server.3=zoo3:2883:3883;2181
    
      zoo3:
        image:  zookeeper
        restart: unless-stopped
        hostname: zoo3
        container_name: zookeeper3
        networks:
           zoo_net:
              ipv4_address: 172.18.0.4
        extra_hosts:
          - "zoo1:172.18.0.2"
          - "zoo2:172.18.0.3"
          - "zoo3:172.18.0.4"
        ports:
          - "2183:2181"
          - "2883:2888"
          - "3883:3888"
        volumes:
          - "/root/kafka/zoo3data:/data"
          - "/root/kafka/zoo3data_log:/datalog"
    
        environment:
          ZOO_MY_ID: 3
          ZOO_SERVERS: server.1=zoo1:2881:3881;2181 server.2=zoo2:2882:3882;2181 server.3=zoo3:2883:3883;2181
    
      kafka1:
        image: wurstmeister/kafka
        ports:
          - "9092:9092"
        extra_hosts:
          - "zoo1:172.18.0.2"
          - "zoo2:172.18.0.3"
          - "zoo3:172.18.0.4"
        networks:
          - zoo_net
        restart: always
    
        environment:
          KAFKA_ADVERTISED_HOST_NAME: 192.161.87.218                     ## 修改:宿主机IP
          KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.161.87.218:9092    ## 修改:宿主机IP
          KAFKA_ZOOKEEPER_CONNECT: "zoo1:2181"
          KAFKA_ADVERTISED_PORT: 9092
          KAFKA_BROKER_ID: 1
          KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
        volumes:
          - "/root/kafka/kafka1-data:/kafka"
        depends_on:
          - zoo1
        container_name: kafka1
      kafka2:
        image: wurstmeister/kafka
        networks:
          - zoo_net
        restart: always
        ports:
          - "9093:9092"
        extra_hosts:
          - "zoo1:172.18.0.2"
          - "zoo2:172.18.0.3"
          - "zoo3:172.18.0.4"
        volumes:
          - "/root/kafka/kafka2-data:/kafka"
        environment:
          KAFKA_ADVERTISED_HOST_NAME: 192.161.87.218           ## 修改:宿主机IP
          KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.161.87.218:9093   ## 修改:宿主机IP
          KAFKA_ZOOKEEPER_CONNECT: "zoo1:2181"
          KAFKA_ADVERTISED_PORT: 9093
          KAFKA_BROKER_ID: 2
          KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
        depends_on:
          - zoo1
        container_name: kafka2
      kafka3:
        image: wurstmeister/kafka
        ports:
          - "9094:9092"
        restart: always
        extra_hosts:
          - "zoo1:172.18.0.2"
          - "zoo2:172.18.0.3"
          - "zoo3:172.18.0.4"
        volumes:
          - "/root/kafka/kafka3-data:/kafka"
    
        networks:
          - zoo_net
        environment:
          KAFKA_ADVERTISED_HOST_NAME: 192.161.87.218          ## 修改:宿主机IP
          KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.161.87.218:9094   ## 修改:宿主机IP
          KAFKA_ZOOKEEPER_CONNECT: "zoo1:2181"
          KAFKA_ADVERTISED_PORT: 9094
          KAFKA_BROKER_ID: 3
          KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
        depends_on:
          - zoo1
        container_name: kafka3
      kafka4:
        image: wurstmeister/kafka
        ports:
          - "9095:9092"
        restart: always
        extra_hosts:
          - "zoo1:172.18.0.2"
          - "zoo2:172.18.0.3"
          - "zoo3:172.18.0.4"
        volumes:
          - "/root/kafka/kafka4-data:/kafka"
    
        networks:
          - zoo_net
        environment:
          KAFKA_ADVERTISED_HOST_NAME: 192.161.87.218          ## 修改:宿主机IP
          KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.161.87.218:9095   ## 修改:宿主机IP
          KAFKA_ZOOKEEPER_CONNECT: "zoo1:2181"
          KAFKA_ADVERTISED_PORT: 9095
          KAFKA_BROKER_ID: 4
          KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
        depends_on:
          - zoo1
        container_name: kafka4
    
    
    
      kafka-manager:
        image: sheepkiller/kafka-manager              ## 镜像:开源的web管理kafka集群的界面
        networks:
          - zoo_net
        environment:
            ZK_HOSTS: 192.161.87.218                   ## 修改:宿主机IP
        ports:
          - "9000:9000"                               ## 暴露端口
        depends_on:
          - kafka3
    
    networks:
      zoo_net:
        ipam:
          config:
          - subnet: 172.18.0.0/16
    
    
    #创建topic
    docker exec kafka1 \
    kafka-topics.sh \
    --create --topic topic001 \
    --partitions 4 \
    --zookeeper zookeeper:2181 \
    --replication-factor 3
    
    #获取topic列表
    docker exec kafka1 \
    kafka-topics.sh --list \
    --zookeeper zookeeper:2181
    
    #进入kafka消费者
    docker exec kafka1 \
    kafka-console-consumer.sh \
    --topic topic001 \
    --bootstrap-server kafka1:9092,kafka2:9092,kafka:9093,kafka:9094
    
    进入kafka生产者
    docker exec -it kafka1 \
    kafka-console-producer.sh \
    --topic topic001 \
    --broker-list kafka1:9092,kafka2:9092,kafka:9093,kafka:9094

    PartitionsReplication Factor调整准则

    Partition 数目与Replication Factor是在创建一个topic时非常重要的两个参数,这两个参数的取值会直接影响到系统的性能与稳定性。

    尽量在第一次创建一个topic时就指定这两个参数,因为

    • 如果Partition 数目在之后再次做调整,则会打乱key的顺序保证(同样的key会分布到不同的partition上)
    • 如果Replication Factor在之后再次增加,则会给集群带来更大的压力,可能会导致性能下降

    1. Partition 数目

    一般来说,每个partition 能处理的吞吐为几MB/s(仍需要基于根据本地环境测试后获取准确指标),增加更多的partitions意味着:

    • 更高的并行度与吞吐
    • 可以扩展更多的(同一个consumer group中的)consumers
    • 若是集群中有较多的brokers,则可更大程度上利用闲置的brokers
    • 但是会造成Zookeeper的更多选举
    • 也会在Kafka中打开更多的文件

    调整准则:

    • 一般来说,若是集群较小(小于6个brokers),则配置2 x broker数的partition数。在这里主要考虑的是之后的扩展。若是集群扩展了一倍(例如12个),则不用担心会有partition不足的现象发生
    • 一般来说,若是集群较大(大于12个),则配置1 x broker 数的partition数。因为这里不需要再考虑集群的扩展情况,与broker数相同的partition数已经足够应付常规场景。若有必要,则再手动调整
    • 考虑最高峰吞吐需要的并行consumer数,调整partition的数目。若是应用场景需要有20个(同一个consumer group中的)consumer并行消费,则据此设置为20个partition
    • 考虑producer所需的吞吐,调整partition数目(如果producer的吞吐非常高,或是在接下来两年内都比较高,则增加partition的数目)

    以上仅是几个基本准则,最重要的是:在本地集群做测试,以获取一个更合适的partition数目,不同的集群会有不同的性能。

    2. Replication factor

    此参数决定的是records复制的数目,建议至少 设置为2,一般是3,最高设置为4。更高的replication factor(假设数目为N)意味着:

    • 系统更稳定(允许N-1个broker宕机)
    • 更多的副本(如果acks=all,则会造成较高的延时)
    • 系统磁盘的使用率会更高(一般若是RF为3,则相对于RF为2时,会占据更多50% 的磁盘空间)

    调整准则:

    • 以3为起始(当然至少需要有3个brokers,同时也不建议一个Kafka 集群中节点数少于3个节点)
    • 如果replication 性能成为了瓶颈或是一个issue,则建议使用一个性能更好的broker,而不是降低RF的数目
    • 永远不要在生产环境中设置RF为1

    3. 集群调整建议

    一个已被业界接受的准则是:

    • 一个broker不应该承载超过2000 到 4000 个partitions(考虑此broker上所有来自不同topics的partitions)。同时,一个Kafka集群上brokers中所有的partitions总数最多不应超过20,000个。

    此准则基于的原理是:在有broker宕机后,zookeeper需要重新做选举。若是partitions数目过多,则需要执行大量的leader elections。

    另外几个常规原则有:

    • 如果集群中需要更多的partitions,则优先考虑增加brokers
    • 如果集群中需要20,000 个以上的partitions,则可以参考Netflix的模型,创建更多的Kafka 集群

    最后需要注意的是:不要为一个topic创建超过1000个的partitions。我们也并不需要1000个partitions才能达到很高的吞吐。在开始的时候,选择一个更合理的partition数目,然后测试性能,根据测试结果再调整partitions 数目。

    4. 术语

    • broker
    • topic
    • stream
    • partition
    • offset
    • producer
    • consumer
    • consumer group

    要了解这些术语,我们先看下kafka整个消息处理过程:

    消息由producer产生,消息按照topic归类,并发送到broker中,broker中保存了一个或多个topic的消息,consumer通过订阅一组topic的消息,通过持续的poll操作从broker获取消息,并进行后续的消息处理。

    • broker
      一个kafka集群包含一个或多个服务器,这些服务器称为broker,保存producer发送的消息
    • topic
      每条发送到broker的消息都有一个类别,这个类别称为topic
    • partition
      一个topic的消息实际上由多个队列存储的,一个队列在kafka上称为一个分区
    • producer
      负责发送指定topic的消息到broker
    • consumer
      消息读取客户端,通过订阅一组topic的消息从broker拉取消息
    • consumer group
      每隔consumer术语一个消费者组,具有相同的group.id的消费客户端术语同一个消费者。通过设置一个消息消费者group.id是否相同可以分为单播消费(集群消费)或广播消费

    假如一个消费者组有两个消费者,订阅了一个具有4个分区的topic的消息,那么这个消费者组的每一个消费者都会消费两个分区的消息。

    消费者组的成员是动态维护的,如果新增或者减少了消费者组中的消费者,那么每隔消费者消费的分区的消息也会动态变化。比如原来一个消费者有两个消费者,其中一个消费者因为故障而不能继续消费消息了,那么剩下一个消费者将会消费全部4个分区的消息。

      • offset
        偏移量。kafka为每条在分区的消息保存一个偏移量offset,这也是消费者在分区的位置。比如一个偏移量是5的消费者,表示已经消费了从0-4偏移量的消息,下一个要消费的消息的偏移量是5
  • 相关阅读:
    webpack 学习
    文件操作
    关于列表remove的操作和字符串split的操作新领悟
    深浅拷贝和基础类型补充
    小数据池和编码
    字典和集合
    列表和元组
    字符串理论
    递归遍历多层列表
    基本数据类型和操作
  • 原文地址:https://www.cnblogs.com/haoee/p/16302110.html
Copyright © 2020-2023  润新知