zoukankan      html  css  js  c++  java
  • kafka学习笔记01-docker搭建kafka集群

    Docker部署kafka集群

    前提: 安装docker和docker-compose

    下载镜像

    在dockerhub上搜索kafka, 发现并没有官方镜像, star数最多的wurstmeister/kafka, 他的描述信息就是支持多台kafka集群的, 这里我们就使用这个镜像

    同时kafka运行是需要依赖于zookeeper的, 所以也需要下载zookeeper镜像, 搜索发现zookpeer有官方镜像, 也有wurstmeister/zookeeper的镜像, 这里为了配合wurstmeister/kafka, 于是下载的镜像还是wurstmeister/zookeeper

    docker pull wurstmeister/kafka
    docker pull wurstmeister/zookeeper
    

    来到wurstmeister/kafka的GitHub地址:https://github.com/wurstmeister/kafka-docker, 可以查看使用文档, 这里我们也需要将GitHub上这些文件clone下来, 因为后面命令中会使用到

    git clone https://github.com/wurstmeister/kafka-docker.git
    

    启动kafka容器

    cd进入到本地clone kafka-docker后的文件夹中, 修改docker-compose.yml文件, 将里面的KAFKA_ADVERTISED_HOST_NAME的IP改为自己本机的IP

    version: '2'
    services:
      zookeeper:
        image: wurstmeister/zookeeper
        ports:
          - "2181:2181"
      kafka:
        build: .
        ports:
          - "9092"
        environment:
          DOCKER_API_VERSION: 1.22
          KAFKA_ADVERTISED_HOST_NAME: 10.0.72.47
          KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
    

    执行命令启动zookeeper和kafka

    docker-compose up -d
    

    此时会启动一个zookeeper和kafka容器, 启动kafka时会build当前文件路径下的Dockerfile

    我们运行下面的命令再新增两个容器, 总共启动了三个kafka, 启动时会自动给每个kafka broker分配不同的broker_id, 三个容器名依次为:

    kafka-docker_kafka_1 kafka-docker_kafka_2 kafka-docker_kafka_3

    docker-compose scale kafka=3
    

    容器间的通信

    查看docker的network信息, 可以看到名为docker_compose_default的网络

    # docker network ls
    28b5cd20af3c   docker_compose_default   bridge    local
    

    查看网络详情, 可以看到网络的网段, 以及网络中的容器情况, 由于是自定义的网络, 所以各个容器间可以直接通过容器名代替ip进行访问

    # docker network inspect kafka-docker_default
    [
        {
            "Name": "kafka-docker_default",
            "Driver": "bridge",
            "Containers": {
                "389f0bd818e3822260a6e3e8ad3843077d447ae3557b461ef9128836cc75091a": {
                    "Name": "kafka-docker_zookeeper_1",
                    "IPv4Address": "172.20.0.3/16",
                },
                "6e5489640e5e33b242b235a8fc6c30f8898d9901c851afaa4902dc1628fac9ab": {
                    "Name": "kafka-docker_kafka_2",
                    "IPv4Address": "172.20.0.5/16",
                },
                "d280e45a5c4af777bff5355d0c6d924c7a79ef29915753ec2a0f2ba68b9cbddc": {
                    "Name": "kafka-docker_kafka_1",
                    "IPv4Address": "172.20.0.2/16",
                },
                "f6797c1be92bfc0ad2001626b66697c69b60f729cc28d203c1c07b99e537271e": {
                    "Name": "kafka-docker_kafka_3",
                    "IPv4Address": "172.20.0.4/16",
                }
            },
        }
    ]
    

    执行命令操作kafka

    进入kafka容器内部

    docker exec -it kafka-docker_kafka_1 bash
    

    kafka安装在容器的/opt/kafka路径下

    bash-5.1# cd opt/kafka
    bash-5.1# ls
    LICENSE    NOTICE     bin        config     libs       licenses   logs       site-docs
    

    查看kafka版本

    kafka没有提供直接查看版本信息的命令, 需要进入到kafka的安装目录的libs路径下, 可以看到很多类似kafka_2.13-2.7.1-javadoc.jar这样的文件, 可以看出kafka版本, 其中前面的2.13是其开发语言Scala的版本,2.7.1是Kafka的版本

    创建topic

    cd到kafka安装目录/opt/kafka, 创建名为hello的topic

    # bin/kafka-topics.sh --create --topic hello --partitions 2 --replication-factor 3 --bootstrap-server kafka-docker_kafka_1:9092
    

    --partitions: 必输, 分区数

    --replication-factor: 必输, 副本数

    --bootstrap-server: 必输, kafka服务链接, 由于这里是集群, 所以只需要链接其中一个服务即可, 在之前版本使用的是--zookeeper参数, 表示数据会存放在zookeeper服务中, 现在推荐使用--bootstrap-server, 将数据存放在kafka服务中

    创建topic之后, 进入/kafka/kafka-logs-xxxxx目录, 可以看到两个partition数据, hello-0和hello-1, 在另外两个容器中也同样有这两个partition文件夹, 因为副本数为3

    # cd kafka-logs-dfd7d38517ef/
    # ls
    cleaner-offset-checkpoint         meta.properties
    hello-0                           recovery-point-offset-checkpoint
    hello-1                           replication-offset-checkpoint
    

    查看topic列表

    # bin/kafka-topics.sh --list --bootstrap-server kafka-docker_kafka_1:9092
    

    查看topic详情

    # bin/kafka-topics.sh --describe --topic hello --bootstrap-server kafka-docker_kafka_1:9092
    Topic: hello    PartitionCount: 2       ReplicationFactor: 3    Configs: segment.bytes=1073741824
            Topic: hello    Partition: 0    Leader: none    Replicas: 1003,1001,1002        Isr: 1003
            Topic: hello    Partition: 1    Leader: none    Replicas: 1002,1003,1001        Isr: 1003
    

    启动生产者

    # bin/kafka-console-producer.sh --topic hello --bootstrap-server kafka-docker_kafka_1:9092
    >
    

    启动消费者

    # bin/kafka-console-consumer.sh --topic hello --bootstrap-server kafka-docker_kafka_1:9092
    

    在生产者的shell中输入消息, 可以在消费者中接收到消息

    image-20211001140850601

  • 相关阅读:
    Netty和Akka有什么不同?
    GitHub & Bitbucket & GitLab & Coding 的对比分析
    Log4j和Log4j2的区别
    Spring中MultipartHttpServletRequest实现文件上传 生成缩略图
    JSP显示-下拉框
    jsp页面 date转化成string
    tomcat直接访问
    web项目中各种路径的获取HttpServletRequest
    遍历Map的四种方法
    mybatis There is no getter for property named 'xx' in 'class java.lang.String
  • 原文地址:https://www.cnblogs.com/gcxblogs/p/15408439.html
Copyright © 2011-2022 走看看