1. Kafka
1.1 Kafka 是什么
Kafka 是一个分布式的基于发布/订阅模式的分布式消息队列(Massage Queue),具有高性能、持久化、多副本备份、横向扩展能力,主要应用于大数据实时处理领域。
1.2 消息队列模式
1.2.1 点对点通信
在点对点系统中,消息生产者生产的消息被保留在 Queue 中, 一个或多个消费者可以从 Queue 中取出并消费的消息,但是特定消息只能由最多一个消费者消费。 一旦消费者读取 Queue 中的消息,它就从该 Queue 中清除。
1.2.2 发布/订阅模式
在发布/订阅模式中,消息被保留在 Topic 中。与点对点模式不同,消费者可以订阅一个或多个 Topic,并使用该 Topic 中的所有消息,并且消息不会被清除。
1.2.3 Kafka 基础架构
Producer: 消息的发送者为 Producer,即消息生产者;
Consumer: 消息的使用者和接收者是 Consumer,即消息消费者
Consumer Group(CG): 消费者组,由多个 Consumer 组成。消费者组内每个消费者负责消费不同分区的数据,一个分区只能由一个组内消费者消费,消费者组之间互补影响。所有的消费者都属于某个消费者组,即消费者组是逻辑上的一个订阅者。
Broker: Kafka 集群中有很多台 Server,其中每一台 Server 都可以存储消息,将每一台 Server 称为一个 kafka 实例,也叫做 Broker,一个 Broker 可以容纳多个 Topic,一个非常大的 Topic 可以分布到多个 Broker 上。
Topic: 一个 Topic 里保存的是同一类消息,相当于对消息的分类,每个 Producer 将消息发送到 Kafka 中,都需要指明要存的 Topic 是哪个,也就是指明这个消息属于哪一类。
Partition: 每个 Topic 都可以分成多个 Partition,Partion 是一个有序的队列,每个 Partition 在存储层面是 Append Log 文件。任何发布到此 Partition 的消息都会被直接追加到 Log 文件的尾部。
Replica: 副本,为保证集群中某个节点发生故障时,该节点上的 Partition 数据不会丢失,且 Kafka 仍能够继续工作,Kafka 提供了副本机制,一个 Topic 的每个分区都有若干个副本,一个 Leader 和 若干个 Follower。
Leader: 每个分区多个副本中的“主”,生产者发送数据的对象,以及消费者消费数据的对象都是 Leader。
Follower: 每个分区多个副本中的“从”,实时从 Leader 中同步数据,保持和 Leader 数据的同步。Leader 发生故障时,某个 Follower 会成为新的 Follower。
Offset: 偏移量,一个分区对应一个磁盘上的文件,而消息在文件中的位置就成为 Offset,Offset 为一个 Long 型数据,用于标记一条信息。由于 Kafka 并没有提供其他额外的索引机制来存储 Offset,文件只能顺序的读写,所以在 Kafka 中几乎不允许对数据进行“随机读写”。
2. Kafka 安装
版本说明:
JDK:1.8
Zookeeper:3.5.7
0️⃣1️⃣ 安装 JDK,并配置环境变量
0️⃣2️⃣ 安装 Zookeeper
1️⃣ 下载 Kafka 压缩包
传送门:https://kafka.apache.org/downloads
2️⃣ 上传至服务器,并解压(我放到 /opt 目录下)
tar -zxvf kafka_2.11-2.4.1.tgz
3️⃣ 加压后的文件重命名
mv kafka_2.11-2.4.1.tgz kafka-2.4.1
4️⃣ 在 Kafka 根目录下创建 logs
文件夹
mkdir logs
5️⃣ 修改配置文件 ./config/server.properties
#broker 的全局唯一编号,不能重复,标明 Kafka 主机的编号 ========= *
broker.id=0
#删除 topic 功能使能
delete.topic.enable=true
#处理网络请求的线程数量
num.network.threads=3
#用来处理磁盘 IO 的现成数量
num.io.threads=8
#发送套接字的缓冲区大小
socket.send.buffer.bytes=102400
#接收套接字的缓冲区大小
socket.receive.buffer.bytes=102400
#请求套接字的缓冲区大小
socket.request.max.bytes=104857600
#kafka 运行日志存放的路径(刚新建的目录) ========= *
log.dirs=/opt/kafka-2.4.1/logs
#topic 在当前 broker 上的分区个数
num.partitions=1
#用来恢复和清理data 下数据的线程数量
num.recovery.threads.per.data.dir=1
#segment 文件保留的最长时间,超时将被删除
log.retention.hours=168
#配置连接 Zookeeper 集群地址(换成自己的主机名或主机IP) ========= *
zookeeper.connect=node1:2181,node2:2181,node3:2181
🌈 修改上方标识的三处即可!
6️⃣ 配置环境变量,该外刷新该文件
vim /etc/profile
export KAFKA_HOME=/opt/kafka-2.4.1
export PATH=$KAFKA_HOME/bin:$PATH
source /etc/profile
7️⃣ 向其他主机分发 Kafka
scp -rp kafka-2.4.1 node2:/opt/
scp -rp kafka-2.4.1 node3:/opt/
8️⃣ 在主机 node2、主机node3上修改配置文件 ./config/server.properties
,并添加环境变量(记得刷新)
# node2
broker.id=1
# node3
broker.id=2
9️⃣ 启动集群,依次在各个主机上执行如下命令(记得提前启动好 Zookeeper!)
/opt/kafka-2.4.1/bin/kafka-server-start.sh -daemon /opt/kafka-2.4.1/config/server.properties
1️⃣0️⃣ 在 Zookeeper 上验证,启动 Zookeeper 的客户端查看节点变化
ls /
如上图生成了跟多节点信息,记得刚才我们配置了
broker.id
属性,所以可以在/brokers/ids
节点下看到上线的的 Kafka 主机编号
ls /brokers/ids
1️⃣1️⃣ 关闭集群,依次在各个主机上执行如下命令
/opt/kafka-2.4.1/bin/kafka-server-stop.sh stop
3. 写在最后
Kafka 是一个基于发布/订阅模式的分布式消息队列。
Kafka 面向大数据,消息保存在主题中,而每个 Topic 又分为多个分区
kafka 的消息数据保存在磁盘,每个 Partition 对应磁盘上的一个文件,消息写入就是简单的文件追加,文件可以在集群内复制备份以防丢失
即使消息被消费,Kafka 也不会立即删除该消息,可以通过配置使得过一段时间后自动删除以释放磁盘空间
Kafka 依赖分布式协调服务 Zookeeper,适合离线/在线信息的消费,与 Storm 和 Spark 等实时流式数据分析常常结合使用。
🌟 Kafka 群启动/关闭脚本
#!/bin/bash
# 获取IP映射文件中的主机名
HOSTS=`cat /etc/hosts | grep node | awk '{print $2}'`
case $1 in
"start"){
for HOST in ${HOSTS}
do
echo "========= Kafka in ${HOST} ========="
ssh $HOST /opt/kafka-2.4.1/bin/kafka-server-start.sh -daemon /opt/kafka-2.4.1/config/server.properties
done
}
;;
"stop"){
for HOST in ${HOSTS}
do
echo "========= Kafka in ${HOST} ========="
ssh $HOST /opt/kafka-2.4.1/bin/kafka-server-stop.sh stop
done
}
;;
esac