一、理论储备
1.JMS是什么,定义了哪几种模型
JMS(Java Message Service)是Java平台上有关面向消息中间件的技术规范。它便于Java应用程序进行消息
交换,并且提供标准的产生,发送,接收消息的接口,简化企业用用的开发。定义了两种模型,点对点和发布订阅。
2.消息模型对比
发布订阅和点对点。如果希望每一条消息都被正确消费使用点对点,queue。否则使用发布订阅,topic。
3.什么是kafka
Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。它最初是
由LinkedIn公司开发的,之后成为Apache项目的一部分。
4.为什么kafka能做到高吞吐量
1.顺序读写
a.减少了寻道时间
b.持久化后,需要根据分区大小或者日期删除历史数据
c.index文件中有每条数据的起始位置
d.数据持久化在.log文件中
e.遗留问题,需要了解Memory Mapped Files
2.零拷贝
a.传统加载 内核空间->用户空间->内核空间
b.零拷贝加载 内核空间->内核空间
c.零拷贝直接跳过了用户空间的复制,提高了性能
3.批量发送
a.生产者根据batch.size
4.分区
a.多个分区可以增加并行(类似concurrenthashmap?)
5.消费者消息的位置
消费者存在offset的概念,offset可以识别同意分区中的一条数据。可以由消费者保存,可以保存到数据库中
。(待补充)
保存到数据库中字段:主题 + 分区 + 消费组 + offset
6.kafka有哪些组件
a.topic 主题,逻辑概念,物理存储是"主题_分区"
b.consumer 消费者,主题订阅者
c.producer 生产者
d.brokers 集群中的一台或者几台机器
7.消费者组
每个消费者都会有消费者组,如果没有设置,则默认值是(待补充)。
8.kafka分区负载均衡
领导者承担了read和write的所有工作,追随者被动的复制领导者。因此,领导者失败时,其中的一个追随者
接管领导者的任务。
9.ISR和AR的概念
AR: 分区中的所有副本统称AR。
ISR: 所有和leader保持一定程度同步的副本,包括leader副本。
注:时间和条数两种踢出ISR方式,由于kafka可以批量发送,所以根据时间踢出更合适。
10.LEO和HW
HW:高水位值。每个副本和leader都保存。通过它可知道ISR的备份位移。
LEO:日志末端位移。代表日志中下一条写入的位置。
11.怎么确保kafka消息发送成功
acks=0,消息发送即接收成功,不等待返回
acks=1,leader写入log完成,即返回确认消息
acks=all,ISR集合中的副本都完成写入才返回确认消息
12.什么时候消息会重复
1.acks=1或者all时,数据发送到leader后,网络异常导致leader确认消息未送达,导致重复发送。
2.消费者消费消息后,offset未提交时程序异常,导致重复消费。
13.为什么新版kafka的消费offset不再保存到zookeeper中
消费者消费完消息之后,将offset消息存储在自建主题中,目的在于不用需要单独维护连接zookeeper通信,
二、常用命令
-
启动zookeeper命令
./zkCli.sh start -
启动kafka
./kafka-server-start.sh ../conf/server.properties -
创建主题
./kafka-topics.sh --zookeeper 127.0.0.1:2181 --create --partitions 1 --replication-factor 1 --topic first -
查看主题
./kafka-topics.sh --zookeeper 127.0.0.1:2181 --list -
删除主题
./kafka-topic.sh --zookeeper 127.0.0.1:2181 --delete --topic first -
启动控制台生产者
./kafka-console-producer.sh --broker-list 127.0.0.1:9092 --topic first -
启动控制台消费者
./kafka-console-consumer.sh --bootstrap-server 127.0.0.1:9092 --topic first --from-beginning -
查看topic详情
./kafka-topic.sh --zookeeper 127.0.0.1:2181 --topic first --describe
三、集群相关
1.修改server.properties属性
zookeeper.connect
zookeeper.connection.timeout.ms
listeners
broker.id
delete.topic.enable=true
2.实践经验
报错信息:WARN [Controller id=1, targetBrokerId=2] Connection to node 2 (/192.168.108.8:9092) could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient)
解决:192.168.108.8关闭防火墙
四、配置SASL信息
1.编写kafka_client_jaas.conf文件
KafkaClient {
org.apache.kafka.common.security.plain.PlainLoginModule required
username="producer"
password="producer;};
2.修改kafka-console-consumer.sh和kafka-console-producer.sh
加入到启动脚本中-Djava.security.auth.login.config=$ROOT/config/kafka_client_jaas.conf
3.修改consumer.properties和producer.properties,并加入
security.protocol = SASL_PLAINTEXT
sasl.mechanism = PLAIN
4.启动生产者
./kafka-console-producer.sh --broker-list 127.0.0.1:9092\
--topic hahaha --producer.config ./config/producer.properties
5.启动消费者
./kafka-console-consumer.sh --bootstrap-server 127.0.0.1:9092\
--topic hahaha--consumer.config ./config/consumer.properties