概述
预备知识 (了解消息队列)
概念
消息队列,英文名:Message Queue,经常缩写为MQ。从字面上来理解,消息队列是一种用来存储消息的队列。
消息队列中间件
消息队列中间件就是用来存储消息的软件(组件)
例如:
为了分析网站的用户行为,我们需要记录用户的访问日志。
这些一条条的日志,可以看成是一条条的消息,我们可以将它们保存到消息队列中。
将来有一些应用程序需要处理这些日志,就可以随时将这些消息取出来处理。
消息队列的应用场景
- 异步处理
电商网站中,新的用户注册时,需要将用户的信息保存到数据库中,同时还需要额外发送注册的邮件通知、以及短信注册码给用户。
但因为发送邮件、发送注册短信需要连接外部的服务器,需要额外等待一段时间,此时,就可以使用消息队列来进行异步处理,从而实现快速响应。
- 系统解耦
- 流量削峰
- 日志处理(大数据领域常见)
大型电商网站(淘宝、京东、国美、苏宁…)、App(抖音、美团、滴滴等)等需要分析用户行为,要根据用户的访问行为来发现用户的喜好以及活跃情况,需要在页面上收集大量的用户访问信息。
交互模型
- 请求响应模型
- http请求响应模型
- 数据库请求响应模型
- 生产者、消费者模型
注:
- kafka就是基于该交互模型
- 所以使用kafka时需要知道哪个是生产者,哪个是消费者
消息队列的两种模型
- 点对点模型
消息发送者生产消息发送到消息队列中,然后消息接收者从消息队列中取出并且消费消息。
消息被消费以后,消息队列中不再有存储,所以消息接收者不可能消费到已经被消费的消息。
特点:
- 一对一:每个消息只有一个接收者(Consumer)(即一旦被消费,消息就不再在消息队列中)
- 无依赖:发送者和接收者间没有依赖性,发送者发送消息之后,不管有没有接收者在运行,都不会影响到发送者下次发送消息;
- 接收反馈:接收者在成功接收消息之后需向队列应答成功,以便消息队列删除当前接收的消息;
- 发布订阅模式
特点:
- 一对多:每个消息可以有多个订阅者;
- 有依赖:发布者和订阅者之间有时间上的依赖性。针对某个主题(Topic)的订阅者,它必须创建一个订阅者之后,才能消费发布者的消息。
- 提前订阅:为了消费消息,订阅者需要提前订阅该角色主题,并保持在线运行;
kafka基本概述
概念
Kafka是一个高吞吐、高性能、高并发、高可靠性等基于订阅发布模式的分布式消息队列系统
- 高吞吐:使用分布式磁盘存储,没有使用HDFS
- 高性能:实时对数据就行读写
- 使用了分布式内存,用到的是PageCache:操作系统的页缓存机制
- 它属于操作系统层次的内存,即使Kafka进程故障,重启Kafka,数据依旧在内存中
- 高并发:分布式并行读写
- 高可靠:分布式主从架构
- 高安全:
- 内存:Log记录操作
- 磁盘:副本机制
应用场景
- 大数据实时架构中,用于实时数据的临时存储
上图,我们可以看到:
- Producers(生产者):可以有很多的应用程序,将消息数据放入到Kafka集群中。
- Consumers(消费者):可以有很多的应用程序,将消息数据从Kafka集群中拉取出来。
- Connectors(连接器):Kafka的连接器可以将数据库中的数据导入到Kafka,也可以将Kafka的数据导出到
- Stream Processors(流处理器):流处理器可以Kafka中拉取数据,也可以将数据写入到Kafka中。
安装部署
- 将Kafka的安装包上传到虚拟机,并解压
cd /export/soft/
tar -zxvf kafka_2.12-2.4.1.tgz -C ../server/
- 修改server.properties
cd /export/server/kafka_2.12-2.4.1/config
vim server.properties
添加以下内容:
# 指定broker的id
broker.id=0
# 指定Kafka数据的位置
log.dirs=/export/server/kafka_2.12-2.4.1/data
# 配置zk的三个节点
zookeeper.connect=node1:2181,node2:2181,node3:2181
- 将安装好的kafka复制到另外两台服务器
cd /export/server
scp -r kafka_2.12-2.4.1/ node2:$PWD
scp -r kafka_2.12-2.4.1/ node3:$PWD
修改另外两个节点的broker.id分别为1和2:
---------node2--------------
cd /export/server/kafka_2.12-2.4.1/config
vim server.properties
broker.id=1
--------node3--------------
cd /export/server/kafka_2.12-2.4.1/config
vim server.properties
broker.id=2
- 配置KAFKA_HOME环境变量
vi /etc/profile
export KAFKA_HOME=/export/server/kafka_2.12-2.4.1
export PATH=:$PATH:${KAFKA_HOME}
分发到各个节点
scp /etc/profile node2:$PWD
scp /etc/profile node3:$PWD
每个节点加载环境变量
source /etc/profile
- 启动服务器
# 启动ZooKeeper
/export/server/zookeeper-3.4.6/bin/start-zk-all.sh
# 启动Kafka
cd /export/server/kafka_2.12-2.4.1
nohup bin/kafka-server-start.sh config/server.properties &
# 测试Kafka集群是否启动成功
bin/kafka-topics.sh --bootstrap-server node1:9092 --list
未报错说明Kafka集群启动成功
配置Kafka一键启动/关闭脚本
- 进入执行脚本目录
cd /export/server/kafka_2.12-2.4.1/bin/
vim slave
- 编写slave配置文件,用于保存要启动哪几个节点上的kafka
node1
node2
node3
- 编写start-kafka.sh脚本
vim start-kafka.sh
添加以下内容:
cat /export/server/kafka_2.12-2.4.1/bin/slave | while read line
do
{
echo $line
ssh $line "source /etc/profile;export JMX_PORT=9988;nohup ${KAFKA_HOME}/bin/kafka-server-start.sh ${KAFKA_HOME}/config/server.properties >/dev/nul* 2>&1 & "
}&
wait
done
- 编写stop-kafka.sh脚本
vim stop-kafka.sh
添加以下内容:
cat /export/server/kafka_2.12-2.4.1/bin/slave | while read line
do
{
echo $line
ssh $line "source /etc/profile;jps |grep Kafka |cut -d' ' -f1 |xargs kill -s 9"
}&
wait
done
- 给start-kafka.sh、stop-kafka.sh配置执行权限
chmod u+x start-kafka.sh
chmod u+x stop-kafka.sh
- 执行一键启动、关闭
./start-kafka.sh
./stop-kafka.sh
Kafka软件目录结构
基本操作
- 创建topic
Kafka中所有的消息都是保存在主题中,要生产消息到Kafka,首先必须要有一个确定的主题。
# 创建名为test的主题
bin/kafka-topics.sh \
--create \
--bootstrap-server node1:9092 \
--topic test
# 查看目前Kafka中的所有主题
bin/kafka-topics.sh \
--list \
--bootstrap-server node1:9092
查看test主题详细信息
bin/kafka-topics.sh \
--bootstrap-server node1:9092 \
--describe \
--topic test
第一行:对test主题的所有Partition进行一个总结
PartitionCount:统计主题中Partition的总数,由图可知test有一个分区
ReplicationFactor:统计主题中分区副本的数,由图可知test的一个分区有一个副本
segment.bytes:表示一个segment文件的大小
从第二行开始:
Partition:分区序号,0代表第一个分区
Leader:表示当前分区负责读写的副本在第几台机器上,2代表第三台机器(从0开始,2表示第三台broker)
Replicas:表示当前分区副本在哪些机器上,2代表第三台机器
Isr:表示副本都已同步的的节点集合
删除test主题
bin/kafka-topics.sh \
--delete \
--topic test
- 生产消息到Kafka
使用Kafka内置的测试程序,生产一些消息到Kafka的test主题中:
bin/kafka-console-producer.sh \
--broker-list node1:9092 \
--topic test
- 从Kafka消费消息
复制node1的shell窗口,
使用下面的命令来消费 test 主题中的消息:
bin/kafka-console-consumer.sh \
--bootstrap-server node1:9092 \
--topic test \
--from-beginning
发送的:
接收到的: