Kafka的基本概念

Kafka基本概念

1、主题

​ Kafka将一组消息抽象归纳为一个主题(Topic),也就是说,一个主题就是对消息的一个分类,生产者将消息发送到特定主题,消费者订阅主题或主题的某些分区进行消费。

2、消息

​ 消息是Kafka通信的基本单位,由一个固定长度的消息头和一个可变长度的消息体构成。在由Java重新实现的客户端中,每一条消息被称为Record。

3、分区和副本

​ Kafka将一组消息归纳为一个主题,而每个主题又被分成一个或多个分区(Partition)。每个分区由一系列有序、不可变的消息组成,是一个有序队列。

分区是保证Kafka消息被顺序消费以及对消息进行负载均衡的基础。

Kafka只能保证一个分区之内消息的有序性,并不能保证跨分区消息的有序性。

4、Leader副本和Follower副本

​ 由于Kafka副本的存在,就需要保证一个分区的多个副本之间数据的一致性,Kafka会选择该分区的一个副本作为Leader副本,而该分区其他副本即为Follower副本,只有Leader副本才负责处理客户端的读写请求,Follower副本从Leader副本同步数据。

​ 副本Follower与Leader的角色并不是固定不变的,如果Leader失效,通过相应的选举算法将从其他Follower副本中选出新的Leader副本。

5、偏移量

​ 任何发布到分区的消息会被直接追加到日志文件的尾部,而每条消息在日志文件中的位置都会对应一个按序递增的偏移量,偏移量是一个分区下严格有序的逻辑值,并不表示消息在磁盘上的物理位置。

​ 消费者可以通过控制消息偏移量来对消息进行消费,为了保证消息被顺序消费,消费者已消费的消息对应的偏移量也需要保存。

6、日志段

​ 一个日志又被划分为多个日志段(LogSegment),日志段是Kafka日志对象分片的最小单位,与日志对象一样,日志段也是一个逻辑概念,一个日志段对应磁盘上一个具体的日志文件和两个索引文件。

日志文件是以“.log”为文件名后缀的数据文件,用于保存消息实际数据;

两个索引文件分别以“.index”和“.timeindex”作为文件名后缀,分别表示消息偏移量索引文件和消息时间戳索引文件。

7、代理

​ 我们将Kafka集群中每一个Kafka实例称为代理(Broker),通常也称为Kafka服务器(KafkaServer)。集群中每一个代理都一个唯一id,为任意非负整数。这个id就是代理的名字,也就是在启动代理时配置的broker.id对应的值。

8、生产者

​ 生产者(Producer)负责将消息发送给代理,也就是向Kafka代理发送消息的客户端。

9、消费者和消费者组

​ 消费者(consumer)以拉取方式拉取数据,它是消费的客户端。在Kafka中每一个消费者都属于一个特定的消费组(ConsumerGroup),我们可以为每个对消费者指定一个消费组,以groupId代表消费组名称,通过group.id配置设置。如果不指定消费组则该消费者属于默认消费组test-consumer-group。

​ 同时,每个消费者也有一个全局唯一的id,通过配置项client.id指定。如果客户端没有消费者的id,Kafka会自动为该消费者生成一个全局唯一的id,格式为$ {groupld }-$ {hostN ame }-$ {times tamp}-$ {UUID 字符}同一个主题的一条消息只能被同一个消费组下某一个消费者消费,但不同消费组的消息可同时消费该消息。

10、ISR(In-sync Replica)

​ Kafka在Zookeeper中动态维护了一个ISR,即保存同步的副本列表,该列表中保存的是与Leader副本保持消息同步的所有副本对应的代理节点id。如果一个Follower副本宕机或是落后太多,则该Follower副本节点将从ISR列表中移除。

11、ZooKeeper

​ Kafka利用ZooKeeper保存相应元数据信息,Kafka元数据信息包括如代理节点信息、Kafka集群信息、旧版消费者信息及其消费偏移量信息、主体信息、分区状态信息、分区副本分配方案信息、动态配置信息等。Kafka在启动或者运行过程档中会在ZK上创建相应节点来保存元数据信息,Kafka通过监听机制在这些节点注册相应监听器来监听节点元数据的变化,从而由ZK负责管理维护Kafka集群,同时通过ZK能够顾跟方便地对Kafka集群进行水平扩展及数据迁移。

在这里插入图片描述

