1. kafka介绍
Kafka是分布式发布-订阅消息系统,它最初是由LinkedIn公司开发的,之后成为Apache项目的一部分,Kafka是一个分布式,可划分的,冗余备份的持久性的日志服务,它主要用于处理流式数据。
2. kafka配置文件
server.properties
############################# Server Basics #############################
# broker的id, 这个id是唯一的,而且必须是整数.
broker.id=0
# 设置可以删除topic , 默认不可以删除topic
delete.topic.enable=true
############################# Socket Server Settings #############################
# Kafka Server使用的协议、主机名以及端口,默认是PLAINTEXT
listeners=PLAINTEXT://:9092
# 处理网络请求的线程数量
num.network.threads=3
# 用来处理磁盘io的线程数量
num.io.threads=8
# 发送socket的缓冲区大小
socket.send.buffer.bytes=102400
# 接受socket的缓冲区大小
socket.receive.buffer.bytes=102400
# 请求socket的缓冲区大小
socket.request.max.bytes=104857600
############################# Log Basics #############################
# 暂存数据的目录
log.dirs=E:\kafka\logs
# topic在当前broker的分区个数
num.partitions=1
# 用来恢复和清理data的线程数量
num.recovery.threads.per.data.dir=1
############################# Internal Topic Settings #############################
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
############################# Log Flush Policy #############################
# 每隔多少个消息触发次flush操作,将内存中的消息刷新到硬盘上
log.flush.interval.messages=10000
# 每隔多少毫秒触发一次flush操作,将内存中的消息刷新到硬盘上
log.flush.interval.ms=1000
############################# Log Retention Policy #############################
# 日志保存多少个小时以后会被删除
log.retention.hours=168
# 当剩余空间低于log.retention.bytes字节,则开始删除1og
#log.retention.bytes=1073741824
# log文件最大的大小,超过会创建一个新文件,文件名称是最小的偏移量
log.segment.bytes=1073741824
# 每隔多少ms, logcleaner线程将检查一次,看是否符合上述保留策略的消息可以被删除
log.retention.check.interval.ms=300000
############################# Zookeeper #############################
# zookeeper启动地址
zookeeper.connect=localhost:2181
# 连接zookeeper的超时时长
zookeeper.connection.timeout.ms=6000
############################# Group Coordinator Settings #############################
group.initial.rebalance.delay.ms=0
3. 使用kafka创建topic
1. 查看所有topic --list
kafka-topics.bat --zookeeper localhost:2181(zk的地址) --list
--zookeeper: zk的地址
2. 创建topic --create
kafka-topics.bat --zookeeper localhost:2181 --create --replication-factor 1 --partitions 1 --topic test
--replication-factor 定义副本数 Broker小于设置的replication-factor的时候会报错
--partitions 定义分区数
--topic 创建topic的名称
3. 查看某个topic的详情 --describe
kafka-topics.bat --zookeeper localhost:2181 --describe --topic test
4. 删除topic --delete 如果没有设置为true,不会删除成功
kafka-topics.bat --zookeeper localhost:2181 --delete --topic test
5. 开启生产者
kafka-console-producer.bat --broker-list localhost:9092 --topic test
--broker-list 是连接hadoop的集群地址
6. 开启消费者
kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic test --from-beginning
--bootstrap-server kafka集群地址
--from-beginning 从头读取数据
4. kafka的一些名词解释
producer:消息的生产者
Consumer:消息的消费者,consumer每次会将消费的offset存在broker中,在consumer中会有一个长轮询一直去topic中拉取数据。
broker:类似一个服务器,一个kafka中有多个broker。
topic:主题,消息将会存在每个对应的topic中,每个topic会有多个分区,每个分区会有一个leader和若干个备份,某一个分区只能被同一个消费者组里的消费者消费, 也就是同一个消费者组只能有一个消费者消费一个分区。
5. .index和.log文件
kafka为了防止log过大的问题采取分片和索引机制,将每个partition分为多个segment,每个segment对应.index和.log,.index文件存的是偏移量,.log 存放的kafka的消息数据。两个文件的命名都是最小的偏移量命名的,通过二分法找到偏移量所在的.index,然后找到.log文件对应的消息偏移量,然后通过seek去读.log文件的数据。
6. 副本数据同步策略
方案 | 优点 | 缺点 |
半数以上完成就发送ACK | 延迟低 | 选举新leader,容忍n台节点故障,需要2n+1个副本 |
全部完成就发送ACK | 选举新leader,容忍n台节点故障,需要n+1个副本 | 延迟高 |
kafka采用的是第二个策略,是因为第一种会有大量的数据冗余
7. ISR
leader节点会动态的ISR列表,意为和当前节点保持同步的follower。当ISR中的follower完成数据同步以后,就会发送ACK,如果长期未向leader同步数据就会被踢出ISR队列,当leader发生故障会从ISR选取新的leader。
8. ACK应答机制
值为 0 | producer不等待broker的ACK机制,延迟最低,broker接收到消息还未写入磁盘就会返回ACK,当broker故障的时候可能会数据丢失 |
值为 1 | producer等待broker的ACK机制,leader成功落盘后会返回ACK,如果在follower同步数据之前broker故障的时候可能会数据丢失 |
值为 -1 | producer等待broker的ACK机制,leader成功落盘并且在follower同步数据之后会返回ACK,如果在follower同步完成之后,broker发送ACK之前,leader发生故障,数据会重复 |
9. 数据一致性的问题
LEO(log end offset) | 每个副本最大的offset |
HW(high waterMark) | 指的是消费者能见到的最大的offset,消费者仅能见HW之前的数据,相当于ISR队列中的LEO |
当leader发生故障时,在ISR队列中的follower,为了保证一致性,会将高于HW的数据全部切掉,并从新的leader同步数据。
当follower发生故障,就会将其短暂踢出ISR队列,并从磁盘读入最后一次HW之前所有的数据之后,并从leader同步数据,等follower的LEO追上offset的时候,再重新加入ISR队列。
这样只是能保证多个副本之间数据的一致性,并不能保证数据不会丢失和重复。
10. 精准一次性 exactly once
生产者方面:每个分区只有一个生产者写入消息,当出现异常或超时,生产者查询此分区最后一个消息,用于决定后续操作时重传还是继续发送。
消费者方面:通过offset,找到上次消费的位置,在重启或者Reblance之后继续消费,不出现重复数据的情况。