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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值