kafka_2.12-2.6.0介绍及安装教程
1.Kafka 介绍
1.1 kafka 是什么?使用场景?
Kafka 是一个高吞吐的分布式消息队列系统。特点是生产者消费者模式,先进先出(FIFO)保证顺序,自己不丢数据,默认每隔 7 天清理数据。
消息列队常见场景:系统之间解耦合、峰值压力缓冲、异步通信。
1.2 kafka 生产消息、存储消息、消费消息
1.3 kafka 的特点
- 系统的特点:生产者消费者模型,FIFO
Partition 内部是 FIFO 的,partition 之间呢不是 FIFO 的,当然我们可以把 topic 设为一个 partition,这样就是严格的 FIFO。 - 高性能:单节点支持上千个客户端,百 MB/s 吞吐,接近网卡的极限
- 持久性:消息直接持久化在普通磁盘上且性能好
直接写到磁盘中去,就是直接 append 到磁盘里去,这样的好处是直接持久化,数据不会丢失,第二个好处是顺序写,然后消费数据也是顺序的读,所以持久化的同时还能保证顺序,比较好,因为磁盘顺序读比较好。 - 分布式:数据副本冗余、流量负载均衡、可扩展
分布式,数据副本,也就是同一份数据可以到不同的 broker 上面去,也就是当一份数据,磁盘坏掉的时候,数据不会丢失,比如 3 个副本,就是在 3 个机器磁盘都坏掉的情况下数据才会丢,在大量使用情况下看这样是非常好的,负载均衡,可扩展,在线扩展,不需要停服务。 - 很灵活:消息长时间持久化+Client 维护消费状态
消费方式非常灵活,第一原因是消息持久化时间跨度比较长,一天或者一星期等,第二消费状态自己维护消费到哪个地方了可以自定义消费偏移量。
2 kafka使用
2.1 kafka 集群搭建
1) 上传kafka_2.12-2.6.0 包到三个不同节点上,解压。
官网下载地址
2) 配置…/ kafka_2.12-2.6.0/config/server.properties 文件
- 节点编号:(不同节点按 0,1,2,3 整数来配置)
- 真实数据存储位置,本地没有该目录应创建:
- zookeeper 的节点:
3) 启动 zookeeper 集群。
4) 三个节点上,启动 kafka:
bin/kafka-server-start.sh config/server.properties
也可以自定义启动脚本:
在kafka根目录下创建startKafka.sh脚本文件:
nohup bin/kafka-server-start.sh config/server.properties > kafka.log 2>&1 &
分发至每个节点即可。
2.2 相关命令:
- 创建 topic:
bin/kafka-topics.sh --create --topic topic1 --zookeeper node2:2181,node3:2181,node4:2181 --partitions 3 --replication-factor 3
上述命令已弃用,建议:
[root@node3 kafka_2.12-2.6.0]# bin/kafka-topics.sh --create --topic t202011072104 --bootstrap-server node1:9092,node2:9092,node3:9092
–bootstrap-server node4:9092 只需指定一个broker,bootstrap-servers 会自动发现其他 broker
-
如果使用了–zookeeper参数,那么consumer的信息将会存放在zk之中
-
如果使用了–bootstrap-server参数,那么consumer的信息将会存放在kafka之中
- 用一台节点控制台来当 kafka 的生产者:
[root@node3 kafka_2.12-2.6.0]# bin/kafka-console-producer.sh --topic topic1 --broker-list node1:9092,node2:9092,node3:9092
或者:
[root@node3 kafka_2.12-2.6.0]# bin/kafka-console-producer.sh --topic topic1 --bootstrap-server node1:9092,node2:9092,node3:9092
- 用另一台节点控制台来当 kafka 的消费者:
[root@node2 kafka_2.12-2.6.0]# bin/kafka-console-consumer.sh --topic topic1 --from-beginning --bootstrap-server node1:9092,node2:9092,node3:9092
在生产者中写入数据消费者中显示如图;
查看 kafka 中 topic 列表:
bin/kafka-topics.sh --list --zookeeper node2:2181,node3:2181,node4:2181
查看 kafka 中 topic 的描述:
bin/kafka-topics.sh --describe --zookeeper node2:2181,node3:2181,node4:2181 --topic topic2020
查看 zookeeper 中 topic 相关信息:
# 启动 zookeeper 客户端:
./zkCli.sh
# 查看 topic 相关信息:
ls /brokers/topics/
# 查看消费者相关信息:
ls /consumers
- 删除 kafka 中的数据。
在 每 台 broker 节 点 中的…/config/server.properties 中配置属性:delete.topic.enable=true,
重启 kafka 集群即可实现删除 topic 时,自动清除 topic 信息。
bin/kafka-topics.sh --zookeeper node2:2181,node3:2181,node4:2181 --delete --topic t2020
2.3 kafka 的 leader 的均衡机制
当一个 broker 停止或者 crashes 时,所有本来将它作为 leader 的分区将会把 leader 转移到其他 broker 上去,极端情况下,会导致同一个leader 管理多个分区,导致负载不均衡,同时当这个 broker 重启时,如果这个 broker 不再是任何分区的 leader,kafka 的 client 也不会从这个 broker 来读取消息,从而导致资源的浪费。
kafka 中有一个被称为优先副本(preferred replicas)的概念。如果一个分区有 3 个副本,且这 3 个副本的优先级别分别为 0,1,2,根据优先副本的概念,0 会作为 leader 。当 0 节点的 broker 挂掉时,会启动 1这个节点 broker 当做 leader。当 0 节点的 broker 再次启动后,会自动恢复为此 partition 的 leader。不会导致负载不均衡和资源浪费,这就是 leader 的均衡机制。
在 Kafka2.6 版本中,Leader 均衡机制需要手动执行命令触发,首先需要配置如下 json 文件:
{
"partitions":
[
{"topic": "topicName", "partition": 0},
{"topic": "topicName", "partition": 1},
{"topic": "topicName", "partition": 2}
]
手动执行如下命令,进行 Leader 均衡:
bin/kafka-preferred-replica-election.sh --zookeeper
node2:2181,node3:2181,node4:2181 --path-to-json-file topic.json
kill掉一个leader后命令执行前:
执行后恢复: