Zookeeper 架构如下图:
- Broker 注册:Broker 是分布式部署并且之间相互独立,Zookeeper 用来管理注册到集群的所有 Broker 节点。
- Topic 注册:在 Kafka 中,同一个 Topic 的消息会被分成多个分区并将其分布在多个 Broker 上,这些分区信息及与 Broker 的对应关系也都是由 Zookeeper 在维护
- 生产者负载均衡:由于同一个 Topic 消息会被分区并将其分布在多个 Broker 上,因此,生产者需要将消息合理地发送到这些分布式的 Broker 上。
- 消费者负载均衡:与生产者类似,Kafka 中的消费者同样需要进行负载均衡来实现多个消费者合理地从对应的 Broker 服务器上接收消息,每个消费者分组包含若干消费者,每条消息都只会发送给分组中的一个消费者,不同的消费者分组消费自己特定的 Topic 下面的消息,互不干扰。
答案关键字:
- 简单讲下 Kafka 的架构?Producer、Consumer、Consumer Group、Topic、Partition。
- Kafka 是推模式还是拉模式,推拉的区别是什么?Kafka Producer 向 Broker 发送消息使用 Push 模式,Consumer 消费采用的 Pull 模式。拉取模式,让 consumer 自己管理 offset,可以提供读取性能。
- Kafka 如何广播消息?Consumer group。
- Kafka 的消息是否是有序的?Topic 级别无序,Partition 有序。
- Kafka 是否支持读写分离?不支持,只有 Leader 对外提供读写服务。
- Kafka 如何保证数据高可用?副本,Ack,HW。
- Kafka 中 zookeeper 的作用?集群管理,元数据管理。
- 是否支持事务?0.11 后支持事务,可以实现“exactly once”。
- 分区数是否可以减少?不可以,会丢失数据。
Kafka 使用
面试问题:
- Kafka 有哪些命令行工具?你用过哪些?
- Kafka Producer 的执行过程?
- Kafka Producer 有哪些常见配置?
- 如何让 Kafka 的消息有序?
- Producer 如何保证数据发送不丢失?
- 如何提升 Producer 的性能?
- 如果同一 Group 下 Consumer 的数量大于 part 的数量,kafka 如何处理?
- Kafka Consumer 是否是线程安全的?
- 讲一下你使用 Kafka Consumer 消费消息时的线程模型,为何如此设计?
- Kafka Consumer 的常见配置?
- Consumer 什么时候会被踢出集群?
- 当有 Consumer 加入或退出时,Kafka 会作何反应?
- 什么是 Rebalance,何时会发生 Rebalance?
命令行工具
Kafka 的命令行工具在 Kafka 包的 /bin 目录下,主要包括服务和集群管理脚本,配置脚本,信息查看脚本,Topic 脚本,客户端脚本等。
- kafka-configs.sh:配置管理脚本。
- kafka-console-consumer.sh:kafka 消费者控制台。
- kafka-console-producer.sh:kafka 生产者控制台。
- kafka-consumer-groups.sh:kafka 消费者组相关信息。
- kafka-delete-records.sh:删除低水位的日志文件。
- kafka-log-dirs.sh:kafka 消息日志目录信息。
- kafka-mirror-maker.sh:不同数据中心 kafka 集群复制工具。
- kafka-preferred-replica-election.sh:触发 preferred replica 选举。
- kafka-producer-perf-test.sh:kafka 生产者性能测试脚本。
- kafka-reassign-partitions.sh:分区重分配脚本。
- kafka-replica-verification.sh:复制进度验证脚本。
- kafka-server-start.sh:启动 kafka 服务。
- kafka-server-stop.sh:停止 kafka 服务。
- kafka-topics.sh:topic 管理脚本。
- kafka-verifiable-consumer.sh:可检验的 kafka 消费者。
- kafka-verifiable-producer.sh:可检验的 kafka 生产者。
- zookeeper-server-start.sh:启动 zk 服务。
- zookeeper-server-stop.sh:停止 zk 服务。
- zookeeper-shell.sh:zk 客户端。
我们通常可以使用kafka-console-consumer.sh和kafka-console-producer.sh脚本来测试 Kafka 生产和消费。
kafka-consumer-groups.sh 可以查看和管理集群中的 Topic,kafka-topics.sh 通常用于查看 Kafka 的消费组情况。
Kafka Producer
Kafka producer 的正常生产逻辑包含以下几个步骤:
- 配置生产者客户端参数常见生产者实例。
- 构建待发送的消息。
- 发送消息。
- 关闭生产者实例。
Producer 发送消息的过程如下图所示,需要经过拦截器,序列化器和分区器,最终由累加器批量发送至 Broker。
Producer
Kafka Producer 需要以下必要参数:
- bootstrap.server:指定 Kafka 的 Broker 的地址。
- key.serializer:key 序列化器。
- value.serializer:value 序列化器。
常见参数:
- batch.num.messages,默认值:200,每次批量消息的数量,只对 asyc 起作用。
- request.required.acks,默认值:0,0 表示 producer 毋须等待 leader 的确认,1 代表需要 leader 确认写入它的本地 log 并立即确认,-1 代表所有的备份都完成后确认。
只对 async 模式起作用,这个参数的调整是数据不丢失和发送效率的 tradeoff,如果对数据丢失不敏感而在乎效率的场景可以考虑设置为 0,这样可以大大提高 producer 发送数据的效率。