Kafka基础知识
一、 kafak介绍
Kafka是一个消息引擎,主要是用来削峰填谷,做到发送方和接受方的松耦合,减少系统的不必要交互。Kafka应用的几个场景:(1)消息系统;(2)应用监控;(3)网站用户行为追踪(4)流处理。(5)持久性日志。
二、 常见的消息队列比较
常用的消息队列有ActiveMQ、RabbitMQ、Kafka ZeroMq、
| ActiveMQ | RabbitMQ | Kafka | ZeroMq |
所属公司 | Apache | Mozilla Public License | Apache/Linkedln | iMatix |
开发语言 | Java | Erlang | Scala | c/c++ |
支持协议 | AMQP、Openwire等 | AMQP | 仿AMQP | zeromq |
事务 | 支持 | 不支持 | 不支持 | 事务 |
集群 | 支持 | 支持 | 支持 | 支持 |
负载均衡 | 支持 | 支持 | 支持 | 支持 |
动态扩容 | 不支持 | 不支持 | 支持(zk) | 不支持 |
消息持久化 | 支持 | 支持 | 支持 | 不支持 |
说明:
1) zeroMq采用底层语言,史上最快的消息队列,是一个网络编程的pattern库。某些功能需要进行大量的编程。
2) 在可靠性和可用性上,RabbitMQ是首选,虽然ActiveMQ也具备,但是它性能不及RabbitMQ。
3) Kafka的吞吐量、tps比RabbitMq要强。
4) 高并发:RabbitMQ最高,原因是它的语言是天生具备高并发高可用的erlang语言。
三、 kafka专业术语
1) 消息:Message。消息实体,是通信的基本单位。
2) 主题:Topic。主题是承载消息的逻辑容器,在实际使用中多用来区分具体的业务。
3) 分区:Partition。一个有序不变的消息序列。每个主题Topic下可以有多个分区。
4) 消息位移:Offset。表示分区中每条消息的位置信息,是一个单调递增且不变的值。
5) 缓存代理,Broker。Kafka集群中的一台或多台服务器统称broker。
6) 副本:Replica。Kafka 中同一条消息能够被拷贝到多个地方以提供数据冗余,这些地方就是所谓的副本。副本还分为领导者副本和追随者副本,各自有不同的角色划分。副本是在分区层级下的,即每个分区可配置多个副本实现高可用。
7) 生产者:Producer。向主题发布新消息的应用程序。
8) 消费者:Consumer。从主题订阅新消息的应用程序。
9) 消费者位移:Consumer Offset。表示消费者消费进度,每个消费者都有自己的消费者位移。
10) 消费者组:Consumer Group。多个消费者实例共同组成的一个组,同时消费多个分区以实现高吞吐。
11) 重平衡:Rebalance。消费者组内某个消费者实例挂掉后,其他消费者实例自动重新分配订阅主题分区的过程。Rebalance 是 Kafka 消费者端实现高可用的重要手段。
说明:
l 分区是kafka并行操作的最小单元,在一定范围内,越多分区可以带来更高的吞吐量。
l 生产者的每条消息只能发送到一个分区中。同一时刻,每一个分区只能由同一个消费组内的consumer来消费。
l Zookeeper是3.4.6是比较稳定的。
l Kafka可以每秒处理10万多条数据。
l Kafka采用三层消息架构:第一层主题层,主题可以分区,分区具备副本数;第二层分区层,分区中的副本具备主备;第三层消息层,分区中若干条信息,具备offerset.
l 一般消息传输协议会有:
点对点模式(消息队列):系统A发送只能系统B接受
发布/订阅模式:多个发送者,多个接受者
将多个消费者放在同一个消费组里,可以实现消息队列;将多个消费者分散在多个消费组里,可以实现发布-订阅模式。理想情况下,Consumer实例的数量应该等于该Group订阅主题的分区总数。
l Kafka数据持久化
kafka使用消息日志来进行保存数据,一个日志文件只能是追加写消息,所以是顺序读写,可以提高kafka的吞吐量;
kafka可以进一步将日志进行划分成多个日志段(log segment),可以将老的日志保存起来,同时会定期的检查老的日志,能够做到定期清理。
l 磁盘提高效率的方法:预读和合并写
l 磁盘顺序写的速度大概是300M/s,随机写的速度只有50K/s,两者相差的速度将近10000倍。
l 磁盘组Raid:
Raid-0一块盘
Raid-1 两块盘
Radi-5 三块盘,可以坏一块
Raid-6三块或者四块,可以坏一块
四、 Kafka常用参数
1) zookeeper.connect:kafka连接zookeeper的节点
2) listeners:listener:PLAINTEXT://***:9092告诉外部连接如何连接kafka服务
3) advertised.listeners:对外发布的连接kafak服务
4) auto.create.topics.enable:自动创建topic
config/server.properties配置文件中配置了auto.create.topics.enable参数为true(默认值就是true),生产环境建议设置成false
5) unclean.leader.election.enable:是否允许非完全的分区leader选举。
生产环境建议调整unclean.leader.election.enable参数为false(默认为true)
6) auto.leader.rebalance.enable:是否允许定期自动将分区leader换为优先副本
生产环境建议调整auto.leader.rebalance.enable参数为false(默认为true)
可以脚本执行来实现,副本选举:
bin/kafka-preferred-replica-election.sh --zookeeper zookeeper:2181
7) log.retention: 控制消息数据被保存时间
默认是7天
8) log.rention.bytes
Broker为消息的总磁盘容量大小,默认是-1,即保存多少数据都可以
9) message.max.bytes
broker能够接受最大的消息大小。默认是:1000012.可以适当的调大,但是要比消费端的fetch.message.max.bytes更小。
10) max.connections.per.ip
能够和broker建立的最大连接数,默认是无限制
五、 kafka基本操作
#创建topic
bin/kafka-topics.sh --create --zookeeper zookeeper:2181 --replication-factor 1 --partitions 1 --topic test
#查看所有主题
bin/kafka-topics.sh --list --zookeeper zookeeper:2181
#产看主题的详细信息
bin/kafka-topics.sh --zookeeper zookeeper:2181 --topic test --describe
#产看所有包含失效副本osr的分区
bin/kafka-topics.sh --zookeeper zookeeper:2181 --describe --under-replicated-partitions
#查看主题中没有leader副本的分区,即isr为空导致分区leader为-1
bin/kafka-topics.sh --zookeeper zookeeper:2181 --describe --unavailable-partitions
# 增加主题的分区数
bin/kafka-topics.sh --zookeeper zookeeper:2181 --topic test --alter --partitions 2
#删除topic
bin/kafka-topics.sh --zookeeper zookeeper:2181 --topic test --delete
#生产者
bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
#消费者
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
#创建消费组:
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --consumer-property group.id=g2
#消费组详细信息:
bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --group g2
#消费组列表:
bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --list
六、 kafka定位方法
常规定位方法:
1、 docker logs kafka
2、 zkCli工具
3、 netstat查看kafka的连接数