特点: 每秒几十万条 consumer主动pull消息 分区 副本,所有消息都会存在磁盘上
应用场景:行为跟踪 日志
角色:
consumer:消息的接受者
broker:消kafka服务提供者
producer:消息的生产者
coordinator:Rebalace 以及管理,consumer, 一个group中有一个coordinator (当前负载最小的broker); 当第一台组中的consumer启动时kafka 会和broker确认 cooedinator
consumer leader: 制定rebalance策略发给coordinator
概念:
topic:消息的集合(消息存储的逻辑概念) 物理层面:不同的topic是分开存储的
partition:分区 每个topic可以划分多个分区 ,相同topic的不同分区下的消息是不同的;同一个分区可以保证消息的顺序,跨分区了则不保证
物理路径:/tmp/kakka-lofs/...-1
group:消费者中的概念 一条消息会发送给所有订阅该topic的消费组 但一个消费组只有一个消费者能收到该消息
replication:副本 消息冗余的备份(分散存放在其他broker节点 ) 提高可靠性 当某个节点挂掉后不会丢消息
offset消息的指针 每个group都有一个
命令:
启动:./kafka-server-start.sh -daemon ../config/server.properties
集群:
1.修改server.properties 文件
zookeeper,connection 改成一样的节点 ,号隔开
broker.id唯一性
listeners:当前ip 地址
2.选举逻辑:
最早注册 ids:最小的节点
在zookeeper中的节点含义:
controller:控制中心信息
[zk: localhost:2181(CONNECTED) 1] get /controller
{"version":1,"brokerid":0,"timestamp":"1535464742258"} //brokerid master节点
cZxid = 0x1600000010
ctime = Tue Aug 28 21:59:00 CST 2018
mZxid = 0x1600000010
mtime = Tue Aug 28 21:59:00 CST 2018
pZxid = 0x1600000010
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x26580d3f8010000
dataLength = 54
numChildren = 0
javaAPI参数:
1.ProducerConfig.ACKS_CONFIG //发送给broker以后是否需要确认 (0:消息发送给broker后不需要确认 ,1:只需要kafka集群中的leader节点的确认即可返回 ,-1:需要集群中的所有节点都确认)
2.ProducerConfig.BATCH_SIZE_CONFIG // ,默认16KB producer中 对于同一个分区来说 会按照batch.size的大小手机统一进行批量发送
3.ProducerConfig.LINGER_MS_CONFIG //默认值是0 在该属性设置的时间内批量发送 ps:2,3可配合使用满足其中之一就会发送 故如果不修改lingerMs时 batchSize也不会起作用
4.ProducerConfig.MAX_REQUEST_SIZE_CONFIG // 默认1mb 超过该值的大小则发送失败
5.ProducerConfig.RETRIES_CONFIG //失败的重试次数
6.ProducerConfig.PARTITIONER_CLASS_CONFIG //自定义分区策略的类全路径
1.ConsumerConfig.AUTO_OFFSET_RESET_CONFIG //earliest 对于新的groupid来说从头开始取最新的 对于已经消费过的groupid来说 他会从已经消费的最大的offset来取
//latest 对于新的groupid来说直接取已经消费并且提交的最大的offset
//none 对于新的groupid来说 没有offset则抛异常
2.ConsumerConfig.GROUP_ID_CONFIG //groupId
3.ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG //true 消息读取后自动提交读取已读取信息 false:手动提交 更灵活 有回调等
4.ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG //自动提交间隔时间
5.ConsumerConfig.MAX_POLL_RECORDS_CONFIG //一次poll拿到的最多消息数
注意 Or QA
1.kafka 1.0版本以后默认是异步发送,当然也可以设置为同步发送
2.消息是由[key]-value组成 key:决定放到哪个分区 ;可以扩展自定义分区策略 实现Partitioner ;默认算法为hash取模 如果key是null会随机选择 (metadata.max) 10分钟更新一次
3.消费者可以指定消费哪个分区
4.如果存在多个消费者并且不指定消费者消费哪个分区的话,kafka会按照一定策略平均分配分区(最好消费者数量是分区数的整数倍 达到平局分配的目的) 消费者>分区数 会有部分消费者不工作
5.在一个分区中是不予许并发的,否则会出现问题
6.增减consumer,broker,partition会导致Rebalance(重置负载策略)
7.分区分配策略
Range(范围)->默认 缺点:如果有3个消费者 ,消费2个topic每个topic有10个分区 第一个消费者就需要比其他消费者多消费两个分区
RoundBobin(轮询):消费者和分区数都列出来按照hashcode排序后轮询
必须满足条件: 1.每个消费者订阅的主题必须相同 2.每个主题的消费者必须具有相同数据的流??
8.什么时候回触发rebalance
对于consumer group新增消费者的时候
消费者离开了consumer group
topic中新增了分区
消费者主动取消了订阅
9.谁来执行Rebalance 策略
consumer制定策略 coordinator 下发策略 consumer执行分配策略(新版本 1.0 ) zookeeper执行(老版本 )
10.offset在哪里维护
zk:/brokers/topics _consumer_offsets 50个分区 保存消费者 offset的位置 ,持久化在/tmp/kafka-logs
11.如何找到当前的consumer group的offset维护在哪个分区中
1.("groupID".hashCode())%50(默认是50) 假设等于A
2.找到_consumer_offsets-A
3.查看 consumer_offsets-A 命令:
sh kafka-simple-consumer-shell.sh --topic _consumer_offsets --partion A --broker-list 集群IP --formatter "kafka.coordinator.groupMetaManager\$OffsetsMessageFormatter"
12.以上 tmp目录是可以配置的 默认是tmp生产的时候最好不要放在tmp上
13.broker如何分配分区
根据broker数量和分区数顺序分配
14.消息的写入性能保证:
写入的顺序性(追加)
0拷贝(sendfile)
直接从内核空间拷贝到socket buffer 不用拷贝到应用的用户空间
消息的存储机制
根据阈值(可配置 log.segment.bytes) 分段 保存logSegment(消息)
15.如何查看消息内容
命令:
sh kafka-run-class.sh kafka.tools.DumpLogSegments --files /tmp/kafuka-logs/.....log --prit-data-log
16.topic_*文件含义
.index:文件索引
.timeindex:时间索引
.log:消息信息
leader-epoch-checkpoint
17.索引的查找思想
稀疏索引
18.如果已知offset怎么查找消息的内容
index:
通过二分查找文件的名称(文件的名称是文件中第一条消息的offset) 找到索引文件
因为索引文件中索引的稀疏度一致所以能通过索引定位position
通过position定位log文件中的位置范围 然后查找该offset的内容
timeindex:
通过时间代替物理偏移量查找
19.消息的清理和压缩
清理:根据时间或大小(可配)清理
压缩:相同的key 保留最新的value值