Docker Kafka

0X00 CentOS部署kafka

CentOS7搭建Kafka环境 - 简书Kafka是一个分布式流平台,基于Zookeeper的分布式消息系统;具有高吞吐量、高性能、实时及高可用等特点由服务器和客户端组成,通过高性能的TCP网络协议进行通信。 一、...https://www.jianshu.com/p/7b633fbf5552

0X01 部署Docker版Kafka

镜像:

Docker Hubhttps://registry.hub.docker.com/r/bitnami/kafka

命令:

docker pull bitnami/zookeeper:latest
docker pull bitnami/kafka:latest

docker-compose.yml:

version: "3"
services:
  zookeeper:
    image: 'bitnami/zookeeper:latest'
    ports:
      - '2181:2181'
    environment:
      - ALLOW_ANONYMOUS_LOGIN=yes
  kafka:
    image: 'bitnami/kafka:latest'
    ports:
      - '9092:9092'
    environment:
      - KAFKA_BROKER_ID=1
      - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092
      - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://127.0.0.1:9092
      - KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181
      - ALLOW_PLAINTEXT_LISTENER=yes
    depends_on:
      - zookeeper

持久化存储并且额外暴露9093端口的docker-compose.yml:

version: "3"
services:
  zookeeper:
    image: 'bitnami/zookeeper:latest'
    ports:
      - '2181:2181'
    environment:
      - ALLOW_ANONYMOUS_LOGIN=yes
  kafka:
    image: 'bitnami/kafka:latest'
    ports:
      - '9092:9092'
      - '9093:9093'
    volumes:
      - /home/docker/kafka/kafka_data:/bitnami/kafka
    environment:
      - KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181
      - ALLOW_PLAINTEXT_LISTENER=yes
      - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CLIENT:PLAINTEXT,EXTERNAL:PLAINTEXT
      - KAFKA_CFG_LISTENERS=CLIENT://:9092,EXTERNAL://:9093
      - KAFKA_CFG_ADVERTISED_LISTENERS=CLIENT://kafka:9092,EXTERNAL://localhost:9093
      - KAFKA_CFG_INTER_BROKER_LISTENER_NAME=CLIENT
    depends_on:
      - zookeeper

0X02 执行kafka脚本

官方提供了很多脚本来帮助管理kafka,这些脚本可以在容器内找到:

docker exec CONTAINER_ID find / -name kafka*.sh

Docker Kafka_第1张图片

 但是由于咱们使用的是docker版kafka,宿主机是没有java环境和相关依赖的,所以这些脚本不能拷贝到宿主机然后运行,那么我们就需要使用docker exec命令来运行,例如:

docker exec eeeb99126aa4 /opt/bitnami/kafka/bin/kafka-topics.sh --list --bootstrap-server 127.0.0.1:9092

0X03 常用命令

查看topics的详细描述
./kafka-topics.sh --describe --bootstrap-server 192.168.119.130:9092

查看topcis列表
./kafka-topics.sh --list --bootstrap-server 192.168.119.130:9092

启动zookeeper
./zookeeper-server-start.sh -daemon ../config/zookeeper.properties

关闭zookeeper
./zookeeper-server-stop.sh

启动kafka
./kafka-server-start.sh -daemon ../config/server.properties

关闭kafka
./kafka-server-stop.sh

查看topics里面的数据
kafka-console-consumer.sh --bootstrap-server 192.168.119.130:9092 --topic zfd --from-beginning

0X04 Kafka入门

1.基础概念

(1)kafka是开源的分布式事件流处理平台,讲人话:消息队列&消息持久化存储&分布式

(2)kafka三大关键功能:

        1)发布(写入)和订阅(读取)事件流,包括从其他系统持续导入/导出数据 。

        2)根据需要持久可靠地 存储事件流。

        3)在事件发生时或回顾性 地处理事件流。

(2)kafka如何工作?

        Kafka 是一个分布式系统,由通过高性能TCP 网络协议进行通信的服务器客户端组成。它可以部署在本地和云环境中的裸机硬件、虚拟机和容器上。

        服务器:Kafka 作为一个或多个服务器的集群运行,可以跨越多个数据中心或云区域。其中一些服务器形成存储层,称为代理。其他服务器运行 Kafka Connect以将数据作为事件流持续导入和导出,以将 Kafka 与您现有的系统(如关系数据库以及其他 Kafka 集群)集成。为了让您实现关键任务用例,Kafka 集群具有高度可扩展性和容错性:如果其中任何一个服务器出现故障,其他服务器将接管它们的工作,以确保持续运行而不会丢失任何数据。

        客户端:它们允许您编写分布式应用程序和微服务,以并行、大规模和容错方式读取、写入和处理事件流,即使在网络问题或机器故障的情况下也是如此。Kafka 附带了一些这样的客户端,这些客户端由 Kafka 社区提供的 数十个客户端进行了扩充:客户端可用于 Java 和 Scala,包括更高级别的 Kafka Streams库,用于 Go、Python、C/C++ 和许多其他编程语言以及 REST API。

