Kafka原理以及介绍

*

1.1 Kafka是什么

  • Apache Kafka是一个开源消息系统,由Scala写成。是由Apache软件基金会开发的一个开源消息系统项目。

    Kafka最初是由LinkedIn开发,并于2011年初开源。2012年10月从Apache Incubator毕业。该项目的目标是为处理实时数据提供一个统一、高通量、低等待的平台。
    

** ** **Kafka是一个分布式消息队列:生产者、消费者的功能。**它提供了类似于JMS的特性,但是在设计实现上完全不同,此外它并不是JMS规范的实现。

   Kafka对消息保存时根据Topic进行归类,发送消息者称为Producer,消息接受者称为Consumer,此外kafka集群有多个kafka实例组成,每个实例(server)成为broker。

 无论是kafka集群,还是producer和consumer都依赖于**zookeeper**集群保存一些meta信息,来保证系统可用性

1.2Kafka 架构原理

整个架构中包括三个角色。
在这里插入图片描述

生产者(Producer):消息和数据生产者
代理(Broker):缓存代理,Kafka的核心功能
消费者(Consumer):消息和数据消费者
整体架构很简单,Kafka给Producer和Consumer提供注册的接口,数据从Producer发送到Broker,Broker承担一个中间缓存和分发的作用,负责分发注册到系统中的Consumer。

1.3Kafka 名词解释

在一套 Kafka 架构中有多个 Producer,多个 Broker,多个 Consumer,每个 Producer 可以对应多个 Topic,每个 Consumer 只能对应一个 Consumer Group。

整个 Kafka 架构对应一个 ZK 集群,通过 ZK 管理集群配置,选举 Leader,以及在 Consumer Group 发生变化时进行 Rebalance。
在这里插入图片描述
Topic 和 Partition

在 Kafka 中的每一条消息都有一个 Topic。一般来说在我们应用中产生不同类型的数据,都可以设置不同的主题。

一个主题一般会有多个消息的订阅者,当生产者发布消息到某个主题时,订阅了这个主题的消费者都可以接收到生产者写入的新消息。

Kafka 为每个主题维护了分布式的分区(Partition)日志文件,每个 Partition 在 Kafka 存储层面是 Append Log。

任何发布到此 Partition 的消息都会被追加到 Log 文件的尾部,在分区中的每条消息都会按照时间顺序分配到一个单调递增的顺序编号,也就是我们的 Offset。Offset 是一个 Long 型的数字。

我们通过这个 Offset 可以确定一条在该 Partition 下的唯一消息。在 Partition 下面是保证了有序性,但是在 Topic 下面没有保证有序性。

在这里插入图片描述
图中我们的生产者会决定发送到哪个的Partition:

如果没有 Key 值则进行轮询发送。

如果有 Key 值,对 Key 值进行 Hash,然后对分区数量取余,保证了同一个 Key 值的会被路由到同一个分区;如果想队列的强顺序一致性,可以让所有的消息都设置为同一个 Key。
||
那么,怎么通过offset查找Message

例如,读取offset=368776的Message,需要通过如下两个步骤。

第一步:查找Segment File.

00000000000000000000.index表示最开始的文件,其实偏移量(offset)为0;第二个文件00000000000000368769.index的其实偏移量为368770(368769+1),依次类推。以其实偏移量命名并排序这些文件,只要根据offset二分查找文件列表,就可以快速定位到具体文件。

当offset=368776时,定位到00000000000000368769.index|log。

第二步:通过Segment File 查找Message。

通过第一步定位到Segment File,当offset=368776时,依次定位到00000000000000368769.index的元数据物理位置和00000000000000368769.log的物理偏移地址,然后再通过00000000000000368769.log顺序查找,知道offset=368776为止。

Segment Index File采取稀疏索引存储方式,可以减少索引文件大小,通过Linux mmap接口可以直接进行内存操作。稀疏索引为数据文件的每个对应Message设置一个元数据指针,它比稠密索引节省了更多的存储空间,但查找起来需要消耗更多的时间。

1.3Kafka 特点(优点)

Kafka 社区非常活跃,从 0.9 版本开始,Kafka 的标语已经从“一个高吞吐量,分布式的消息系统”改为"一个分布式流平台"。

Kafka 和传统的消息系统不同在于:

• Kafka是一个分布式系统,易于向外扩展。

• 它同时为发布和订阅提供高吞吐量。

• 它支持多订阅者,当失败时能自动平衡消费者。

• 消息的持久化。