Kafka特性

  1. 消息持久化;

    • 解耦消息发送与消息消费

    • 实现灵活的消息处理

      普通的系统在实现持久化时可能会先尽量使用内存,当内存资源耗尽时,再 次性地把数据“刷盘”;而 Kafka 则反其道而行之,有数据都会立即被写入文件系统的持久化日志中,之后 Kafka 服务器才会返回结果给客户端通

      知它们消息已被成功写入。这样做既实时保存了数据,又减少了 Kafka 程序对于内存的消耗,从而将节省出的内存留给页缓存使用,更进一步地提升了整体性能。

  2. 高吞吐量;

    • 大量使用操作系统页缓存,内存操作速度快且命中率高;
    • Kafka不直接参与物理IO操作,而是交由最擅长此事的操作系统来完成;
    • 采用追加写入方式,摒弃了缓慢的磁盘随机读写操作;
    • 使用以sendfile为代表的零拷贝技术加强网络间的数据传输
  3. 扩展性;

  4. 多客户端支持;

  5. 安全机制;

  6. 数据备份;

  7. 轻量级;

  8. 消息压缩;

主题管理

创建主题

Kafka提供以下两种方式来创建一个topic:

1、若代理设置了auto.create.topics.enable=true,该配置默认值为true,这样当生产者向一个还未创建的topic发送消息时,会自动创建一个拥有 n u m . p a r t i t i o n s 个 分 区 和 {num.partitions}个分区和 num.partitions{default.replication.factot}个副本的主题;

2、客户端通过kafka-topics.sh脚本创建一个主题。

kafka-topics.sh --create --zookeeper server-1:2181,server-2:2181 , server-3:2181 --replication-factor 2 --partitions 3 --topic kafka-action

该主题拥有2个副本、3个分区。

参数说明:

  • ZooKeeper参数是必传参数,用于配置Kafka集群与ZK连接地址;

  • partition参数用于设置主题分区数,该配置为必传参数。 Kafka 通过分区分配策略,将

    个主题的消息分散到多个分区井分别保存到不同的代理上,以此来提高消息处理的

    吞吐量。 Kafka 生产者和消费者可以采用多线程井行对主题消息进行处理,而每个线

    程处理的是 个分区的数据,因此分区实际上是 Kafka 井行处理的基本单位 分区数

    越多 定程度上会提升消息处理的吞吐量,然而 Kafka 消息是以追加的形式存储在文

    件中的,这就意味着分区越多需要打开更多的文件句柄,这样也会带来一定的开销。

  • replication-factor:用来设置主题副本数,必传参数,副本会被分布在不同节点上,副本数不能超过节点数,否则创建主题会失败。

在创建主题时,我们还可以通过 config 参数来设置主题级别的配置以覆盖默认配置,可以

设置多组配置,具体格式为:

--config configl-name=configl-value -config config2-name=config2-value

删除主题

删除topic,一般有以下两种方式:

  1. 手动删除各节点${log.dir}目录下该主题分区文件夹,同时登陆ZK客户端删除待删除主题对应的节点,主题元数据保存在/brokers/topics和/config/topics目录下。

  2. 执行kafka-topics.sh脚本进行删除,若希望通过该脚本彻底删除topic,则需要保证在启动Kafka时所加载的server.properties文件中配置delete. topic.enable=true,改配置默认为false。否则执行该脚本并未真正删除主题,而是在ZK的/admin/delete_topics目录下创建与待删除主题同名的节点,将该主题标记为删除状态。

    kafka-topics --delete --zoo keeper server-1: 21 l,server-2:2181 一- topic kafka-action

查看主题
  1. 查看所有主题:

    kafka-topics.sh --list --zookeeper server-1 : 2181 , server-2:2181

  2. 查看某个特定主题信息

    若不指定topic则查看所有topic的信息

    kafka-topics.sh --describe --zookeeper server- 1 : 2181,server-2:2181

    指定topic

    ./kafka-topics.sh --describe --zookeeper 127.0.0.1:2181 --topic <topicName>

  3. 查看正在同步的主题

    该主题可能正在进行同步操作,也有可能同步发生异常,即此时所查询到的主题分区的ISR列表长度小于AR列表长度。对于通过该命令查询到的分区要重点监控,因为这可能意味着集群某个代理已失效或者同步速度减慢等。

    kafka-topics.sh --describe --zookeeper 172.117.12.61:2181 --under-replicated partitions

  4. 查看没有Leader的分区

    通过 describe unavailable -partitions 命令组合使用,可以查看没有 Leader 副本的主题。同样也可以指定 topic 参数,查看某个特定主题的哪些分区的 Leader 己不可用

    kafka-topics.sh --describe zookeeper server-1:2181,server-2:2181 --unavailable-partitions

  5. 查看主题覆盖的配置

    kafka-topics.sh --des cribe --zookeeper server-1:2181,server-2:2181 --topics-with -overrides

