如果在业务中,高并发的写请求特别多,应该怎么办?
高并发的读请求多的时候,引入MQ消息队列来解决高并发的写请求问题。
在这里我们用Kafka来解决这一个问题。
目录
前言
一、Kafka是什么?
二、Producer、Broker、Consumer
三、Topic、Partition
五、Segment
六、Offset
七、总结
一、Kafka是什么?
-
功能
-
分布式流式数据实时存储:分布式存储
-
实时消息队列存储,工作中主要使用的功能
-
-
分布式流式计算:分布式计算:KafkaStream
-
这个功能一般不用,工作中用流式计算:Spark | Flink
-
-
-
定义
-
分布式的基于订阅发布模式的高吞吐高性能的实时消息队列系统
-
-
应用场景
-
目前:只要做实时大数据,都必用Kafka
-
离线数据仓库:Hive
-
实时数据仓库:Kafka
-
-
Kafka生产者:数据采集的工具
-
Flume、Canal、OGG
-
-
Kafka消费者:实时计算的程序
-
Spark StructStreaming、Flink
-
-
-
特点
-
高性能:实时的对数据进行实时读写
-
快:基于内存存储、Zero Copy机制、顺序写磁盘
-
-
高并发:分布式并行读写
-
分布式主从架构
-
-
高吞吐:使用分布式磁盘存储
-
使用磁盘进行数据持久化
-
-
高可靠:分布式主从架构
-
高安全性:数据安全保障机制
-
副本机制
-
-
高灵活性:根据需求,随意添加生产者和消费者
-
异步架构
-
-
-
Broker:Kafka是一个分布式集群,多台机器构成,每台Kafka的节点就是一个Broker
-
Producer:生产者
-
负责将数据写入Kafka中,工作中一般生成都是数据采集工具
-
本质:Kafka写入数据的客户端
-
Kafka的每条数据格式:KV格式
-
-
Consumer:消费者
-
负责从Kafka中消费数据
-
本质:Kafka读取数据的客户端
-
消费数据:主要消费的数据是V
-
-
Consumer Group:Kafka中必须以消费者组的形式从Kafka中消费数据
-
消费者组到kafka消费数据
-
任何一个消费者必须属于某一个消费者组
-
一个消费者组中可以有多个消费者:多个消费者共同并行消费数据,提高消费性能
-
消费者组中多个消费者消费的数据是不一样的
-
整个消费者组中所有消费者消费的数据加在一起是一份完整的数据
-
-
三、Topic、Partition
路径
-
Topic:数据主题,用于区分不同的数据,对数据进行分类
-
类似于MySQL中会将数据划分到不同的表:不同的数据存储在不同的表中
-
Kafka是分布式存储:将写入Topic的数据分布式存储在不同的机器上
-
Topic就是分布式的概念:一个Topic可以划分多个分区Partition,每个不同分区存储在不同的Kafka节点上
-
写入Topic的数据实现分布式存储
-
-
问题:生产者写入一条KV结构数据,这条数据写入这个Topic的哪个分区由分区规则来决定,分区规则是什么呢?
-
有多种分区规则:不同场景对应的分区规则不一样
-
类似于Map输出一条数据,但是我有多个Reduce,我这条数据最终会进入哪个Reduce?
-
分区规则:Hash取余
-
-
-
-
Partition:数据分区,用于实现Topic的分布式存储,对Topic的数据进行划分
-
每个分区可以存储在不同的Kafka节点Broker上
-
例如上图中:Topic名称为T1,T1有三个分区:P0、P1、P2
-
写入Topic:根据分区的规则决定写入哪个具体的分区
-
四、分区副本机制
-
问题1:Kafka中的每个Topic的每个分区存储在不同的节点上,如果某个节点故障,怎么保证集群正常可用?
-
Kafka选用了副本机制来保证数据的安全性
-
如果某台机器故障,其他机器还有这个分区的副本,其他机器的副本照样可以对外提供客户端读写
-
-
Kafka副本机制:每一个分区都可以有多个副本
-
类似于HDFS的副本机制,一个块(BLOCK)构建多个副本
-
-
注意:Kafka中一个分区的副本个数最多只能等于机器的个数,相同分区的副本不允许放在同一台机器,否则如果一个节点挂掉了的话,那么这个分区的数据就会丢失。
-
-
问题2:一个分区有多个副本,读写这个分区的数据时候,到底读写哪个分区副本呢?
-
主从副本机制:Kafka将一个分区的多个副本,划分为两种角色
-
Leader副本:负责对外提供读写
-
生产者和消费者只对leader副本进行读写
-
-
Follower副本
-
与Leader同步数据
-
如果leader故障,从follower中选举新的leader副本对外提供读写
-
-
-
Segment:分区段,Kafka将所有存储的数据落地在文件中
-
定义:对每个分区的数据进行了更细的划分,先写入的数据会先生成一对Segment文件,存储到一定条件以后,后面数据写入另外一对Segment文件,每个文件就叫Segment文件对
-
内容:每个Segment对应一对【两个】文件
-
xxxxxxxxx.log:存储数据
-
xxxxxxxxx.index:对应.log的文件的数据索引
-
-
设计:为了加快数据检索的效率,将数据按照规则写入不同文件,以后可以根据规则快速的定位数据所在的文件,读取对应的小的segment文件,不用读取所有数据文件
-
举例
-
如果分区第一次写入数据,会产生第一个segment
00000000000000000000000.log 00000000000000000000000.index 00000000000000000000000.timeindex
-
当文件越来越大,存储的数据越来越多,影响读的性能,会再构建一个新的segment,老的segment不再被写入
00000000000000000000000.log 00000000000000000000000.index 00000000000000000000000.timeindex 00000000000000000199999.log 00000000000000000199999.index 00000000000000000199999.timeindex 00000000000002000000000.log 00000000000002000000000.index 00000000000002000000000.timeindex
-
Segment文件的名字就是这个Segment记录的offset的最小值
-
消费者消费数据是根据offset进行消费的
-
消费者1:想消费分区1:39999这个offset开始消费
-
先根据文件文件名来判断我要的offset在哪个文件中
-
-
-
定义:Kafka中所有消费者数据的读取都是按照Offset来读取数据,每条数据在自己分区中的偏移量
-
写入分区的顺序就是offset偏移量,Offset是分区级别的,每个分区的offset独立管理,都从0开始
-
消息队列:先进先出
-
先写入的offset就越小
-
第一条数据的offset就为0
-
第二条数据的offset就为1
-
……
-
-
-
生成:生产者往Kafka中写入数据,写入某个分区
-
每个分区单独管理一套Offset【分区】,offset从0开始对每条数据进行编号
-
Kafka写入数据也是按照KV来写入数据
#Kafka中一条数据存储的结构 offset Key Value
-
-
功能:基于offset来指定数据的顺序,消费时候按照offset顺序来读取
-
消费者消费Topic分区中的数据是按照offset进行顺序消费的
-
怎么保证不丢失不重复:只要保证消费者每次按照offset的顺序消费即可
-
如果没有Offset
-
从头取一遍:数据重复
-
从最新的去:数据丢失
-
-
-
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)