kafka
角色
broker
⽣产者创建消息。
该⻆⾊将消息发布到Kafka的topic中。broker接收到⽣产者发送的消息后,broker将该消息追加到当前⽤于追加
数据的 segment ⽂件中。
topic
每条发布到Kafka集群的消息都有⼀个类别,这个类别被称为Topic。
物理上不同Topic的消息分开存储。
主题就好⽐数据库的表,尤其是分库分表之后的逻辑表。
partition
- 主题可以被分为若⼲个分区,⼀个分区就是⼀个提交⽇志。
- 消息以追加的⽅式写⼊分区,然后以先⼊先出的顺序读取。
- ⽆法在整个主题范围内保证消息的顺序,但可以保证消息在单个分区内的顺序。
- Kafka 通过分区来实现数据冗余和伸缩性。
- 在需要严格保证消息的消费顺序的场景下,需要将partition数⽬设为1。
首领和副本
首领副本负责处理消息的读写请求
同步副本只负责消息的同步(和leader副本)
offset偏移量
生产者消费者读取消息的位置
kafka优势
- ⾼吞吐量:单机每秒处理⼏⼗上百万的消息量。即使存储了许多TB的消息,它也保持稳定的性能。
- ⾼性能:单节点⽀持上千个客户端,并保证零停机和零数据丢失。
- 持久化数据存储:将消息持久化到磁盘。通过将数据持久化到硬盘以及replication防⽌数据丢失。
- 零拷⻉
- 顺序读,顺序写
- 利⽤Linux的⻚缓存
- 分布式系统,易于向外扩展。所有的Producer、Broker和Consumer都会有多个,均为分布式的。⽆需停机
即可扩展机器。多个Producer、Consumer可能是不同的应⽤。 - 可靠性 - Kafka是分布式,分区,复制和容错的。
- 客户端状态维护:消息被处理的状态是在Consumer端维护,⽽不是由server端维护。当失败时能⾃动平
衡。 - ⽀持online和offline的场景。
- ⽀持多种客户端语⾔。Kafka⽀持Java、.NET、PHP、Python等多种语⾔。
使用场景
- ⽇志收集:⼀个公司可以⽤Kafka可以收集各种服务的Log,通过Kafka以统⼀接⼝服务的⽅式开放给各种Consumer;
- 消息系统:解耦⽣产者和消费者、缓存消息等;
- ⽤户活动跟踪:Kafka经常被⽤来记录Web⽤户或者App⽤户的各种活动,如浏览⽹⻚、搜索、点击等活动,这些
活动信息被各个服务器发布到Kafka的Topic中,然后消费者通过订阅这些Topic来做实时的监控分析,亦可保存到数据
库; - 运营指标:Kafka也经常⽤来记录运营监控数据。包括收集各种分布式应⽤的数据,⽣产各种操作的集中反馈,⽐
如报警和报告; - 流式处理:⽐如Spark Streaming和Storm。
核心概念
缩写解释
AR
分区中的所有副本统称为AR(Assigned Repllicas)。
AR=ISR+OSR
ISR
所有与leader副本保持⼀定程度同步的副本(包括Leader)组成ISR(In-Sync Replicas),ISR集合是AR集合中
的⼀个⼦集。消息会先发送到leader副本,然后follower副本才能从leader副本中拉取消息进⾏同步,同步期间内
follower副本相对于leader副本⽽⾔会有⼀定程度的滞后。前⾯所说的“⼀定程度”是指可以忍受的滞后范围,这个范围
可以通过参数进⾏配置。
OSR
与leader副本同步滞后过多的副本(不包括leader)副本,组成OSR(Out-Sync Relipcas)。在正常情况下,所有
的follower副本都应该与leader副本保持⼀定程度的同步,即AR=ISR,OSR集合为空。
HW
HW是High Watermak的缩写, 俗称⾼⽔位,它表示了⼀个特定消息的偏移量(offset),消费之只能拉取到这
个offset之前的消息。
LEO
LEO是Log End Offset的缩写,它表示了当前⽇志⽂件中下⼀条待写⼊消息的offset。
脚本命令
# 以守护进程的方式启动kafka
[root@VM-20-16-centos bin]# kafka-server-start.sh -daemon ../config/server.properties
# 没有-daemon会直接在终端打印kafka启动状况
kafka-server-start.sh ../config/server.properties
# 日志的存放路径
[root@VM-20-16-centos logs]# pwd
/opt/kafka_2.12-1.0.2/logs
可以通过查看日志查看kafka的启动是否成功
topic命令使用
# 查看有哪些topic
[root@VM-20-16-centos bin]# kafka-topics.sh --zookeeper localhost:2181/myKafka --list
# 创建topic topic-hello 其中有四个分区
# 创建主题的时候需要指定当前主题有多少分区,每个分区有多少个副本
# 分区是为了横向扩展
# 副本是为了提供高可用,所以所以副本需要配置在集群的不同broker机器上,因为当前只有一台broker,那此时--replication-factor副本因子只能写成1
[root@VM-20-16-centos bin]# kafka-topics.sh --zookeeper localhost:2181/myKafka --create --topic topic-hello --partitions 4 --replication-factor 1
Created topic "topic-hello".
# 查看topic详情
# PartitionCount 4个分区,从0开始
# Leader 首领副本在broker-id为0的服务器上
# Replicas 副本在broker-id为0的服务器上
# Isr 同步副本在0号broker-id上
[root@VM-20-16-centos bin]# kafka-topics.sh --zookeeper localhost:2181/myKafka --describe --topic topic-hello
Topic:topic-hello PartitionCount:4 ReplicationFactor:1 Configs:
Topic: topic-hello Partition: 0 Leader: 0 Replicas: 0 Isr: 0
Topic: topic-hello Partition: 1 Leader: 0 Replicas: 0 Isr: 0
Topic: topic-hello Partition: 2 Leader: 0 Replicas: 0 Isr: 0
Topic: topic-hello Partition: 3 Leader: 0 Replicas: 0 Isr: 0
# 执行topic的删除操作
# 但是看结果这条命令不执行删除动作,仅仅是在zookeeper上标记该topic要被删除而已,同时需要要提前打开delete.topic.enable开关,否则删除动作是不会执行的。配置属性在/opt/kafka_2.12-1.0.2/config/server.properties中配置
[root@VM-20-16-centos bin]# kafka-topics.sh --zookeeper localhost:2181/myKafka --delete --topic topic-hello
Topic topic-hello is marked for deletion.
Note: This will have no impact if delete.topic.enable is not set to true.
生产消费消息
# 生产topic_1的消息
[root@VM-20-16-centos bin]# kafka-console-producer.sh --topic topic_1 --broker-list 81.70.5.240:9092
>1
>as
# 消费消息
# 加上--from-beginning表示从头开始消费
[root@VM-20-16-centos bin]# kafka-console-consumer.sh --bootstrap-server 81.70.5.240:9092 --topic topic_1
as
asad