地表最强系列之Kafka

Kafka的定义

Kafka是一个分布式的基于发布/订阅的消息队列,主要应用于大数据实时处理领域

消息队列

  • 同步处理
  • 异步处理:起到一个削峰的作用,先将数据写到消息队列中

消息队列的两种模式

  • 点对点模式:一对一消费者主动拉取数据,消息收到了消息清除
  • 发布/订阅模式:一对多,消费者消费消息后不会清除
    kafka是消费者主动拉取数据的模式

Kafka中的术语

  • Broker:消息服务器,提供核心服务
  • Producer:消息生产者
  • Consumer:消息消费者
  • Topic:主题,发布订阅模式下的消息统一汇集地
  • Queue:队列,点对点模式下的消息队列

Kafka的基础框架

在这里插入图片描述

  • Broker
    Kafka 集群由不同的 Broker 节点组成,每个 Broker 都有唯一的 idBroker 在本地文件系统存储了所有 Topic 数据,不依赖外部数据库。

  • Topic
    Topic 类似于一个数据库表,里面存储一条条的 key-value 消息。每条消息的Key 及 Value 都有相应的序列化方式,通常是在 Producer 生产消息时指定相应的序列化器,而 Consumer 消费时使用相应的反序列化器.Topic 又分为多个不同的分区(Partition),每一条消息都由分区策略控制该消息应该存储在哪个分区之中,并由各分区相应的偏移量(Offset)唯一标识。

  • Producer发布消息
    Producer负责向Kafka主题发布(生产)消息,一个Topic可以有多个Producer实例,其相互之间没有协作关系。Producer 的 send() 方法用于发送消息,参数 ProducerRecord 封装了消息的内容:Topic、Partition、key、value 等信息。如果发送成功,返回的 RecordMetadata 中记录了消息的偏移量,如果发送失败就会重试或者抛出异常。
    Producer 以 Batch 的方式推送数据可以极大的提高处理效率, Kafka Producer 可以将消息在内存中累计到一定数量后作为一个 Batch 发送请求。Batch 的数量大小可以通过 Producer 的参数控制,参数值可以设置为累计的数据大小。通过增加 Batch 的大小,可以减少网络请求和磁盘 IO 的次数,当然具体参数设置需要在效率和时效性方面做一个权衡
    在这里插入图片描述

  • Consume消费消息
    多个 Consumer 设置为同一个 Consumer Group,组内的所有 Consumer协调在一起来消费订阅主题的所有分区。但是每个分区只能由同一个消费组内的一个 Consumer 来消费。很明显,Consumer Group 的作用是为了实现多个Consumer 并行消费一个 Topic。
    Consumer 负责订阅(消费)主题并处理消息。Consumer 负责维护到 Broker的 TCP 连接以便获取数据,每一个 Offset 唯一标识当前 Partition 中的一条记录,同时 Offset也可以标识 Consumer 在 Partition 中的位置(Position)。对 Consumer 来讲,这个位置有两种含义:Current Offset 和 Committed Offset。

分区策略

一个 Topic 包含多个 Partition,Topic 是逻辑概念,而 Partition 则是物理上的概念

  1. 生产数据时,生产者数据发往哪个分区?
    如果给定了分区号,直接将数据发往指定的分区。
    如果没有给定分区号,视消息的 key 值,通过 key 值取 hashcode 进行分区。
    如果即没有给定分区号,也没有 key 值,则直接轮询分区。
    最后,还可以指定自定义分区类。

一个 partition 只能被一个消费者消费(但一个消费者可以同时消费多个partition),因此,如果设置的 partition 的数量小于 consumer 的数量,就会有消费者消费不到数据。所以,推荐 partition 的数量一定要大于同时运行consumer 的数量

副本策略

