分布式发布-订阅消息系统--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可以以同步和异步的方式发送消息
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,每次启动自动生成
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值