高吞吐的目录
- 1、基础理论
 - 1.1、什么是消息队列
 - 1.2、消息队列的两种模式
 - 1.3、高可用原理
 
- 6.1、应答机制
 
1、基础理论
1.1、什么是消息队列
- Message Queue
 - 消息的传输过程中保存消息的容器
 - 应用场景:程序解耦、异步消息、流量削锋…
 
1.2、消息队列的两种模式
点对点模式(消费者主动拉取数据,拉取成功后删除队列上的数据)
一个消息 只能有一个消费者可以消费
发布/订阅模式(消费者消费数据之后,队列上的数据不会被马上清除)
1.3、高可用原理
- High Availability
 - 目标:减少停工时间
 - 策略:消除单点故障
 
工作模式
2、Kafka概述
- 基于发布/订阅模式的 分布式的 消息队列
 - 主用场景:大数据实时处理、流量削峰
 
架构图
| 英文名 | 译名 | 说明 | 
|---|---|---|
| Producer | 生产者 | 生产消息 | 
| Consumer | 消费者 | 消费消息 | 
| Consumer Group | 消费者组 | 由多个Consumer组成 是逻辑上的一个订阅者  | 
| Broker | 经纪人 | 一台Kafka服务器就是一个Broker 一个集群由多个Broker组成 一个Broker可以容纳多个topic的partition  | 
| Topic | 主题 | 可以理解为一个存放消息的逻辑上的队列 一个topic可以分布到多个Broker  | 
| Partition | 分区 | 一个topic可以分存多个partition 每个partition是一个有序的队列  | 
| Replica | 复制品 | 数据副本 | 
| Leader | 首领 | 对接生产者和消费者 | 
| Follower | 追随者 | 实时同步leader的数据 leader故障时,某follower会成为新的leader  | 
3、主题和分区
一个主题下可以有多个分区;分区有序,主题不一定有序
消费者组是逻辑上的一个订阅者,由多个消费者组成
各个分区可以被消费者并行消费
多个消费者组可以订阅同一个主题
1个消费者可以消费多个分区
对于1个消费者组,1个分区 只能被 该消费者组内的1个消费者 消费
建议 某主题的分区数=订阅该主题的消费者组的消费者数
一台服务器有Broker,一个集群由多个Broker组成
一个Topic可以分布到多个Broker
4、数据存储原理
Kafka将 生产者发送的消息 暂存到硬盘
下面使用命令查看具体的文件夹和文件
1、把
segment改小,使得容易产生大量
segment
vi $KAFKA_HOME/config/server.properties
log.segment.bytes=102400
2、创建分区,两个副本,三个分区
kafka-topics.sh \\--zookeeper hadoop100:2181/kafka \\--create \\--replication-factor 2 \\--partitions 3 \\--topic topicA
3、生产数据(Kafka内置的生产者,可用于压测)
kafka-producer-perf-test.sh --topic topicA \\--num-records 4000 --record-size 1024 \\--producer-props bootstrap.servers=hadoop100:9092 --throughput -1
| 参数 | 说明 | 
|---|---|
--num-records  | 
写多少个数据 | 
--record-size  | 
每个数据多大(单位:byte) | 
--producer-props  | 
指定数据写到哪个集群 | 
--throughput  | 
写数据速率限制,-1表示不限 | 
4、查看数据目录下名为
topicA的主题
ls $KAFKA_HOME/logs | grep topicAssh hadoop101 'ls $KAFKA_HOME/logs | grep topicA'ssh hadoop102 'ls $KAFKA_HOME/logs | grep topicA'

5、查看分区(文件夹)内的文件
ll topicA-1

6、查看索引文件以及偏移量(offset)
kafka-dump-log.sh --print-data-log --files 00000000000000000000.index

5、数据查找

6、生产数据的可靠性
6.1、应答机制
- ACK
 - 全称:acknowledgement character
 - 译名:命令正确应答
 - 应答等级
ack=0:Leader接收数据后 应答
ack=1:Leader接收数据并写入后 应答
ack=-1:Leader接收和写入数据,Follower同步数据 后应答 

6.2、领导候选
- ISR
 - 全称:in-sync replica set
 - 与
leader
同步到一定程度的
follower
 - 长期没同步的
follower
将被踢出
ISR
 - 
leader
挂掉后就从
ISR
中选举新
leader
 
kafka-topics.sh --describe --topic topicA --bootstrap-server hadoop100:9092
查看主题信息,如:分区数、领导者、追随者、Isr……
6.3、数据一致性
只能保证副本之间的数据一致性,并不能保证数据不丢失或不重复
- 
LEO
log end offset
当前日志数据(副本)最后一个偏移量 - 
HW
high watermark
所有副本的LEO中 最小的那一个 

6.4、容错机制
| 容错等级 | 语义 | 说明 | 
|---|---|---|
| at most once | 数据最多一条 | 数据可能会丢,但不会重复 | 
| at least one | 数据至少一条 | 数据绝不会丢,但可能重复 | 
| exactly once | 数据有且只有一条 | 数据不会丢,也不会重复 | 
如何实现【exactly once】
1、ack=-1,实现数据不会丢
2、开启幂等性
3、给消息添加唯一标识【生产者ID、分区号、该分区的数据的偏移量】,据此防止数据重复
4、生产者不要挂(生产者挂掉重启后,生产者编号可能变)或 固定生产者编号
附录
| en | 🔉 | cn | 
|---|---|---|
| broker | ˈbroʊkər | n. 经纪人 | 
| acknowledgement | əkˈnɑːlɪdʒmənt | n. 承认;确认;感谢 | 
| replica | ˈreplɪkə | n. 复制品,仿制品;摹本 | 
| bootstrap | ˈbuːtstræp | n. (靴筒后的)靴襻;[计] 引导程序;vt. 启动(电脑) | 
| watermark | ˈwɔːtərmɑːrk | n. 水印;vt. 印水印;(water mark 两单词合体) | 
| exactly | ɪɡˈzæktli | adv. 恰好地;精确地;正确地 | 
爱站程序员基地











