Kafka
Kafka
-
概述
Kafka 是一个分布式的基于发布/订阅模式的消息队列,主要应用于大数据实时处理领域。
优点:
解耦
可恢复性
缓冲
灵活性 & 峰值处理能力 -> 削峰
异步通信
消息队列的两种模式:
-
点对点:一对一,消费者主动拉取数据,消息收到后消息清除
- 发布/订阅模式:一对多,消费者消费数据之后不会清除消息
-
-
安装部署
# zookeeper tar -zxvf zookeeper-3.4.10.tar.gz -C /opt/module/ cd /opt/module/zookeeper-3.4.10/conf/ mv zoo_sample.cfg zoo.cfg vim zoo.cfg # dataDir=/opt/module/zookeeper-3.4.10/zkData # server.2=hadoop02:2888:3888 # server.3=hadoop03:2888:3888 # server.4=hadoop04:2888:3888 mkdir -p /opt/module/zookeeper-3.4.10/zkData cd zkData touch myid # 2 scp -r /opt/module/zookeeper-3.4.10 xiaxia@hadoop03:/opt/module/ scp -r /opt/module/zookeeper-3.4.10 xiaxia@hadoop04:/opt/module/ #修改 hadoop03 和 hadoop04 的 myid #三台机器分别启动 bin/zkServer.sh start bin/zkServer.sh status # kafka tar -zxvf kafka_2.11-0.11.0.2.tgz -C /opt/module/ cd ../module/ mv kafka_2.11-0.11.0.2/ kafka mkdir data vim /opt/module/kafka/config/server.properties # 见配置文件 scp -r /opt/module/kafka xiaxia@hadoop03:/opt/module/ scp -r /opt/module/kafka xiaxia@hadoop04:/opt/module/ vim /opt/module/kafka/config/server.properties #修改2,3,4 cd /opt/module/kafka/bin #启动 sed -i 's/\r$//' xxx.sh bin/mykafka.sh start /opt/module/kafka/bin/kafka-server-stop.sh /opt/module/kafka/config/server.properties /opt/module/kafka/bin/kafka-server-start.sh -daemon /opt/module/kafka/config/server.properties # 查看 topic bin/kafka-topics.sh --list --zookeeper hadoop02:2181 # 创建 topic 分区2副本2 bin/kafka-topics.sh --create --zookeeper hadoop02:2181 --topic first --partitions 2 --replication-factor 2 # 删除 bin/kafka-topics.sh --delete --zookeeper hadoop02:2181 --topic first # 描述 bin/kafka-topics.sh --describe --zookeeper hadoop02:2181 --topic first # 生产者 bin/kafka-console-producer.sh --topic first --broker-list hadoop02:9092 # 消费者 bin/kafka-console-consumer.sh --topic first --bootstrap-server hadoop02:9092
-
Kafka 工作流程及文件存储
- .index 二分查找
- .log
-
生产者
-
分区策略
- 方便在集群中扩展
- 可以提高并发
-
数据可靠性保证ack
为保证producer发送的数据,能可靠的发送到指定的topic,topic的每个partition收到producer发送的数据后,都需要向producer发送ack,如果producer收到ack,就会进行下一轮的发送,否则重新发送数据。
同步策略:全部ack
ISR:
acks:
0 :producer 不等broker的ack,可能丢数据
1:只等leader写完就ack,不管follower,可能丢数据
-1(all):等leader和ISR里的所有follower都写完才返回ack。但是如果在leader写完,broker在发送ack之前,leader故障,没有发ack,生产者会再发数据,就可能会出现重复数据
-
3. 数据一致性
LEO(Log End Offset):每个副本的最后一个offset
HW(High Watermark):消费者能见到的最大的offset,ISR队列中最小LEO
leader 发生故障之后,会从ISR中选出一个新的leader之后,为保证多个副本之间的数据一致性,其余的follower会将各自的log文件高于HW的部分截掉,然后从新的leader同步数据。这不能保证数据丢失,只能保证各副本的数据一致性。
4. Exactly Once
ack = -1 At Least Once
ack = 0 At Most Once
At Least Once + 幂等性 = Exactly Once
=======> Broker端会对<PID, Partition, SeqNumber>做缓存,当具有相同主键的消息提交时,Broker只会持久化一条。但是PID重启就会变化,同时不同的Partition也具有不同主键,所以幂等性无法保证跨区跨会话的Exactly Once