About
I am a software engineer and want to retire before the age of 35 and stop working so hard.
I am a software engineer and want to retire before the age of 35 and stop working so hard.
基于 Docker 的 Kafka 配置指南(二) 本文将指导您如何使用 Docker 配置 Kafka,包括安装 Docker 和 Docker Compose、编写 docker-compose.yml 文件、模拟生产者和消费者,以及使用 Kafka GUI 工具进行管理。 目录 安装 Docker & Docker Compose 配置 docker-compose.yml 文件 启动 Kafka 集群 模拟生产者和消费者 使用 Kafka GUI 工具 1. 安装 Docker & Docker Compose 请根据您的操作系统访问以下官方页面,按照指南安装 Docker: Docker 安装文档 安装 Docker Compose 的详细步骤请参考: Docker Compose 安装指南 2. 配置 docker-compose.yml 文件 在项目目录下创建一个 docker-compose.yml 文件,并填入以下内容: version: '3.8' services: zookeeper: image: wurstmeister/zookeeper container_name: zookeeper ports: - "2181:2181" restart: always kafka1: image: wurstmeister/kafka depends_on: - zookeeper container_name: kafka1 ports: - "9091:9091" environment: HOSTNAME: kafka1 KAFKA_BROKER_ID: 0 KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka1:9091 KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9091 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181/kafka extra_hosts: - "kafka1:10.36.234.160" kafka2: image: wurstmeister/kafka depends_on: - zookeeper container_name: kafka2 ports: - "9092:9092" environment: HOSTNAME: kafka2 KAFKA_BROKER_ID: 1 KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka2:9092 KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181/kafka extra_hosts: - "kafka2:10.36.234.160" kafka3: image: wurstmeister/kafka depends_on: - zookeeper container_name: kafka3 ports: - "9093:9093" environment: HOSTNAME: kafka3 KAFKA_BROKER_ID: 2 KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka3:9093 KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9093 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181/kafka extra_hosts: - "kafka3:10.36.234.160" 注意:请将 10.36.234.160 替换为机器的实际 IP 地址。 ...
kafka就是一种消息队列的具体实现,那么问题来了,什么情况下会使用消息队列呢。 信息是会要在不同的系统中传递的,最简单的例子就是使用点对点连接:A系统需要把信息给到B系统进行处理,我们在A和B之间建立起一条通路就行,然而在实际的情况中,A系统还会把信息给到C系统去处理, 整体架构就会变成下面这样: 这种架构的劣势就是需要维护多个数据通道,每个数据通道都需要考虑数据丢失的,流量过大等问题,会增大维护成本 解决方案就是在中间增加一个发布订阅系统, 这就是消息队列需要解决的问题。 但是这个发布订阅系统是制定的,如果同一个公司不同的业务场景需要发布订阅系统,则需要针对不同的业务场景进行定制: 然而在实际的业务场景中,需要可能需要多个消息订阅系统,所以需要一个单一的集中式系统,于是出现了kafka,一个通用的消息订阅发布系统。 kafka基本概念 producer 生产者,就是生产消息的系统,将消息传递给kafka,在A->B的点对点连接中,生产者就是对应的A consumer 消费者,就是消费消息的系统,从kafka中获取消息,在A->B的点对点连接中,消费者就是对应的B kafka消费者还有一个消费者组的概念(consumer group), kafka的消费者组包含有多个消费者,一个组的消费者可以同时从生产者中获取数据,每个消费者获取的数据是不同的(这里有更多的细节,后面会详细说明) broker 一个单独的kafka服务器被称作broker,broker接收来自生产者的消息,并将消息存储到磁盘中,然后为消费者提供消息。 topic 在生产和消费端,消费者和生产者简介产生关联的具体中间层就是topic,生产者往一个topic中写入数据,消费者从一个topic中获取数据,往往一个业务属性的数据都会只放到一个topic中,一个broker可以有多个tpoic partition 一个topic中存在多个partition,一个partition只能给一个topic使用,partition的作用提升消费速度(后面会详细讲) broker集群 上面讲到,一个单独的kafka服务器被称作broker,那么多个broker组合起来的就是broker集群,集群中会存在一个broker充当首领,控制整个集群 上面讲的几个概念总结一下就是下面这张图: 其他: topic,一个topic会有多个partition,但是一个partition也会有多个副本,也就是replica,其中的一个就是首领副本,在数据传输过程中,会将数据首先存储在首领副本上,然后首领副本会将数据复制到其他副本中(复制时机和机制后面会讲) 需要注意的是,通常一个partition的副本会存在在多个服务器中,而不是只存在在一个服务器中 消费者集群,前面说的一个消费者集群会有多个消费者,一个partition只会对接一个消费者,存在三种情况,如果partition的数量大于消费者,则存在一个消费者会从多个partition中获取数据,如果partition的数量等于消费者,则每一个消费者只会对接一个partition,如果partition的数量小于消费者,则多的消费者会闲置 有序性,kafka只会保证同一个partition里面的信息消费有序,不同partition里面的数据不会有序 消息保留,很多场景选择使用kafka也是因为它能将消息保留,保留的机制通常是:保留7天或者保留1G内的数据,超过7天或者大于1G内的数据则删除 kafka的优势 多个生产者 kafka支持多个生产者往同一个topic里面写数据 多个消费者 一个topic可以呗多个消费者订阅,每个消费者获取的数据都是重复的,这不同于一些队列系统。(这里的消费者不是消费者组中的消费者) 数据持久化 kafka的数据会持久化的保留在磁盘中,可以根据业务的属性来自定义保留机制,并根据topic来单独进行设计 伸缩性 kafka具备灵活的伸缩性,可以在业务刚开始的时候只用一个broker,在业务发展到一定阶段后,扩展多个broker 高性能 Kafka可以轻松处理巨大的消息流。在处理大量数据的同时,它还能保证亚秒级的消息延迟 生态 kafka发展至今已经有了非常好的生态,并且在很多业务系统中有很多的实践 应用场景 1、消息传递 Kafka也可以用于收集应用程序以及系统的指标和日志。Kafka的多生产者特性在这个时候就派上用场了。应用程序定期把指标发布到Kafka主题上,监控系统或告警系统会读取这些消息。Kafka也可以被用在离线处理系统(如Hadoop)中,进行较长时间片段的数据分析,比如年度增长走势预测。我们也可以把日志消息发布到Kafka主题上,然后再路由给专门的日志搜索系统(如Elasticsearch)或安全分析应用程序。更改目标系统(如日志存储系统)不会影响前端应用程序或聚合方法,这是Kafka的另一个优点。 2、缓冲与削峰 当系统负载突然增大时,消息队列可以作为缓冲池,帮助缓解瞬间的压力,从而避免系统过载崩溃 3、日志传输 Kafka也可以用于收集应用程序以及系统的指标和日志。Kafka的多生产者特性在这个时候就派上用场了。应用程序定期把指标发布到Kafka主题上,监控系统或告警系统会读取这些消息。Kafka也可以被用在离线处理系统(如Hadoop)中,进行较长时间片段的数据分析,比如年度增长走势预测。我们也可以把日志消息发布到Kafka主题上,然后再路由给专门的日志搜索系统(如Elasticsearch)或安全分析应用程序。更改目标系统(如日志存储系统)不会影响前端应用程序或聚合方法,这是Kafka的另一个优点。 4、流式数据处理 流式处理是另一个包含多种类型应用程序的领域。虽然可以认为大部分Kafka应用程序是基于流式处理,但真正的流式处理通常是指提供了类似map/reduce(Hadoop)处理功能的应用程序。Hadoop通常依赖较长时间片段的数据聚合,可以是几小时或几天。流式处理采用实时的方式处理消息,速度几乎与生成消息一样快。开发人员可以通过用流式处理框架开发小型应用程序来处理Kafka消息,执行一些常见的任务,比如指标计数、对消息进行分区或使用多个数据源的数据来转换消息。