基本概念
Kafka集群 = N个broker + ZK集群 + M个producer + K个consumer
broker:kafka服务实例,n个组成一个kafka集群,通常一台机器部署一个kafka实例,一个实例挂了其它实例仍可用。
kafka三层消息架构:
- 第一层是主题(topic)层,每个主题可以配置多个分区。分区数量可以大于broker数量,分区数据存储在broker节点的data目录下,命名为topicName-分区编号
- 第二层是分区(partition)层,每个分区又可以配置多个副本,分区的N个副本中只有一个能充当leader角色,对外提供服务;其它N-1个副本是follower,只提供数据备份之用。副本数量不能大于broker数量
- 第三层是消息(record)层,分区中包含若干条消息,每个分区中消息位移从0开始,依次递增
producer:生产者,生产者向某个topic发送消息,生产者可以指定要发送的目标分区;也可以按照producer端参数partitioner.class指定的分区策略来确定目标分区;如果没有指定partitioner.class,那么默认的规则是:看消息是否有key,如果有则计算key的murmur2哈希值%topic分区数;如果没有key,按照轮询的方式确定分区
consumer:消费者,消费topic的消息,一个topic可以让若干个cosumer消费,若干个consumer组成一个consumer group,一条消息只能被consumer group中的一个consumer消费
新增分区后,原来分区的数据不会自动迁移,需要手动迁移;分区数不可以减少。
客户端发送metadata请求获取每个topic分区的leader,之后再发送数据请求(producer请求或fetch请求)。
从follower中选择leader: 1 从ISR中选择存活的第一个副本为新leader; 2 如果ISR为空,看是否开启了unclean leader选举,如果没有开启,那么kafka干脆就不选leader了,直接将分区置于不可用撞他;否则就从剩下的存活副本中选择第一个副本作为leader;
重要配置
auto.offset.reset
- earliest:当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,从头开始消费;
- latest:当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,消费新产生的该分区下的数据;
- none:各分区都存在已提交的offset时,从offset后开始消费;只要有一个分区不存在已提交的offset,则抛出异常
broker端参数
log.dirs:指定broker需要使用的若干个文件目录路径,例如:/home/kafka1,/home/kafka2,/home/kafka3。
最好保证这些目录挂载在不同的物理磁盘上,这样有两个好处:提升读写性能、能够实现故障转移。
log.retention.{hours|minutes|ms}:控制一条消息数据被保存多长时间。优先级上ms最高、minutes次之、hours最低。通常情况我们还是设置hours多一些,log.retention.hour=168表示默认保存7天的数据,自动删除7天前的数据。
log.retention.bytes:这是指定broker为消息保存的总磁盘容量大小。默认值是-1,不限制。
message.max.bytes:控制broker能够接收的最大消息大小。默认1000012太小了,设置大点没关系的。