2.术语

(1)Event记录了世界或您的业务中“发生了某事” 的事实。在文档中也称为recordmessage。当您向 Kafka 读取或写入数据时,您以Event的形式执行此操作。从概念上讲,Event具有键、值、时间戳和可选的元数据标头。这是一个示例事件:

  • Event Key:“爱丽丝”
  • Event Value:“向 Bob 支付了 200 美元”
  • Event Timestamp:“2020 年 6 月 25 日下午 2:06”

(2)生产者是那些向 Kafka 发布(写入)事件的客户端应用程序,而消费者是订阅(读取和处理)这些事件的那些客户端应用程序。在 Kafka 中,生产者和消费者完全解耦并且彼此不可知,这是实现 Kafka 众所周知的高可扩展性的关键设计元素。例如,生产者永远不需要等待消费者。Kafka 提供了各种保证,例如一次性处理事件的能力。

(3)事件被组织并持久地存储在topics中。非常简化,topics类似于文件系统中的文件夹,事件是该文件夹中的文件。示例topics名称可以是“付款”。Kafka 中的topics始终是多生产者和多订阅者:一个topics可以有零个、一个或多个向其写入事件的生产者,以及零个、一个或多个订阅这些事件的消费者。topics中的事件可以根据需要随时读取——与传统的消息传递系统不同,事件在消费后不会被删除。相反,您可以通过每个主题的配置设置来定义 Kafka 应该将您的事件保留多长时间,之后旧事件将被丢弃。Kafka 的性能在数据大小方面实际上是恒定的,因此长时间存储数据是非常好的。

(4)topics分区的,这意味着一个topics分布在位于不同 Kafka 代理上的多个“桶”中。数据的这种分布式放置对于可伸缩性非常重要,因为它允许客户端应用程序同时从多个代理读取和写入数据。当一个新事件发布到一个topics时,它实际上是附加到主题的分区之一。具有相同event key(例如,客户或车辆 ID)的事件被写入同一个分区,并且 Kafka保证给定topics分区的任何消费者将始终以与写入事件完全相同的顺序读取该分区的事件。

Docker Kafka_第2张图片

Docker Kafka_第3张图片

       

         每个分区都是一个有序的,不可变的记录序列,不断附加到结构化的提交日志中。分区中的记录每个都分配了一个称为偏移的顺序ID号,它唯一地标识分区中的每个记录。

  Kafka集群持久保存所有已发布的Event - 无论是否已使用 - 使用可配置的保留期。例如,如果保留策略设置为两天,则在发布记录后的两天内,它可供使用,之后将被丢弃以释放空间。Kafka的性能在数据大小方面实际上是恒定的,因此长时间存储数据不是问题。

Docker Kafka_第4张图片

        实际上,基于每个消费者保留的唯一元数据是该消费者在日志中的偏移或位置。这种偏移由消费者控制:通常消费者在读取记录时会线性地提高其偏移量,但事实上,由于该位置由消费者控制,因此它可以按照自己喜欢的任何顺序消费记录。例如,消费者可以重置为较旧的偏移量来重新处理过去的数据,或者跳到最近的记录并从“现在”开始消费。

  这些功能组合意味着Kafka 消费者consumers 非常cheap - 他们可以来来往往对集群或其他消费者没有太大影响。例如,您可以使用我们的命令行工具“tail”任何主题的内容,而无需更改任何现有使用者所消耗的内容。

  日志中的分区有多种用途。首先,它们允许日志扩展到超出适合单个服务器的大小。每个单独的分区必须适合托管它的服务器,但主题可能有许多分区,因此它可以处理任意数量的数据。其次,它们充当了并行性的单位 - 更多的是它。

(5)为了使您的数据具有容错性和高可用性,可以复制每个topics,甚至跨地理区域或数据中心,以便始终有多个代理拥有数据副本,以防万一出现问题,您想要对经纪人进行维护,等等。一个常见的生产设置是复制因子为 3,即始终存在三个数据副本。此复制在topics分区级别执行。

3.Producer & Consumer

(1)Producer

Producers 将数据发布到指定的topics。同时Producer 也能决定将此消息归属于哪个partition;比如基于"round-robin"方式或者通过其他的一些算法等。

(2)Consumer

Docker Kafka_第5张图片

  • 每个consumer属于一个consumer group,每个group中可以有多个consumer.发送到Topic的消息,只会被订阅此Topic的每个group中的一个consumer消费
  • 如果所有消费者实例具有相同的消费者组,则记录将有效地在使用者实例上进行负载平衡
  • 如果所有消费者实例具有不同的消费者组,则每个记录将广播到所有消费者进程

你可能感兴趣的:(Docker,kafka,docker)