修改主题
  1. 修改主题级别配置
  • 查看config-test主题当前的配置:

    kafka-topics. sh --describe - -zookeeper server-12181 , server-2 : 2181 , server-3 : 2181 --topics-with-overrides --topic config- test

  • 修改该max.message.byte配置使其值为204800

    kafka-topics.sh --alter - - zookeeper server-1:2181 , server-2:2181,server-3:2181 --topic config-test --config max.message.bytes=204800

  1. 增加分区

    Kafka并不支持减少分区的操作,只能为一个主题增加分区:

    kafka-topics.sh --alter -- zookeeper server-1:2181,server-2 : 2181 , server-3 : 2181 --topic config-test --partitions 5

### Kafka 基本概念 Kafka 是一种分布式流处理平台,主要用于高吞吐量的实时数据传输和处理。它最初由 LinkedIn 开发并开源,广泛应用于日志收集、监控数据聚合、在线和离线分析等领域。 #### Topic(主题) 主题是 Kafka 中的一个核心概念,表示一类消息或者一个 feed 名称[^4]。它可以看作是一个分类器,用于区分同类型的数据。每个主题可以有多个生产者向其发送消息,同时也有多个消费者订阅这些消息。主题中的消息会被存储一段时间,具体时间可以通过配置来设定。 #### Broker(代理) Broker 是 Kafka 集群中的节点[^1]。每个 Kafka 实例运行在一个 Broker 上,负责接收来自 Producer 的消息并将它们存储在磁盘中。此外,Broker 还负责响应 Consumer 请求并向其提供所需的消息。 #### Producer(生产者) 生产者是指向 Kafka 主题发布消息的应用程序或服务[^1]。Producer 负责将数据序列化为字节流,并将其发送到指定的主题。为了提高性能,Producer 可以批量发送消息或将消息压缩后再发送。 #### Consumer(消费者) 消费者是从 Kafka 主题订阅消息的应用程序或服务[^3]。Consumer 使用 Pull 模型从 Broker 获取数据,而是依赖 Push 模型。这样设计的好处在于能够更好地控制流量以及应对突发的大规模请求。另外,Consumer 需要记录自己的消费位置 (Offset),以便在网络中断或其他异常情况发生后可以从上次停止的地方继续消费。 #### Partition(分区) 分区是对同一主题下同部分进行划分的结果。通过引入分区机制,仅实现了水平扩展能力(即增加更多的机器加入集群从而分担负载压力),而且也支持并发访问同一个主题的同子集。每条记录只会属于某一分区内的某个偏移量(offset)处。值得注意的是,在创建新分区时无法迁移已存在的旧数据至新的分区之中。 #### ISR 和 Leader/Follower - **ISR(In-Sync Replicas)** 表示当前同步状态良好的副本集合[^1]。只有当 follower 完全复制了 leader 所有的更新操作之后才能成为 isr 成员之一。 - 对于每一个 partition 来说都存在两种类型的 leaders: - **Controller Leader**: 控制整个 cluster metadata changes like creating/deleting topics etc. - **Partition Leader**: 处理 client requests related to that particular partition. #### 数据持久性和可靠性保障措施 每当 producer 将一条 message 发送给特定 topic-partition 后,kafka 会立即将此 message 存储进 memory cache ,而是直接 flush 到 disk log file 当中去[^2].这种做法虽然牺牲了一定程度的速度优势但却极大地增强了 system fault tolerance level because even if there was a crash immediately after writing but before acknowledging receipt back to sender side still all written records would remain safe on persistent storage medium until they get consumed by corresponding consumers later according their retention policy settings defined earlier during setup phase of respective environments accordingly as well ! ```python from kafka import KafkaProducer producer = KafkaProducer(bootstrap_servers='localhost:9092') future = producer.send('my-topic', b'raw_bytes') result = future.get(timeout=60) print(result) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值