Kafka的基本概念
Kafka的基本概念以及topic的基本操作
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特性
-
消息持久化;
-
解耦消息发送与消息消费
-
实现灵活的消息处理
普通的系统在实现持久化时可能会先尽量使用内存,当内存资源耗尽时,再 次性地把数据“刷盘”;而 Kafka 则反其道而行之,有数据都会立即被写入文件系统的持久化日志中,之后 Kafka 服务器才会返回结果给客户端通
知它们消息已被成功写入。这样做既实时保存了数据,又减少了 Kafka 程序对于内存的消耗,从而将节省出的内存留给页缓存使用,更进一步地提升了整体性能。
-
-
高吞吐量;
- 大量使用操作系统页缓存,内存操作速度快且命中率高;
- Kafka不直接参与物理IO操作,而是交由最擅长此事的操作系统来完成;
- 采用追加写入方式,摒弃了缓慢的磁盘随机读写操作;
- 使用以sendfile为代表的零拷贝技术加强网络间的数据传输
-
扩展性;
-
多客户端支持;
-
安全机制;
-
数据备份;
-
轻量级;
-
消息压缩;
主题管理
创建主题
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,一般有以下两种方式:
-
手动删除各节点
${log.dir}
目录下该主题分区文件夹,同时登陆ZK客户端删除待删除主题对应的节点,主题元数据保存在/brokers/topics和/config/topics目录下。 -
执行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
查看主题
-
查看所有主题:
kafka-topics.sh --list --zookeeper server-1 : 2181 , server-2:2181
-
查看某个特定主题信息
若不指定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>
-
查看正在同步的主题
该主题可能正在进行同步操作,也有可能同步发生异常,即此时所查询到的主题分区的ISR列表长度小于AR列表长度。对于通过该命令查询到的分区要重点监控,因为这可能意味着集群某个代理已失效或者同步速度减慢等。
kafka-topics.sh --describe --zookeeper 172.117.12.61:2181 --under-replicated partitions
-
查看没有Leader的分区
通过 describe unavailable -partitions 命令组合使用,可以查看没有 Leader 副本的主题。同样也可以指定 topic 参数,查看某个特定主题的哪些分区的 Leader 己不可用
kafka-topics.sh --describe zookeeper server-1:2181,server-2:2181 --unavailable-partitions
-
查看主题覆盖的配置
kafka-topics.sh --des cribe --zookeeper server-1:2181,server-2:2181 --topics-with -overrides
修改主题
- 修改主题级别配置
-
查看
config-test
主题当前的配置:kafka-topics. sh --describe - -zookeeper server-12181 , server-2 : 2181 , server-3 : 2181 --topics-with-overrides --topic config- test
-
修改该
max.message.byte
配置使其值为204800kafka-topics.sh --alter - - zookeeper server-1:2181 , server-2:2181,server-3:2181 --topic config-test --config max.message.bytes=204800
-
增加分区
Kafka并不支持减少分区的操作,只能为一个主题增加分区:
kafka-topics.sh --alter -- zookeeper server-1:2181,server-2 : 2181 , server-3 : 2181 --topic config-test --partitions 5
更多推荐
所有评论(0)