Kafka:
- 定位:分布式的消息队列系统,同时提供数据分布式缓存功能(默认7天)削峰,解耦(高内聚,低耦合)
- 消息持久化到磁盘,达到O(1)访问速度,预读和后写,对磁盘的顺序访问(比内存随机访问还要快)
- Streaming(分布式的实时计算框架)
Kafka目标成为队列平台 - 基本组件:
Broker:每一台机器是一个Broker
Producer:日志消息生产者,主要写数据
Consumer:日志消息消费者,主要读数据
Topic:是虚拟概念,不同的consumer去指定的topic去读数据,不同producer可以往不同的topic去写(发布消息)
Partition:是实际概念,文件夹,是在Topic的基础上做了进一步分层
message:offset,key.value,timestamp - Partition功能:负载均衡,需要保证消息的顺序性
顺序性的保证:订阅消息是从头往后读取的,写消息是尾部追加,所以整体消息是顺序的
如果有多个partiton存在,可能会出现顺序不一致的情况,原因:每个Partition相互独立 - Topic:逻辑概念
一个或多个Partition组成一个Topic - Partition以文件夹的形式存在
- Partition有两部分组成:
(1)index log:(存储索引信息,快速定位segment文件)
(2)message log:(真实数据的所在) - 参考HDFS多副本的方式来完成数据高可用
如果设置一个Topic,假设这个Topic有5个Partition,3个replication,此时该topic共有15个partition
Kafka分配replication的算法:
假设:
将第i个Partition分配到(i % N)个Broker上 10%3 取模(取余)
将第i个Partition的第j个replication分配到( (i+j) % N)个Broker上
虽然Partition里面有多个replication
如果里面有M个replication,其中有一个是Leader,其他M-1个follower - zookeeper保证系统的可用性,zk中会保存一些meta信息(topic)
- 物理上,不同的topic的消息肯定是分开存储的
- 偏移量——offset:用来定位数据读取的位置
- kafka内部最基本的消息单位——message
- 传输最大消息message的size不能超过1M,可以通过配置来修改
- Consumer Group
- 传输效率:zero-copy
0拷贝:减少Kernel和User模式上下文(context)的切换
直接把disk上的data传输给socket(套接字),而不是通过应用程序来传输 - Kafka的消息是无状态的,消费者必须自己维护已消费的状态信息(offset)
减轻Kafka的实现难度 - Kafka内部有一个时间策略:SLA——消息保留策略(消息超过一定时间后,会自动删除)
- 交付保证:
at least once:至少一次(会有重复、但不丢失)
at most once:最多发送一次(不重复、但可能丢失)
exactly once:只有一次(最理想),目前不支持,只能靠客户端维护(去重操作) - Kafka集群里面,topic内部由多个partition(包含多个replication),达到高可用(HA)的目的:
日志副本:保证可靠性
角色:主、从
ISR:是一个集合,只有在集合中的follower,才有机会被选为leader
如何让leader知道follower是否成功接收数据(心跳,ack)
如果心跳正常,代表节点活着 - 怎么算“活着”
(1)心跳
(2)如果follower能够紧随leader的更新,不至于被落的太远
如果一旦挂掉,从ISR集合把该节点删除掉