前言
- 一个典型的kafka体系结构包括若干个producer,若干个broker,若干个consumer,以及一个zookeeper集群。其中zookeeper集群是kafka用来负责集群元数据的管理、控制器的选举等操作的。producer将消息发送到broker,broker负责将收到的消息存储到磁盘中,而consumer负责从broker订阅并消费消息。
broker
架构
- 每个topic有好多partition(存储内容不同),均匀分布在每个broker上
- 每个partition都有好多replica(存储内容相同),其中一个为leader,其余的为follower
- broker接收的消息必须以字节数组的形式存在,故需要序列化与反序列化
- kafka消息只保证partition内有序,而不是topic内有序
参数
- listeners:支持PLAINTEXT,SSL,SASL_SSL。示例配置:
listeners=PLAINTEXT://localhost:9092
- log.dir:用来配置单个根目录
- log.dirs:用来配置多个根目录(以逗号分割)
- message.max.bytes:用来指定broker所能接收消息的最大值
- auto.create.topics.enable:描述操作不存在的topic使是否自动创建
- delete.topic.enable:执行删除操作时是否真正删除topic
命令
- 启动broker:
bin/kafka-server-start.sh -daemon config/server.properties
- 创建某topic:
bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic test
- 查看topic列表:
bin/kafka-topics.sh --list --bootstrap-server localhost:9092
- 启动命令行producer:
bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
- 启动命令行consumer:
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
- 删除某topic:
bin/kafka-topics.sh --bootstrap-server localhost:9092 --delete --topic test
- 查看某topic某partition的offset的最大值:
bin/kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list localhost:9092 --partitions 0 --time -1 --topic test
- 查看某topic某partition的offset的最小值:
bin/kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list localhost:9092 --partitions 0 --time 1 --topic test
producer
架构
- 消息在发送到kafka集群之前,可以经过拦截器,序列化器,分区器,均可根据具体情况自定义。
- RecordAccumulator主要用来缓存消息以便Sender线程可以批量发送,进而减少网络传输的资源消耗以提升性能。
- RecordAccumulator缓存的大小可以通过生产者参数buffer.memory配置。如果生产者发送消息的速度超过发送到服务器的速度,则会导致生产者空间不足,这个取决于生产者参数max.block.ms。
参数
- acks:这个参数用来指定分区中必须要有多少个副本收到这条消息,之后生产者才会认为这条消息是成功写入的。值为1,分区的leader副本成功写入消息即可;值为0,生产者发送消息之后不需要等待任何服务端的响应;值为-1或者all,需等待ISR中所有副本都成功写入消息才能够收到来自服务端的成功响应。注意:值为字符串类型。
- max.request.size:这个参数用来限制生产者发送的消息的最大值
- retries:生产者重试的次数,默认为0,即在发生异常的时候不进行任何重试动作。
- retry.backoff.ms:两次重试之间的时间间隔
- compression.type:用来指定消息的压缩方式,默认值为"none",还可配置为"gzip",“snappy”,“lz4”。消息压缩是一种使用时间换空间的优化方式,如果对时延有一定要求,则不推荐对消息进行压缩。
consumer
架构
- 消费者组可以有好多消费者,这些消费者均匀消费某topic所有partition,互不影响。一个消费者组里的两个消费者不会消费同一个partition。
- 若某消费者组只有一个消费者,则该消费者消费该topic所有partition。
- 在kafka0.9.0.0之前,消费者会使用zookeeper来保存一些信息。但在该版本和该版本之后,kafka引入了一个新的消费者接口,允许broker直接维护这些信息。
- 若一个consumer消费多个partition,会把一个partition全部消费完再消费下一个partition。
- 每一个partition只能被一个consumer group的一个consumer所消费。
- 一个consumer group的consumer默认不会重复消费已经消费的消息
参数
- group.id:消费者隶属的消费者组的名称。