Kafka体系架构=M个producer +N个broker +K个consumer+ZK集群
broker:服务代理节点,Kafka服务实例
多个broker组成一个Kafka集群,通常一台机器部署一个Kafka实例,一个实例宕机了其他实例仍可以使用,体现了高可用
producer:生产者
消息的发送端,按topic发送消息
consumer:消费者
消费topic 的消息, 一个topic 可以让若干个consumer消费,若干个consumer组成一个 consumer group ,一条消息只能被consumer group 中一个consumer消费,若干个partition 被若干个consumer 同时消费,达到消费者高吞吐量
topic :主题
按业务划分不同消息类别
partition:分区
一个topic 可以拥有若干个partition(从 0 开始标识partition ),分布在不同的broker 上, 实现发布与订阅时负载均衡。producer 通过自定义的规则将消息发送到对应topic下某个partition,以offset标识一条消息在一个partition的唯一性。
“同一主题下的分区有没有可能到不同的borker上?” ——非常可能,而且也是期望的结果。
replica:副本
一个partition拥有多个replica,提高容灾能力。
replica 包含两种类型:leader 副本、follower副本,
leader副本负责读写请求,follower 副本负责同步leader副本消息,通过副本选举实现故障转移。
partition在机器磁盘上以log 体现(以最小消息offer命名,使用二分查找提高搜索效率), 采用顺序追加日志的方式添加新消息,降低随机插入时的性能损耗,实现高吞吐量。
“同一分区的副本有没有可能在不同的borker上” —— 必须如此。同一分区的不同副本必然在不同的broker上。
关于分区与消费疑问❓
1. 主题中的每个分区都只会被消费组内的一个消费者实例消费,其他消费者实例不能消费它。
2. 假设组内某个实例挂掉了,Kafka 能够自动检测到,然后把这个 Failed 实例之前负责的分区转移给其他活着的消费者。
3. 在一个消费者组下,一个分区只能被一个消费者消费,但一个消费者可能被分配多个分区,因而在提交位移时也就能提交多个分区的位移。
4. 如果1个主题有2个分区,消费者组有3个消费者,那至少有1个消费者闲置?是的。有一个消费者将无法分配到任何分区,处于idle状态。