kafka常用操作和常见问题
1.kafka官网:kafka官网
1.kafka概述
1)Kafka是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域。(传统使用)
Kafka是一个开源的分布式事件流平台(event streaming platform),被数千家公司用于高性能数据管道、流分析、数据集成和关键任务应用。(最新定位)
2)消息队列
消息队列
1.什么是消息队列?
消息队列(MQ(Message Queue))中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构。
队列是一种先进先出的数据结构。消息队列可以理解成将消息放到队列中去。
2.为啥要用消息队列?
1)解耦
允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。
2)可恢复性
系统的一部分组件失效时,不会影响到整个系统。消息队列降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理。
3)缓冲
有助于控制和优化数据流经过系统的速度,解决生产消息和消费消息的处理速度不一致的情况。
4)灵活性 & 峰值处理能力
在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量并不常见。如果为以能处理这类峰值访问为标准来投入资源随时待命无疑是巨大的浪费。使用消息队列能够使关键组件顶住突发的访问压力,而不会因为突发的超负荷的请求而完全崩溃。
5)异步通信
很多时候,用户不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。
3.消息队列分为哪两种?
(1)点对点模式(一对一,消费者主动拉取数据,消息收到后消息清除)
(2)发布/订阅模式(一对多,消费者消费数据之后不会清除消息)比如kafka
4.消费者怎么得到消息队列的数据?
1)生产者将数据放到消息队列中,消息队列有数据了,主动叫消费者去拿(俗称push)
2)消费者不断去轮循消息队列,看看有没有新的数据,如果有就消费(俗称pull)
3.kafka架构
参考kafka数据流
4.Kafka工作流程及文件存储机制
Kafka中消息是以topic进行分类的,生产者生产消息,消费者消费消息,都是面向topic的。
一个topic下的每一个分区都单独维护一个offset,所以分发到不同分区中的数据是不同的数据。消费者的分区维护是一个消费者组一个主题的一个分区维护一个offset。
topic是逻辑上的概念,而partition是物理上的概念,每个partition对应于一个log文件,该log文件中存储的就是producer生产的数据。Producer生产的数据会被不断追加到该log文件末端,且每条数据都有自己的offset。消费者组中的每个消费者,都会实时记录自己消费到了哪个offset,以便出错恢复时,从上次的位置继续消费。
由于生产者生产的消息会不断追加到log文件末尾,为防止log文件过大导致数据定位效率低下,Kafka采取了分片和索引机制,
将每个partition分为多个segment。每个segment对应两个文件——“.index”文件和“.log”文件。这些文件位于一个文件夹下,
该文件夹的命名规则为:topic名称+分区序号。
例如,first这个topic有三个分区,则其对应的文件夹为first-0,first-1,first-2。(三个分区不会分布在一个broke上,会有分布策略)
index和log文件以当前segment的第一条消息的offset命名
“.index”文件存储大量的索引信息,索引信息按照数组的逻辑排列,
“.log”文件存储大量的数据,数据直接紧密排列,索引文件中的元数据指向对应数据文件中message的物理偏移地址。
5.kafka常用命令
kafka常用命令
#创建tpic
kafka-topics.sh --bootstrap-server Ava01:9092 --create --replication-factor 2 --partitions 3 --topic zzz
#显示topic详细信息
kafka-topics.sh --bootstrap-server Ava01:9092 --describe --topic zzz
#显示topic列表
kafka-topics.sh --bootstrap-server Ava01:9092 --list
#修改分区数 只能往大了改 不能往小了改
kafka-topics.sh --bootstrap-server Ava01:9092 --alter --topic zzz --partitions 3
#删除topic
kafka-topics.sh --bootstrap-server Ava01:9092 --delete --topic zzz
#发送消息
kafka-console-producer.sh --broker-list Ava01:9092 --topic first
#消费消息
kafka-console-consumer.sh --bootstrap-server Ava01:9092 --topic zzz
#节点寄了重平衡
kafka-preferred-replica-election.sh --bootstrap-server Ava01:9092
#显示当前topic每个分区最新的offset
kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list Ava01:9092 --topic test --time -1
#单点启动kafka
bin/kafka-server-start.sh -daemon config/server.properties
#消费者消费topic __consumer_offsets from-beginning表示从最开始开始读
kafka-console-consumer.sh --topic __consumer_offsets --bootstrap-server Ava01:9092 --consumer.config config/consumer.properties --formatter "kafka.coordinator.group.GroupMetadataManager\$OffsetsMessageFormatter" --from-beginning >>/opt/module/kafka-2.4.1/offset/kafka_offset.txt
绝不摆烂