Kafka 和其他消息队列的对比:
在这里插入图片描述

1.4消息队列内部的实现原理

1.4为什么需要消息队列

消息系统的核心作用就是三点:解耦,异步和并行

以用户注册的案列来说明消息系统的作用

用户注册的一般流程

在这里插入图片描述
问题**:随着后端流程越来越多,每步流程都需要额外的耗费很多时间,从而会导致用户更长的等待延迟。

用户注册的并行执行

在这里插入图片描述
问题**:系统并行的发起了4个请求,4个请求中,如果某一个环节执行1分钟,其他环节再快,用户也需要等待1分钟。如果其中一个环节异常之后,整个服务挂掉了。
在这里插入图片描述

用户注册的最终一致

在这里插入图片描述

1.5 Kafka架构,分布式模型

l Topic :消息根据Topic进行归类

l Producer:发送消息者,生产者

l Consumer:消息接受者,消费者

l broker:每个kafka实例(server)

l Zookeeper:依赖集群保存meta信息。
在这里插入图片描述

1.6 Kafka的环境搭建

基础环境准备

安装前的准备工作(zk已经部署完毕)

l 关闭防火墙

chkconfig iptables off && setenforce 0

kafka单机版安装采用自带的zookeeper处理

1.校验一下java是否安装

​ [root@localhost Desktop]# java -version
​ java version “1.8.0_171”
​ Java™ SE Runtime Environment (build 1.8.0_171-b11)
​ Java HotSpot™ 64-Bit Server VM (build 25.171-b11, mixed mode)

如果没有安装,请先安装java环境 参考JDK安装方法 〜/ .bashrc文件(环境变量配置文件方式二)

2.上传kafka文件到虚拟机中kafka_2.12-2.2.0

3.解压安装kafka到/usr/local中
[root@localhost Desktop]# tar -zxvf kafka_2.11-1.0.0.tgz -C /opt/
3.1 重命名kafka的文件 :mv kafka_2.11-1.0.0 /opt/kafka

4.切换到kafka的配置文件目录
[root@localhost config]# pwd

       /opt/kafka/config

5.kafka安装目录下的config文件夹为其配置文件,我们需要修改的有 server.properties和zookeeper.properties。

​ [root@localhost kafka]# mkdir kafka-logs-0

​ server.properties: kafka的配置文件
​ log.dirs=/tmp/kafka-logs
​ 修改为
​ log.dirs=/opt/kafka1/kafka-logs-0

​ zookeeper.properties kafka自带的zookeeper的配置
​ dataDir=/tmp/zookeeper
​ 修改为
​ dataDir=/opt/kafka1/my_zookeeper

6.启动zookeeper
[root@localhost ~]# /opt/kafka/bin/zookeeper-server-start.sh /opt/kafka/config/zookeeper.properties
或者

​ /opt/kafka/bin/zookeeper-server-start.sh /opt/kafka/config/zookeeper.properties

7.启动kafka
[root@localhost Desktop]# /opt/kafka/bin/kafka-server-start.sh /opt/kafka/config/server.properties

8.创建主题 (让我们创建一个名为“test”的主题,它只包含一个分区,只有一个副本)
/opt/kafka/bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic 1704D

​ /opt/kafka/bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic wangfei

            备注: 或者,您可以将代理配置为在发布不存在的主题时自动创建主题,而不是手动创建主题。

9.查看主题: 如果我们运行list topic命令,我们现在可以看到该主题
/opt/kafka/bin/kafka-topics.sh --list --zookeeper localhost:2181

10.发送一些消息
Kafka附带一个命令行客户端,它将从文件或标准输入中获取输入,并将其作为消息发送到Kafka集群。默认情况下,每行将作为单独的消息发送。运行生产者,然后在控制台中键入一些消息以发送到服务器。

​ /opt/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic 1704D
或者
​ /opt/kafka/bin/kafka-console-producer.sh --broker-list 192.168.73.128:9092 --topic wangfei

​ >等待输入发送的消息

11.启动消费者
/opt/kafka/bin/kafka-console-consumer.sh --bootstrap-server 192.168.25.133:9092 --topic 1704D --from-beginning 从第一条开始接受
/opt/kafka/bin/kafka-console-consumer.sh --bootstrap-server 192.168.73.128:9092 --topic 1704D从现在生产者发送开始接受。

发布了18 篇原创文章 · 获赞 0 · 访问量 830

猜你喜欢

转载自blog.csdn.net/qq_45122010/article/details/104020723
今日推荐