分布式发布-订阅消息系统--Kafka简介
一、什么是Kafka
①:基于大数据的分布式(多个Patition)消息队列
②:基于发布订阅模式(一个发布者Producer:多个Consumer)
③:一类消息一个Topic
④:借助zookeeper实现集群管理
二、Kafka的优点
①:高吞吐量
②:高容错:基于多副本以及多分区
③:高并发:基于多分区
④:易扩展:多个broker节点
三、核心概念
Topic:
类似于一个数据库表,里面存储一条条的key-value信息,每条信息的Key以及Value都有相应的序列化方式,
通常是在Producer生产消息时指定的序列化器,而Consumer消费时使用相应的反序列化器,在实际应用时生产者与消费者应该约定统一的序列化方式,
Topic又分为很多个不同的分(Partition),每一条消息应该存储在哪个分区之中,并由各分区相应的偏移量(Offset)唯一标识
查看目录结构
在kafka当中, 每一个topic会有一个单独文件夹, 在topic下会为每一个分区生成一个单独的文件夹, 将这二者合并命名,`topic-分区号`,
例如`test-0`, 在每一个分区下又会有多个segment, 既然已经有多个分区了, 为什么要再进行划分为多个segment?
答:
①如果只存一个文件中, 文件会越来越大,
②Kafka中的数据默认存储7天, 每一天都会删除7天前的数据,如果都存在一个文件当中, 会不好删
Broker:
组成了Kafka集群,每个Broker都有唯一的id,Broker在本地文件系统存储了所有的Topic数据,不依赖外部数据库
Producer:
Producer负责向Kafka主题发发布(生产)消息,一个Topic 可以有多个Producer实例,而且相互之间没有协作关系。Producer的send方法用于发送消息,参数ProducerRecord封装了消息内容:Topic,Partition,key,value等信息,如果成功发送,返回RecordMetadata中记录了消息的偏移量,发送失败则报异常,如下图所示:
Producer可以以同步和异步的方式发送消息
Producer以Batch的方式推送数据可以极大的提高处理效率,Kafka Producer可以将消息在内存中累积到一定数量后作为一个Batch发送请求,Batch的大小可以通过Producer的参数调控,参数值可以设置为累计的数据大小,通过增加Batch的大小,可以减少网络请求和磁盘IO。
Consumer
负责订阅(消费)主题,并处理消息,Consumer负责维护到Broker的TCP连接以便获取数据,在一个Partition中每个记录的Offset是该记录的唯一标识,即每一个Offset唯一标识当前Partition中的一条记录,同时Offset也可以标识Consumer在Partition中的位置(Position),对于Consumer来讲,这个位置有两种含义:Current Offset和Committed Offset
四 、分区策略
一个Topic包含多个Partition,Topic是逻辑概念,而partition是物理概念,Topic与Partition的关系如下图
Partition将Topic进行分割,从而更好的将数据均匀的分布在Kafka集群的每个Broker上,
五、副本策略
Kafka有若干主题,每个主题可进一步划分成若干个分区,每个分区配置有如干个副本(Replicas),副本数量不能多于Broker数量,副本分散保存在不同的Broker上,从而能够解决因为部分Broker宕机带来数据不可用问题,,下图中就是有3台Broker的Kafka集群副本分布情况
分区的所有副本保存相同的消息队列,所有副本分为两类:Leader和Follower,每个分区在创建时选举一个Leader副本,其余为Follower.
六、常用命令
开启服务:
kafka-server-start.sh -deamon server.properties
其中-daemon是指定后台启动,,必须指定配置文件:server.properties
关闭服务:
kafka-server-stop.sh stop 最后的stop加不加都可以(不过Kafka在关闭时可能存在延时,
千万别以为命令有问题或者自己的Kafka有问题,如果过了很长时间还是关不掉,就强行关闭吧:kill-9 进程号)
如果kafka配置了集群,则需要测试:
在命令行输入zkCli.sh
然后:输入 ls /
[kafka,zooleeper]
ls /kafka
[admin,brokers,cluster,config,consumers,...]
ls /kafka/brokers
[ids,seqid,topoics]
ls /kafka/borkers/ids
[1,2,3,4] //这里是集群中kafka根目录下conf/server.properties内配置的broker.id(节点识别序列号),并且每个节点的broker.id不能重复。
创建主题:(在kafka根目录下执行命令)
bin/kafka-topics.sh --zookeeper master01:2181/kafka --create --topic first--partitions 3 --replication-factor 2
解释:
--zookeeper master01:2181/kafka:指定zookeeper连接地址为master01:2181/kafka,必须指定
--create:执行创建的命令,同理还有--delete(删除),--describe(查看),--alter(修改),--list(列表)
--topics first:执行创建的目标为主题,名字是first
--partitions 3 指定主题的分区数为3
--replication-factor 2 指定主题的备份因子为2,有两个备份
查看主题列表:
bin/kafka-topics.sh --zookeeper master01:2181/kafka --list
删除主题:(默认删除是标记,不会真正删除)
bin/kafka-topics.sh --delete --zookeeper master01:2181,master02:2181,slave01:2181,slave02:2181/kafka --topics first
--delete:执行删除命令,其余和创建时的差不多
因为在配置文件中的:delete.topic.enable=false 意为:是否真正删除topics, 默认为false, 只是标记删除,并没有真正删除, 实际开发环境中使用false。根据需求配置。
生产者测试:
bin/kafka-console-producer.sh --broker-list master01:9092,master02:902 --topic first
命令解释:
--broker-list 指定kafka的生产者服务端,主机名:端口号
--topics first 指定生产数据的存放点主题
消费者测试:
bin/kafka-console-consumer.sh --bootstrap-server master01:9092,master02:9092 --topics first --from-beginning
命令解释:
--bootstrap-server 指定kafka消费者服务端
--topics first 指定消费的数据为主题first
--from-beginning 指定消费策略为从头消费,不指定的话为从最新,也就是开启的时间
查看消费者组:
kafka-consumer-groups.sh --bootstrap-server master01:9092 --list
结果:
console-consumer-28700 为组ID,每次启动自动生成
console-consumer-28600 为组ID,每次启动自动生成
console-consumer-28500 为组ID,每次启动自动生成