一.消息队列的基本内容
- 写的请求也比较多怎么解决?
引入消息队列(先进先出的顺序性):解决高并发的写问题
- 传统架构中存在的问题:redis:解决了高并发读,并发特性,数据安全不是最重要的(小);MQ消息队列:解决了高并发写,并发特性,最注重数据安全
- 定义:一种异步的服务间通信方式,是分布式系统中最重要的组件,主要解决应用耦合,异步消息,流量削锋等问题,实现高性能高可用可伸缩和最终一致性架构。(消息队列MQ用于实现两个系统之间或两个模块之间传递消息数据时,实现数据缓存)
- 功能:基于队列的方式,实现消息传递的数据缓存(长久)。队列的特点:先进先出
- 应用场景:实现实时、高性能、高吞吐、高可靠的消息传递架构中;大数据中作为唯一的实时数据存储平台kafka
- 优点:实现架构解耦:随意添加消费者;实现了异步,提高传输性能:所有消费者可以并行得到MQ中获取数据;限流削锋
- 缺点:消息队列出现问题整个消息系统不可用,必须保障MQ高可靠性,运维更加麻烦;数据保障更加复杂,必须保证生产安全和消费安全。变成了异步模式:必须保证最终一致性,写数据:生产数据不丢失不重复;读数据:消费数据:不丢失不重复
二.同步与异步
- 同步概念:客户端提交请求,服务端处理请求,客户端等待服务端将处理结果返回,在进行下一步(结果肯定是准确的但性能降低)
- 异步概念:客户端提交第一个请求,服务端将请求放入消息队列等待处理,客户端不等待处理结果,直接进行下一步(性能高,结果误差)
三.订阅发布模式
- 角色:
1.1 生产者:MQ中写数据的客户端
1.2 消息队列:MQ
1.3 消费者:MQ中读数据的客户端
1.4 Topic:主题,用于划分存储不同业务的数据 - 流程
2.1 生产者往消息队列中生产数据,将数据写入对应的主体中
2.2 消费者可以订阅主题,如果主题中出现新的数据消费者就可以立即消费 - 特点
一个消费者可以订阅多个主题,一个主题可以被多个消费者订阅(消费成功以后不会立即主动删除数据,可以实现数据共享)
四.kafka介绍
- 官网:kafka.apache.org ;领英公司基于scala语言开发的工具。scala基于jvm之上的语言
- 功能:分布式流式数据实时存储,分布式流式计算
- 定义:分布式的基于订阅发布模式的高吞吐高性能的实时消息队列系统
- kafka 生产者:数据采集的工具(flume,canal,ogg);kafka消费者:实时计算的程序(spark,structStreaming,flink)
- 特点:高性能(实时快的原因是基于内存存储,0拷贝机制,顺序写磁盘),高并发(分布式并行读写分布式主从架构),高吞吐(使用分布式磁盘存储),高可靠(分布式主从架构),高安全性(数据安全保障机制),高灵活性(异步架构根据需求随意添加生产者和消费者)
五.kafka概念:Producer 、Broker、Consumer
- Broker :kafka是一个分布式集群,多台机器构成,每台kafka的节点就是一个Broker
- Producer :生产者,负责将数据写入kafka,工作中一般生成都是数据采集工具,本质就是kafka写入数据的客户端,kafka每条数据的格式kv格式。
- Consumer:消费者,从kafka读取数据的客户端,主要消费的数据是v
- Consumer group:kafka中所有的消费者必须以消费者组的形式消费数据,任何一个消费者必须属于某一个消费者组,一个消费者组可以有多个消费者共同并行消费数据,提高消费性能,消费者组中消费者消费的数据是不一样的,整个消费者组中所有的消费者消费者消费的数据加在一起是一份完整的数据
- topic:数据主题,用于区分不同的数据,对数据进行分类,topic就是分布式的概念:一个topic可以划分多个分区partition,每个不同分区存储在不同的kafka节点上
- partition:数据分区,用于实现topic的分布式存储,对topic的数据进行划分,每个分区可以存储在不同的kafka节点的broker上。
六. 分区副本机制
- kafka中的每个topic的每个分区存储在不同的节点上,如果某个节点故障,怎么保证集群正常可用?
副本机制,如果某一个机器故障,其他机器有这个分区的副本,其他机器的副本照样可以对外提供客户端读写;每一个分区可以有多个副本,每一个分区副本个数最多只能等于机器的个数,相同分区的副本不允许放在同一台机器。 - 一个分区有多个副本,读写这个分区数据的时候,到底读写哪个分区副本呢?
kafka将一个分区的多个副本划分为两个角色:leader副本:负责对外提供读写(生产者和消费者只对leader进行读写)follower副本:与leader同步数据,如果leader故障,从follower选出新的leader
七.segment
- 分区的数据进行更细的划分,称为分区段,先写入的数据会先生成一对segment文件,存储带一定条件以后,后边数据写入到,另外一对segment文件,每个文件就叫segment文件对
- 每个segment对应一对文件:xxxx.log:存储数据; xxxx.index:对应.log文件的数据索引
- 设计:加快数据检索的效率,将数据按照规则写入不同的文件,以后可以根据规则快速的定位数据所在的文件,读取对应的小的segment文件,不需要读取所有的数据文件。
- segment文件的名字就是这个segment记录的offset的最小值:消费者消费数据是根据offset进行消费的,根据文件名来判断数据在那个文件
八.offset
- 写入顺序的偏移量,读取顺序保障消费顺序,和消费数据不丢失和不重复
- 消费者读取数据都是按照offset来读取数据,先写入的offset就越小
- 消费者根据上一次记录的消费offset+1,向kafka继续请求消费每个分区下个批次的数据
九.kafka的集群架构
- 架构角色:kafka:分布式主从架构,实现消息队列的构建;zookeeper:辅助选举controller,元数据存储
- kafka的每个角色以及对应的功能:分布式主从架构:节点broker;公平的主从架构:主节点和从节点功能类似,如果主节点故障,允许从节点选举成为主节点,利用zk实现选举:所有存活的kafka节点会到zk创建临时节点,谁创建成功谁就是主节点。
主节点:kafka controller:负责普通broker的工作,负责管理所有从节点,
从节点:kafka broker:对外提供读写请求,监听controller,controller故障会重新选举一个新的
十.分布式集群的部署
- 上传解压:tar -zxvf kafka_2.12-2.4.1.tgz -C /export/server/
- 切换目录: cd /export/server/kafka_2.12-2.4.1/
- 创建日志目录: mkdir logs
- 切换到配置文件目录:cd conf
- 修改配置文件:vim server.properties
- 分发:
scp -r kafka_2.12-2.4.1 node3: P W D s c p − r k a f k a 2 . 12 − 2.4.1 n o d e 2 : PWD scp -r kafka_2.12-2.4.1 node2: PWDscp−rkafka2.12−2.4.1node2:PWD - 修改node2和3的配置文件:
- 配置环境变量:vim /etc/profile
export KAFKA_HOME=/export/server/kafka_2.12-2.4.1
export PATH=:$KAFKA_HOME/bin:$PATH
- 启动
先启动zookeeper
zookeeper启动脚本:
#!/bin/bash
/export/server/zookeeper-3.4.6/bin/zkServer.sh "${1}"
ssh root@node2 "source /etc/profile;/export/server/zookeeper-3.4.6/bin/zkServer.sh ${1}"
ssh root@node3 "source /etc/profile;/export/server/zookeeper-3.4.6/bin/zkServer.sh ${1}"
创建kafka启动关闭脚本:
#!/bin/bash
KAFKA_HOME=/export/server/kafka_2.12-2.4.1
for number in {1..3}
do
host=node${number}
echo ${host}
/usr/bin/ssh ${host} "cd
${KAFKA_HOME};source /etc/profile;export
JMX_PORT=9988;${KAFKA_HOME}/bin/kafka-server-start.sh ${KAFKA_HOME}/config/server.properties
>>/dev/null 2>&1 &"
echo "${host} started"
done
添加权限:chmod u+x /export/server/kafka_2.12-2.4.1/bin/start-kafka.sh
创建关闭脚本:
#!/bin/bash
KAFKA_HOME=/export/server/kafka_2.12-2.4.1
for number in {1..3}
do
host=node${number}
echo ${host}
/usr/bin/ssh ${host} "cd ${KAFKA_HOME};source
/etc/profile;${KAFKA_HOME}/bin/kafka-serverstop.sh"
echo "${host} stoped"
done
加权限:chmod u+x /export/server/kafka_2.12-2.4.1/bin/stop-kafka.sh
单台启动:bin/kafka-server-start.sh config/server.properties>>/dev/null 2>&1 &
单台关闭: bin/kafka-server-stop.sh