Kafka的概述
1.1 消息队列的简介
1.1.1 为什么要有消息队列
1. 当服务器在一次性处理大量的数据时,可能会造成服务器瘫痪,或者数据丢失这种情况
2. 如果将要处理的数据先维护在一个缓存系统中,然后再慢慢的处理,这样就可以避免上述情况。
3. 缓存系统就是用来存储消息的,该系统中至少要维护一个用来存储消息的先后顺序的队列(数据结构)
4. 为什么要使用队列(Queue,Deque,LinkedList),而不是其他的数据结构(Arraylist),因为消息要进行频繁的生产和消费(增删操作)
1.1.2 什么是消息队列
消息,就是指的网络中传输的数据,比如行为日志,文本、视频,音频、图片
队列,用来存储消息的容器,该容器是一个首尾相接的环形队列,规定的是FIFO
消息队列就是两者的结合,以及提供了各种API,和底层优化设计的应用程序
1.1.3 消息队列的分类
主要分为两大类,一类是点对点模式,一类是发布/订阅模式
1)点对点模式
1. 可以叫 peer-to-peer ,也可以叫point-to-point
2. 角色分为:消息队列(Queue)、发送者(Sender)、接收者(Receiver)
3. 发送者发送消息到队列中,该消息只能被一个接收者所接受,即使有多个接收者同时侦听到了这一条消息。
4. 该消息一旦被消费,则不存储在消息队列中,比如打电话
5. 支持异步/同步操作
2)发布/订阅模式
1. 叫 pub/sub模式
2. 角色分为:
-- 消息队列(Queue),
-- 发布者(Publisher、也叫producer)、
-- 订阅者(Subscriber,也叫consumer),
-- 主题(Topic) 用来将消息分类的
3. 一个消息可以被多个消费者消费,互不影响,比如我发布一个微博:关注我的人都能够看到。
4. 消费者在消费数据时,
--可以是push模式(消息队列主动将信息push给消费者),
--也可以使pull模式(消费者主动拉取消息对列中的消息),该模式的优点,消费者可以在自己处理消息的能力范围内,进行消费数据,
5. 支持异步/同步操作
1.1.4 消息队列的应用场景
1. 解耦: 消息系统可以作为中间件, 下游的软件和上游的软件无需了解彼此
2. 冗余: 消息可以持久化到磁盘上,或者做备份处理,避免数据丢失
3. 扩展: 消息队列提供了统计的生产者/消费者接口,
任何软件都可以调用生产者接口API,作为生产者
软件软件都可以调用消费者接口API,作为消费者
4. 销(削)峰能力:避免流量高峰期造成的系统瘫痪, 消息队列可以缓存这一时期的数据,慢慢处理
5. 可靠性: 消息队列中部分数据丢失,是有副本策略的,可以恢复数据
1.1.5 常见的消息队列系统
RabbitMQ
Redis
ZeroMQ
ActiveMQ JMS
Kafka/Jafka
MetaQ/RocketMQ
1.2 Kafka的简介
1.2.1 Kafka的官网介绍
apache官网:https://kafka.apache.org/documentation/#quickstart
中文官网:https://kafka.apachecn.org/
1.2.2 Kafka是什么
1. 是一个分布式、用于处理消息的发布/订阅消息系统
2. 是用scala语言编写的(scala编写另外一门比较火的框架是spark)
3. 具有以下特点:
-- 高吞吐量: 可以满足每秒百万级别消息的生产和消费——生产消费。
-- 持久化(保存在磁盘上一定时间,默认7天,区别于永久性)
-- 分布式:基于分布式的扩展和容错机制;Kafka的数据都会复制到几台服务器上。当某一台故障失效时,生产者和消费者转而使用其它的机器——整体
-- 健壮性:稳定,API接口的通用
二、Kafka的架构与安装
2.2.1 安装步骤
步骤1)上传、解压、更名、配置环境变量
[root@qianfeng01 ~]# tar -zxvf kafka_2.11-1.1.1.tgz -C /usr/local/
[root@qianfeng01 local]# cd /usr/local/
[root@qianfeng01 local]# mv kafka_2.11-1.1.1/ kafka
[root@qianfeng01 local]# ll kafka/
drwxr-xr-x 3 root root 4096 7月 7 2018 bin
drwxr-xr-x 2 root root 4096 7月 7 2018 config
drwxr-xr-x 2 root root 4096 10月 28 14:40 libs
-rw-r--r-- 1 root root 28824 7月 7 2018 LICENSE
-rw-r--r-- 1 root root 336 7月 7 2018 NOTICE
drwxr-xr-x 2 root root 44 7月 7 2018 site-docs
[root@qianfeng01 kafka]# vim /etc/profile
#spark environment
export KAFKA_HOME=/usr/local/kafka
export PATH=$KAFKA_HOME/bin:$PATH
[root@qianfeng01 kafka]# source /etc/profile
步骤2)修改server.properties
[root@qianfeng01 kafka]# cd config
[root@qianfeng01 config]# vim server.properties
# 每个节点的唯一标识符的配置
broker.id=0
# 设置消息的存储位置,如果有多个目录,可以用逗号隔开
log.dirs=/usr/local/kafka/data
# 设置zookeeper的集群地址,同时指定kafka在zookeeper上的各个节点的父znode
zookeeper.connect=qianfeng01:2181,qianfeng02:2181,qianfeng03:2181/kafka
# 下面属性可以改可不改
# 发送消息的缓存大小,100K
socket.send.buffer.bytes=102400
# 接收消息的缓存大小,100K
socket.receive.buffer.bytes=102400
# 服务端处理发送过来的数据的最大字节数 100M
socket.request.max.bytes=104857600
# 消息对应的文件保留的时间,默认使7天
log.retention.hours=168
# 消息对应的文件的最大字节数,1G
log.segment.bytes=1073741824
# 用来检查消息对应的文件是否过期或者是大于1G的时间周期,默认是300秒一检查
log.retention.check.interval.ms=300000
步骤3)同步到其他节点上
-- 同步kafka
[root@qianfeng01 local]# scp -r kafka/ qianfeng02:/usr/local/
[root@qianfeng01 local]# scp -r kafka/ qianfeng03:/usr/local/
--同步环境变量文件
[root@qianfeng01 local]# scp /etc/profile qianfeng02:/etc/
[root@qianfeng01 local]# scp /etc/profile qianfeng03:/etc/
步骤4)修改其他节点上的brokerId
# 第二台机器上的kafka
broker.id=1
# 第三台机器上的kafka
broker.id=2
2.2.2 启动操作
1. 先启动zookeeper
三个zookeeper都要启动, 可以调用自己编写的脚本:myzkServer.sh
myzkServer.sh start
myzkServer.sh status
myzkServer.sh stop
2. 再启动kafka, 注意,三台都要启动. 可以调用自己编写的脚本:mykafka.sh
mykafka.sh start
mykafka.sh stop
启动kafka的脚本(mykafka.sh)
#!/bin/bash
show(){
echo -e "\033[0;37;44m"$1"\033[00m"
}
case $1 in
start)
for i in qianfeng01 qianfeng02 qianfeng03
do
show "--------------- $i ---------------"
ssh $i> /dev/null 2>&1 << eof
/usr/local/kafka/bin/kafka-server-start.sh -daemon /usr/local/kafka/config/server.properties
exit
eof
echo " $i kafka已启动 "
done
;;
stop)
for i in qianfeng01 qianfeng02 qianfeng03
do
show "--------------- $i ---------------"
ssh $i '/usr/local/kafka/bin/kafka-server-stop.sh'
echo " $i kafka已经关闭 "
done
;;
esac
模仿这个脚本