Kafka 官方:https://kafka.apache.org/documentation/#producerapi
Kafka 下载:http://archive.apache.org/dist/kafka/
专有名词
MQ:消息队列是一种异步的服务间通信方式,是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构;【基于队列的消息传递或缓存,有发布订阅模式、点对点模式两种模式】
kafka是MQ中的一种:
- Topic:数据主题,对数据分类(类似于MySQL中表的概念)
- Broker:kafka是一个分布式集群,由多台服务器构组成,每天kafka的节点就是一个Broker;
- Producer:消息生产者、数据写入Topic者,现实多为数据采集工具;
- Consumer:数据消费者、从Topic中获取数据者,获取消息的客户端;
- Consumer Group:每个Consumer必属于某一个Consumer Group,kafka中的消息必须以消费者组为单位进行订阅
- Partition:数据分区,kafka是分布式存储、一个Topic可以划分为多个分区Partition
- Replication:主从副本机制,为了保障数据的安全性,kafka将分区的副本划分两种角色:
- Leader:主要负责对外的读写
- Follower:与Leader 同步数据、如果Leader故障,从Follower中选举新的Leader对外提供读写
- Segment:分区段,每个分区可以对应多个Segment,由两组数据*.log 、.index、.timeindex Segment文件
- Offset:偏移量,每条数据在分区中的偏移量,Kafka中的消费者都是按照Offset 来读取数据,从0开始
Kafka 架构
架构角色:①Kafka 是分布式的主从架构,实现消息队列的构建;②Zookeeper 辅助选举Controller、原数据管理
分布式公平主从架构: ①主节点-Kafka Controller ②从节点-Kafka Broker
- 公平主从架构:主节点和从节点的功能是类似的,如果主节点故障,允许从节点选举成为主节点
- Zookeeper: Kafka架构依赖ZK实现选举,所有存活的Kafka节点会到ZK中创建临时节点,谁创建成功谁就是主节点,其次是元数据管理
- Kafka Controller:
- 是一种特殊的Broker,从所有Broker中选举出来的,负责普通Broker的工作
- 负责管理所有从节点:Topic、分区和副本
- 每次启动集群,会从所有Broker中选举一个Controller,由ZK实现
- Kafka Broker:
- 对外提供读写请求
- 其他的Broker监听Controller,如果Controller故障,会重新从Broker选举一个新的Controller
Kafka 安装后后目录
# kafka版本: kafka_2.12-2.4.1.tgz
tar -zxvf kafka_2.12-2.4.1.tgz -C /export/server/
cd /export/server/kafka_2.12-2.4.1/
mkdir logs
- bin:一般用于存放客户端操作命令脚本
- sbin:一般用于存放集群的启动和关闭的命令脚本,如果没有这个命令,脚本放在bin目录中
- conf/etc/config:配置文件目录
- lib:jar包的存放目录
- logs:一般用于存放服务日志
修改配置文件
- 1 切换到配置文件目录 [ node1 ]
cd /export/server/kafka_2.12-2.4.1/config
- 2 修改server.properties [ node1 ]
#21行:唯一的 服务端id
broker.id=0
#60行:指定kafka的日志及数据【segment【.log + .index】】存储的位置
log.dirs=/export/server/kafka_2.12-2.4.1/logs
#123行:指定zookeeper的地址
zookeeper.connect=node1:2181,node2:2181,node3:2181
#在最后添加两个配置,允许删除topic,当前kafkaServer的主机名
delete.topic.enable=true
host.name=node1
- 3 分发放到 node2 node3 两个节点 [ node1 ]
cd /export/server/
scp -r kafka_2.12-2.4.1 node2:$PWD
scp -r kafka_2.12-2.4.1 node3:$PWD
- 4 node2修改 server.properties
#21行:唯一的 服务端id
broker.id=1
#最后
host.name=node2
- 5 node3 修改 server.properties
#21行:唯一的 服务端id
broker.id=2
#最后
host.name=node3
- 6 在node1、node2、node3 添加环境变量
vim /etc/profile
#KAFKA_HOME
export KAFKA_HOME=/export/server/kafka_2.12-2.4.1
export PATH=:$PATH:$KAFKA_HOME/bin
source /etc/profile
Kafka 启动与关闭
- 1 启动Zookeeper
start-zk-all.sh
- 2 启动Kafka
bin/kafka-server-start.sh config/server.properties >>/dev/null 2>&1 &
- 3 关闭Kafka
bin/kafka-server-stop.sh
Kafka shell
常用的命令:
- 1 创建Topic
kafka-topics.sh --create --topic topicName --partitions 3 --replication-factor 2 --bootstrap-server node1:9092,node2:9092,node3:9092
- -create:创建
- -topic:指定名称
- -partitions :分区个数
- -replication-factor:分区的副本个数
- -bootstrap-server:指定Kafka服务端地址
- -list:列举
- 2 列举Topic
kafka-topics.sh --list -bootstrap-server node1:9092,node2:9092,node3:9092
- 3 查看Topic信息
kafka-topics.sh --describe --topic bigdata01 --bootstrap-server node1:9092,node2:9092,node3:9092
Topic: bigdata01 PartitionCount: 3 ReplicationFactor: 2
Topic: bigdata01 Partition: 0 Leader: 0 Replicas: 0,1 Isr: 1,0
Topic: bigdata01 Partition: 1 Leader: 2 Replicas: 2,0 Isr: 2,0
Topic: bigdata01 Partition: 2 Leader: 1 Replicas: 1,2 Isr: 2,1
- Topic: bigdata01 Partition: 0 Leader: 0 Replicas: 0,1 Isr: 1,0
- Topic:这个分区所属的Topic的名称
- Partition:这个分区在这个Topic中的编号
- 怎么唯一决定一个分区:Topic名称 + 分区编号
- Leader:当前这个分区的leader副本在哪台brokerid节点上
- 0:第一台机器
- 1:第二台机器
- 2:第三台机器
- Rplicas:这个分区所有副本所在节点的Brokerid
- 分区0,总共有两个副本,分别在第一台机器和第二台机器
- 分区1,总共有两个副本,分别在第三台机器和第一台机器
- 分区2,总共有两个副本,分别在第二台机器和第三台机器
- ISR:当前这个分区可用副本
- 4 删除Topic
kafka-topics.sh --delete --topic bigdata02 --bootstrap-server node1:9092,node2:9092,node3:9092
- 5 修改Topic
kafka-topics.sh --alter
--topic bigdata02 分区/副本/属性=值 --bootstrap-server node1:9092,node2:9092,node3:9092
- 6 Console 生产者
bin/kafka-console-producer.sh --topic bigdata01 --broker-list ode1:9092,node2:9092,node3:9092
- 7 Console 消费者
bin/kafka-console-consumer.sh --topic bigdata01 --bootstrap-server node1:9092,node2:9092,node3:9092 --from-beginning
-- from-beginning:从每个分区的最初开始消费,默认从最新的offset进行消费
Kafka集群压力测试
实施
- 1 创建Topic
kafka-topics.sh --create --topic bigdata --partitions 2 --replication-factor 2 --bootstrap-server node1:9092,node2:9092,node3:9092
- 2 生产测试
kafka-producer-perf-test.sh --topic bigdata --num-records 1000000 --throughput -1 --record-size 1000 --producer-props bootstrap.servers=node1:9092,node2:9092,node3:9092 acks=1
- --num-records:写入数据的条数
- --throughput:是否做限制,-1表示不限制
- --record-size:每条数据的字节大小
- 3 消费测试
kafka-consumer-perf-test.sh --topic bigdata --broker-list node1:9092,node2:9092,node3:9092 --fetch-size 1048576 --messages 1000000