参考:
Kafka 是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域。由apache开发的开源流平台,由scala和java编写。一个分布式的流平台应该包含3点关键的能力:
通常将kafka用于两类程序
相关的组件包括
(1)点对点模式(一对一)
消息发送者生产消息发送到消息队列中,然后消息接收者从消息队列中取出并且消费消息。消息被消费以后,消息队列中不再有存储,所以消息接收者不可能消费到已经被消费的消息。
(2)发布订阅模式(一对多)
基础架构
Producer : 消息生产者,就是向 kafka broker 发消息的客户端;
Consumer : 消息消费者,向 kafka broker 取消息的客户端;
Consumer Group (CG): 消费者组,由多个 consumer 组成。 消费者组内每个消费者负责消费不同分区的数据,一个分区只能由一个组内的一个消费者消费;消费者组之间互不影响(并行消费)。 所有的消费者都属于某个消费者组,即消费者组是逻辑上的一个订阅者。
Broker : 一台 kafka 服务器就是一个 broker。一个集群由多个 broker 组成。一个 broker可以容纳多个 topic。
Topic : 可以理解为一个队列, 生产者和消费者面向的都是一个 topic;
Partition: 为了实现扩展性,一个非常大的 topic 可以分布到多个 broker(即服务器)上,一个 topic 可以分为多个 partition,每个 partition 是一个有序的队列;
Replica: 副本,为保证集群中的某个节点发生故障时, 该节点上的 partition 数据不丢失 且 kafka 仍然能够继续工作,kafka 提供了副本机制,一个 topic 的每个分区都有若干个副本,一个 leader 和若干个 follower。
leader: 每个分区多个副本的“主”,生产者发送数据的对象,以及消费者消费数据的对象都是 leader。
follower: 每个分区多个副本中的“从”,实时从 leader 中同步数据,保持和 leader 数据的同步。 leader 发生故障时,某个 follower 会成为新的 leader
注意:
leader和follower一定不在同一台机器
一个分区的数据只能由一个消费者进行消费
zookeeper已经成为kafka的一个瓶颈,未来数据将不会存储在zookeeper中
本环境的相关包版本如下
启动三台ec2实例,相互之间配置免密码登录,提前安装java8(貌似aws corretto没有jps,自己找一个jdk包安装)
编写同步脚本如下,之后的所有配置都从master上同步到从节点
#!/bin/bash
if [ $# -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi
for host in master slave1 slave2
do
echo ==================== $host ====================
for file in $@
do
if [ -e $file ]
then
pdir=$(cd -P $(dirname $file); pwd)
fname=$(basename $file)
ssh $host "mkdir -p $pdir"
rsync -av $pdir/$fname ec2-user@$host:$pdir
else
echo $file does not exists!
fi
done
done
修改hosts之后同步配置
$ sudo vim /etc/hosts
172.31.16.100 master
172.31.16.101 slave1
172.31.16.102 slave2
提前启动zookeeper
配置zookeeper,zookeeper内部原理和API操作
#!/bin/bash
if [ $# -lt 1 ]
then
echo "No Args Input..."
exit ;
fi
case $1 in
"start")
echo " =================== 启动 zookeeper ==================="
ssh master "/opt/module/zookeeper-3.4.10/bin/zkServer.sh start"
ssh slave1 "/opt/module/zookeeper-3.4.10/bin/zkServer.sh start"
ssh slave2 "/opt/module/zookeeper-3.4.10/bin/zkServer.sh start"
;;
"stop")
echo " =================== 关闭 zookeeper==================="
ssh master "/opt/module/zookeeper-3.4.10/bin/zkServer.sh stop"
ssh slave1 "/opt/module/zookeeper-3.4.10/bin/zkServer.sh stop"
ssh slave2 "/opt/module/zookeeper-3.4.10/bin/zkServer.sh stop"
;;
"status")
echo " =================== 关闭 zookeeper==================="
ssh master "/opt/module/zookeeper-3.4.10/bin/zkServer.sh status"
ssh slave1 "/opt/module/zookeeper-3.4.10/bin/zkServer.sh status"
ssh slave2 "/opt/module/zookeeper-3.4.10/bin/zkServer.sh status"
;;
*)
echo "Input Args Error..."
;;
esac
查看jps状态
#!/bin/bash
for host in master slave1 slave2
do
echo =============== $host ===============
ssh $host jps
done
查看zookeeper状态
$ myzoo.sh status
=================== 关闭 zookeeper===================
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: follower
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: leader
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: follower
解压缩包
sudo mkdir -p /opt/module/
sudo chown 1000:1000 /opt/module
tar -xzvf kafka_2.12-3.0.0.tgz -C /opt/module/
查看bin目录
master:/opt/module/kafka_2.12-3.0.0$ ls bin/
connect-distributed.sh kafka-dump-log.sh kafka-storage.sh
connect-mirror-maker.sh kafka-features.sh kafka-streams-application-reset.sh
connect-standalone.sh kafka-get-offsets.sh kafka-topics.sh
kafka-acls.sh kafka-leader-election.sh kafka-transactions.sh
kafka-broker-api-versions.sh kafka-log-dirs.sh kafka-verifiable-consumer.sh
kafka-cluster.sh kafka-metadata-shell.sh kafka-verifiable-producer.sh
kafka-configs.sh kafka-mirror-maker.sh trogdor.sh
kafka-console-consumer.sh kafka-producer-perf-test.sh windows
kafka-console-producer.sh kafka-reassign-partitions.sh zookeeper-security-migration.sh
kafka-consumer-groups.sh kafka-replica-verification.sh zookeeper-server-start.sh
kafka-consumer-perf-test.sh kafka-run-class.sh zookeeper-server-stop.sh
kafka-delegation-tokens.sh kafka-server-start.sh zookeeper-shell.sh
kafka-delete-records.sh kafka-server-stop.sh
修改配置文件server.properties
//kafka的唯一识别号
broker.id=0
//日志和数据的存放目录
log.dirs=/opt/module/kafka_2.12-3.0.0/datas
//kafka依赖zookeeper
zookeeper.connect=master:2881.slave1:2181,slave2:2181/kafka
分发文件,并修改broker.id
修改环境变量
export JAVA_HOME=/opt/module/jdk1.8.0_212
export PATH=$PATH:$JAVA_HOME/bin
export KAFKA_HOME=/opt/module/kafka_2.12-3.0.0_2.12-3.0.0
export PATH=$PATH:$KAFKA_HOME/bin
启动kafka
bin/kafka-server-start.sh config/server.properties
启动脚本
#!/bin/bash
if [ $# -lt 1 ]
then
echo "No Args Input..."
exit ;
fi
case $1 in
"start")
echo " =================== 启动 kafka==================="
ssh master "kafka-server-start.sh -daemon /opt/module/kafka_2.12-3.0.0/config/server.properties"
ssh slave1 "kafka-server-start.sh -daemon /opt/module/kafka_2.12-3.0.0/config/server.properties"
ssh slave2 "kafka-server-start.sh -daemon /opt/module/kafka_2.12-3.0.0/config/server.properties"
;;
"stop")
echo " =================== 关闭 kafka==================="
ssh master "kafka-server-stop.sh stop"
ssh slave1 "kafka-server-stop.sh stop"
ssh slave2 "kafka-server-stop.sh stop"
;;
*)
echo "Input Args Error..."
;;
esac
查看进程,QuorumPeerMain是zookeeper进程
master:$ jpsall.sh
=============== master ===============
29589 QuorumPeerMain
32824 Kafka
32906 Jps
32366 ZooKeeperMain
=============== slave1 ===============
4929 QuorumPeerMain
7124 Jps
7050 Kafka
=============== slave2 ===============
29825 Kafka
27703 QuorumPeerMain
29899 Jps
查看zookeeper节点
[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper, kafka]
[zk: localhost:2181(CONNECTED) 7] ls /kafka
[cluster, controller_epoch, controller, brokers, feature, admin, isr_change_notification, consumers, log_dir_event_notification, latest_producer_id_block, config]
参数 | 描述 |
---|---|
–bootstrap-server |
连接的kafka broker主机名称和端口号 |
–topic |
操作的主体名称 |
–create | 创建主题 |
–delete | 删除主题 |
–alter | 修改主题 |
-list | 列出所有主题 |
–describe | 查看主题的详细描述 |
–partition |
设置分区数 |
–replocation-factor |
设置分区副本 |
–config |
更新系统默认配置 |
查看当前服务器的所有topic
9092: Kafka集群节点之间通信的RPC端口
kafka-topics.sh --bootstrap-server master:9092,slave1:9092 --list
创建topic
kafka-topics.sh --bootstrap-server master:9092 --topic first --create --partitions 1 --replication-factor 3
查看topic的详细信息
kafka-topics.sh --bootstrap-server master:9092 --describe --topic first
Topic: first TopicId: CxCmQXEHSKeWnXXmA2UK_g PartitionCount: 1 ReplicationFactor: 3 Configs: segment.bytes=1073741824
Topic: first Partition: 0 Leader: 2 Replicas: 2,1,0 Isr: 1,0,2
修改分区数
kafka-topics.sh --bootstrap-server master:9092 --alter --topic first --partitions 3
//查看topic详细信息,分区只能增加不能减少
Topic: first TopicId: CxCmQXEHSKeWnXXmA2UK_g PartitionCount: 3 ReplicationFactor: 3 Configs: segment.bytes=1073741824
Topic: first Partition: 0 Leader: 2 Replicas: 2,1,0 Isr: 1,0,2
Topic: first Partition: 1 Leader: 0 Replicas: 0,1,2 Isr: 0,1,2
Topic: first Partition: 2 Leader: 1 Replicas: 1,2,0 Isr: 1,2,0
删除topic
注意:需要 server.properties 中设置 delete.topic.enable=true 否则只是标记删除
bin/kafka-topics.sh --bootstrap-server master:9092 --delete --topic first
发送消息
bin/kafka-console-producer.sh --bootstrap-server master:9092 --topic first
消费信息
bin/kafka-console-consumer.sh --bootstrap-server master:9092 --topic first
bin/kafka-console-consumer.sh --bootstrap-server master:9092 --from-beginning --topic first