Kafka 是有若干主题,每个主题可进一步划分成若干个分区。每个分区配置有若干个副本(Replicas), 副本数量不能多于 Broker 数量。
副本分散保存在不同的 Broker 上,从而能够解决因为部分 Broker 宕机带来的数据不可用问题
分区的所有副本保存有相同的消息序列,所有副本可分为两类:Leader 和Follower。每个分区在创建时选举一个 Leader 副本,其余副本为 Follower
Leader 副本负责所有的读写请求,Follower 不对外提供读写服务。当 Leader
所在的 Broker 宕机时,Kafka 依赖 ZooKeeper 感知该故障,并立即开启新一轮的Leader 选举,从所有 Follower 中选择新的 Leader 副本。当老的 Leader 重启后,则变为 Follower。

副本同步

Kafka 引入了 In-sync Replicas,也就是 ISR 副本集合。ISR 中的副本都是与 Leader 同步的副本,相反,不在 ISR 中的追随者副本就被认为是与 Leader 不同步的。ISR 不只是追随者副本集合,它必然包括 Leader 副本。甚至在某些情况下,ISR 只有 Leader 这一个副本。设置 ISR 主要是为了 Broker 宕掉之后,重新选举 Partition 的 Leader 时从 ISR 列表中选择,也就是说当 Leader 副本发生故障时,只有在 ISR 集合中的 Follower 副本才有资格被选举为新的 Leader

消息副本保证(acks )

  • acks=0
    如果设置为 0,那么生产者将不等待任何消息确认。消息将立刻添加到 socket 缓冲区并考虑发送。在这种情况下不能保障消息被服务器接收到。并且重试机制不会生效(因为客户端不知道故障了没有)。每个消息返回的 offset 始终设置为-1。
  • acks=1
    leader 写入消息到本地日志就立即响应,而不等待所有follower 应答。在这种情况下,如果响应消息之后但 follower 还未复制之前 leader立即故障,那么消息将会丢失。
  • acks=-1
    eader 将等待所有副本同步后应答消息。此配置保障消息不会丢失(只要至少有一个同步的副本)。这是最强壮的可用性保障。

Kafka的Linux环境搭建

Kafka的中文文档
kafka_2.11-2.0.0 提取码:yft0

  1. 将安装包导入并解压
$ tar -zvxf kafka_2.11-0.11.0.2.tgz -C /opt/install
  1. 启动zookeeper集群
zkServer.sh start
  1. 修改server.properties中内容
broker.id=0
delete.topic.enable=true
listeners=PLAINTEXT://hadoop101:9092
log.dirs=/data/kafka-logs
zookeeper.connect=hadoop101:2181       
 #hadoop101要根据情况换为自己的hostname
  1. 配置环境变量
export KAFKA_HOME=/opt/bigdata/kafka211
export PATH=$PATH:$KAFKA_HOME/bin

Kafka的常见命令

// 启动Kafka
[root@lijia1 kafka211]# kafka-server-start.sh ./config/server.properties
[root@lijia1 kafka211]# kafka-server-start.sh -daemon ./config/server.properties

// 创建topic
[root@lijia1 kafka211]# kafka-topics.sh --create --zookeeper 192.168.153.141:2181 --topic kb07demo --partitions 3 --replication-factor 1
Created topic "kb07demo".

// 查看当前kafka中的topic
[root@lijia1 kafka211]# kafka-topics.sh --zookeeper 192.168.153.141:2181 --list

// 查看topic详情
[root@lijia1 kafka211]# kafka-topics.sh --zookeeper 192.168.153.141:2181 --describe --topic kb07demo

// 删除topic
[root@lijia1 kafka211]# kafka-topics.sh --zookeeper 127.0.0.1:2181 --delete --topic kb05

// 创建生产者,产生数据
[root@lijia1 kafka211]# kafka-console-producer.sh --topic kb07demo --broker-list 192.168.153.141:9092

// 创建消费者,重头开始取数据
[root@lijia1 ~]# kafka-console-consumer.sh --bootstrap-server 192.168.153.141:9092 --topic kb07demo --from-beginning

// 查看topic消息队列数量
[root@lijia1 config]# kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list 192.168.153.141:9092 --topic kb07demo -time -1 --offsets 1
kb07demo:0:1
kb07demo:1:2
kb07demo:2:1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值