- 准备环境
准备3台虚拟机机器,一样系统(cent os7),安装同样的jdk, Zookeeeper;关闭防火前;SSH无密登录配置好。
kafka集群部署
名称 | 角色 | 地址 | 编号(myid) |
hadoop130 | 节点 | 192.168.64.130 | 1 |
hadoop131 | 节点 | 192.168.64.131 | 2 |
hadoop132 | 节点 | 192.168.64.132 | 3 |
准备kafka压缩包
kafka_2.13-3.5.1.tgz
- 解压配置
- 解压
tar -zxvf kafka_2.13-3.5.1.tgz
- 移动
mv kafka_2.13-3.5.1 /opt/module
- 修改配置文件server.properties
vi server.properties
# 指定broker的id
broker.id=0
# 指定Kafka数据的位置
log.dirs=/opt/module/kafka_2.13-3.5.1/data
# 配置zk的三个节点
zookeeper.connect=hadoop130:2181,hadoop131:2181,hadoop132:2181
- 配置kafka 环境
vi /etc/profile
增加
#kafka path
export KAFKA_HOME=/opt/module/kafka_2.13-3.5.1
export PATH=:$PATH:$KAFKA_HOME/bin
使子生效
source /etc/profile
- 把配置好的kafka拷贝到另外机器上
scp -r kafka_2.13-3.5.1 hadoop131:/opt/module
scp -r kafka_2.13-3.5.1 hadoop132:/opt/module
分别修改配置文件中broker.id的值为1和2
- 运行
编写一键启停kafka集群文件kafkaCluster.sh
#!/bin/sh
case $1 in
"start"){
for host in hadoop130 hadoop131 hadoop132
do
ssh $host "source /etc/profile; nohup ${KAFKA_HOME}/bin/kafka-server-start.sh ${KAFKA_HOME}/config/server.properties > /dev/null 2>&1 &"
echo "$host kafka is running..."
sleep 1.5s
done
};;
"stop"){
for host in hadoop130 hadoop131 hadoop132
do
ssh $host "source /etc/profile; nohup ${KAFKA_HOME}/bin/kafka-server-stop.sh > /dev/null 2>&1 &"
echo "$host kafka is stopping..."
sleep 1.5s
done
};;
esac
启动:
kafkaCluster.sh start
停止:
kafkaCluster.sh stop
- 参数说明
# 指定broker的id
broker.id=0
# 配置zk的三个节点
zookeeper.connect=hadoop130:2181,hadoop131:2181,hadoop132:2181
# 指定Kafka数据的位置
log.dirs=/opt/module/kafka_2.13-3.5.1/data
#为了实现内外网访问,我们定义两种访问服务INTERNAL(内网),EXTERNAL(外网)。内外网配置的协议都是PLAINTEXT。这样就可以实现区分内外网ip访问kafka服务。
listener.security.protocol.map=INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
listeners=INTERNAL://hadoop130:9092,EXTERNAL://hadoop130:19092
#指定broker间使用的协议为
inter.broker.listener.name=INTERNAL
- 测试
5.1简单命令测试
创建topic
kafka-topics.sh --create --topic test001 --bootstrap-server hadoop130:9092
查看所有topic
kafka-topics.sh --list --bootstrap-server localhost:9092
# 查看当前kafka集群中的topic
kafka-topics.sh --bootstrap-server hadoop130:9092,hadoop131:9092.hadoop132:9092 --list
生产者
kafka-console-producer.sh --broker-list hadoop130:9092 --topic haha
消费者 [--property print.key]显示key [--from-beginning]从开始位置消费
kafka-console-consumer.sh --bootstrap-server PLAINTEXT://localhost:9092 --topic haha --from-beginning
标记删除 删除主题
kafka-topics.sh --delete --topic test001 --bootstrap-server hadoop130:9092
kafka-topics.sh --delete --topic test --bootstrap-server hadoop130:9092
# 创建名为test的主题 1个分区,一个副本
kafka-topics.sh --create --bootstrap-server hadoop130:9092 --topic test --partitions 1 --replication-factor 1
生产一些消息到Kafka的test主题中
kafka-console-producer.sh --broker-list hadoop130:9092 --topic test
消费 test 主题中的消息
kafka-console-consumer.sh --bootstrap-server hadoop130:9092 --topic test --from-beginning
查询 Topic 的详细信息
kafka-topics.sh --describe --topic test --bootstrap-server localhost:9092
说明:如果未指定 topic 则输出所有 topic 的信息
5.2基于1个分区1个副本的基准测试
1》创建topic
kafka-topics.sh --create --bootstrap-server hadoop130:9092 --topic benchmark --partitions 1 --replication-factor 1
2》生产消息基准测试
使用5000万条数据
kafka-producer-perf-test.sh
--topic topic的名字
--num-records 总共指定生产数据量(默认5000W)
--throughput 指定吞吐量——限流(-1不指定)
--record-size record数据大小(字节)
--producer-props
bootstrap.servers=server1:9092,server2:9092,server3:9092 acks=1 指定Kafka集群地址,ACK模式
执行:
kafka-producer-perf-test.sh --topic benchmark --num-records 5000000 --throughput -1 --record-size 1000 --producer-props bootstrap.servers=hadoop130:9092,hadoop131:9092,hadoop132:9092 acks=1
结果:
5000000 records sent, 31177.123474 records/sec (29.73 MB/sec), 1042.11 ms avg latency, 1588.00 ms max latency, 1018 ms 50th, 1239 ms 95th, 1367 ms 99th, 1566 ms 99.9th.
总记录数 | 5000000 |
吞吐量 | 31177.123474 records/sec 3.1万条/秒 |
吞吐速率 | 29.73 MB/sec |
平局延迟时间 | 1042.11 ms |
最大延迟时间 | 1588.00 ms |
3》消费消息基准测试
kafka-consumer-perf-test.sh
--broker-list 指定kafka集群地址
--topic 指定topic的名称
--fetch-size 每次拉取的数据大小
--messages 总共要消费的消息个数
执行:
kafka-consumer-perf-test.sh --broker-list hadoop130:9092,hadoop131:9092,hadoop132:9092 --topic benchmark --fetch-size 1048576 --messages 5000000
结果:
start.time, end.time, data.consumed.in.MB, MB.sec, data.consumed.in.nMsg, nMsg.sec, rebalance.time.ms, fetch.time.ms, fetch.MB.sec, fetch.nMsg.sec
2023-07-28 09:52:34:274, 2023-07-28 09:53:29:822, 4768.7149, 85.8485, 5000360, 90018.7225, 684, 54864, 86.9188, 91141.0032
data.consumed.in.MB共计消费的数据 | 4768.7149MB |
MB.sec每秒消费的数据 | 85.8485 每秒85MB |
data.consumed.in.nMsg共计消费的数量 | 5000360 |
nMsg.sec每秒的数量 | 90018.7225 每秒9万条 |
5.3基于3个分区1个副本的基准测试
1》创建topic
kafka-topics.sh --create --bootstrap-server hadoop130:9092 --topic benchmark2 --partitions 3 --replication-factor 1
2》生产消息基准测试
执行:
kafka-producer-perf-test.sh --topic benchmark2 --num-records 5000000 --throughput -1 --record-size 1000 --producer-props bootstrap.servers=hadoop130:9092,hadoop131:9092,hadoop132:9092 acks=1
结果:
5000000 records sent, 76849.774062 records/sec (73.29 MB/sec), 406.48 ms avg latency, 2454.00 ms max latency, 313 ms 50th, 1008 ms 95th, 1597 ms 99th, 2412 ms 99.9th.
总记录数 | 5000000 |
吞吐量 | 76849.774062 records/sec 7.6万条/秒 |
吞吐速率 | 73.29 MB/sec |
平局延迟时间 | 406.48 ms |
最大延迟时间 | 2454.00 |
3》消费消息基准测试
执行:
kafka-consumer-perf-test.sh --broker-list hadoop130:9092,hadoop131:9092,hadoop132:9092 --topic benchmark2 --fetch-size 1048576 --messages 5000000
结果:
2023-07-28 11:25:08:577, 2023-07-28 11:25:32:203, 4768.3716, 201.8273, 5000000, 211631.2537, 576, 23050, 206.8708, 216919.7397
data.consumed.in.MB共计消费的数据 | 4768.3716MB |
MB.sec每秒消费的数据 | 201.8273 每秒201MB |
data.consumed.in.nMsg共计消费的数量 | 5000000 |
nMsg.sec每秒的数量 | 211631.2537 每秒21万条 |
5.4基于1个分区3个副本的基准测试
kafka-topics.sh --create --bootstrap-server hadoop130:9092 --topic benchmark3 --partitions 1 --replication-factor 3
kafka-producer-perf-test.sh --topic benchmark3 --num-records 5000000 --throughput -1 --record-size 1000 --producer-props bootstrap.servers=hadoop130:9092,hadoop131:9092,hadoop132:9092 acks=1
5000000 records sent, 21923.382164 records/sec (20.91 MB/sec), 1466.92 ms avg latency, 10952.00 ms max latency, 1135 ms 50th, 3516 ms 95th, 6992 ms 99th, 10550 ms 99.9th.
kafka-consumer-perf-test.sh --broker-list hadoop130:9092,hadoop131:9092,hadoop132:9092 --topic benchmark3 --fetch-size 1048576 --messages 5000000
2023-07-28 11:50:32:722, 2023-07-28 11:51:42:537, 4768.3716, 68.3001, 5000000, 71617.8472, 760, 69055, 69.0518, 72406.0531
- 总结
同样环境分区副本不同测试比较
生产 总记录数5000000
项目 | 1分区1副本 | 3分区1副本 | 1分区3副本 |
吞吐量 | 31177.123474 records/sec 3.1万条/秒 | 76849.774062 records/sec 7.6万条/秒 | 21923.382164 records/sec 2.1万条/秒 |
吞吐速率 | 29.73 MB/sec | 73.29 MB/sec | 20.91 MB/sec |
平局延迟时间 | 1042.11 ms | 406.48 ms | 1466.92 ms |
最大延迟时间 | 1588.00 ms | 2454.00 | 10952.00 ms |
结论 | 分区多 吞吐量大 ;副本多 吞吐量小。 |
消费 总记录数5000000
项目 | 1分区1副本 | 3分区1副本 | 1分区3副本 |
data.consumed.in.MB共计消费的数据 | 4768.7149MB | 4768.3716MB | 4768.3716MB |
MB.sec每秒消费的数据 | 85.8485 每秒85MB | 201.8273 每秒201MB | 68.3001 每秒68MB |
data.consumed.in.nMsg共计消费的数量 | 5000360 | 5000000 | 5000000 |
nMsg.sec每秒的数量 | 90018.7225 每秒9万条 | 211631.2537 每秒21万条 | 71617.8472 每秒7.1万条 |
结论 | 分区多 每秒消费量大; 副本多 每秒消费量小。 |