Kafka
简介
kafka不是一个标准的JMS(java message)java消息队列实现,它是一个类似于JMS框架
它是一个发布和拉取过程,和传统的mq是不一样的 传统的是发布和订阅的过程
服务端不会主动把数据推送给消费者,需要消费者自己主动把数据拉取过来
在架构模型方面
客户端Producer通过连接channel和server进行通信,Consumer从queue获取消息进行消费(长连接,queue有消息会推送到consumer端,consumer循环从输入流读取数据),kafka遵从一般的MQ结构,producer,broker,consumer,以consumer为中心,消息的消费信息保存的客户端consumer上,consumer根据消费的点,从broker上批量pull数据;无消息确认机制。
在吞吐量
kafka具有高的吞吐量,内部采用消息的批量处理,zero-copy机制,数据的存储和获取是本地磁盘顺序批量操作,具有O(1)的复杂度,消息处理的效率很高。
传统MQ在吞吐量方面稍逊于kafka,他们的出发点不一样,rabbitMQ支持对消息的可靠的传递,支持事务,不支持批量的操作;基于存储的可靠性的要求存储可以采用内存或者硬盘。
在可用性方面
kafka的broker支持主备模式。
在集群负载均衡方面
kafka采用zookeeper对集群中的broker、consumer进行管理,可以注册topic到zookeeper上;通过zookeeper的协调机制,producer保存对应topic的broker信息,可以随机或者轮询发送到broker上;并且producer可以基于语义指定分片,消息发送到broker的某分片上。
Kafka的流程图
角色介绍
1、producer
生产者,它会把数据源写入到kafka集群中
2、broker
一个broker就是kafka集群的节点,可以存放数据
3、topic
消息的主题,它是一类消息的集合
4、partition
分区概念, 也就是说一个topic有多个分区
5、replication
副本
一个分区可以设置多个副本,副本保证数据的安全性
6、segment
每一个分区数据都很多segment,一个segment里面有2个文件,一个是.log文件,它是topic数据存储的文件,还有一个文件叫.index文件,它是.log文件索引文件。
7、zookeeper
通过zk保存kafka集群元数据信息,这些元数据信息包括:kafka集群地址、有哪些topic,以及每一个topic的分区数等等信息
8、consumer
消费者
消费者去kafka集群中拉取数据然后进行消费
9、offset
消息的偏移量
保存消息消费到哪里了,它会把消息消费的数据记录,当前这个记录信息叫做offset偏移量
消息偏移量的保存有2种方式
第一种: 可以kafka自己去保存(这个偏移量由整个kafka集群自带一个topic:__consumer_offsets)
第二种:由zookeeper保存
Kafka的消费策略
Kafka集群启动
先启动zk集群
然后在所有节点执行脚本
nohup kafka-server-start.sh /export/servers/kafka/config/server.properties >/dev/null 2>&1 &
一键启动kafka
start_kafka.sh
#!/bin/sh
for host in node1 node2 node3
do
ssh KaTeX parse error: Expected 'EOF', got '&' at position 116: …s >/dev/null 2>&̲1 &" e…host kafka is running"
done
2、停止
然后在所有节点执行脚本
需要修改信息 kafka-server-stop.sh
这个脚本的逻辑就是通过下面的命令获取kafka进程号,这个默认的kafka集群是获取不到(脚本有问题)
原始:
PIDS=$(ps ax | grep -i ‘kafka.Kafka’ | grep java | grep -v grep | awk '{print KaTeX parse error: Expected 'EOF', got '}' at position 2: 1}̲') 再所有的节点都需要修…(ps ax | grep -i ‘kafka’ | grep java | grep -v grep | awk ‘{print $1}’)
可以在所有节点执行:
kafka-server-stop.sh
一键停止kafka
stop_kafka.sh
#!/bin/sh
for host in node1 node2 node3
do
ssh KaTeX parse error: Expected 'EOF', got '&' at position 79: …-server-stop.sh&̲" echo "host kafka is stopping"
done
kafka的命令行的管理使用
创建topic
kafka-topics.sh
kafka-topics.sh --create --partitions 3 --replication-factor 2 --topic test --zookeeper node-1:2181,node-2:2181,node-3:2181
2、查询所有的topic
kafka-topics.sh
kafka-topics.sh --list --zookeeper node-1:2181,node-2:2181,node-3:2181
3、模拟生产者写入数据到topic中
kafka-console-producer.sh
kafka-console-producer.sh --broker-list node-1:9092,node-2:9092,node-3:9092 --topic test
4、模拟消费者拉取topic中的数据
kafka-console-consumer.sh
kafka-console-consumer.sh --bootstrap-server node1:9092,node2:9092,node3:9092 --topic test --from-beginning
kafka-console-consumer.sh --zookeeper node1:2181,node2:2181,node3:2181 --topic test --from-beginning