Kafka一站式学习

Kafka

第一章 Kafka简介

1.1. JMS规范介绍

在我们正式学习Kafka之前,先来了解下JMS,因为这可以在一定程度上帮助你更加深入的理解和学习Kafka。

1.1.1. JMS简介

JMS,全称Java Message Service,即Java消息服务应用程序接口,是一个Java平台中关于面向消息中间件的API,用于在两个应用程序之间、或者分布式系统中发送消息,进行异步通信。
JMS是一种与厂商无关的API,用来访问消息、收发系统消息,它类似于JDBC。
JMS可以自己使用Java代码或者别的代码来编写,开源的实现有Active MQ、阿里的Rocket MQ(已贡献给Apache)、Kafka等。
我们为什么要使用消息队列呢?
有些网站会在某些时间段的访问量暴增,例如各电商购物平台的秒杀活动、12306抢票等场景。而在访问量暴增的时候,对服务器就是一个非常大的考验!服务器能够处理的访问量是有限的,例如某公司的服务器能够同时处理50W连接请求,但是在活动的期间,访问量到达了70W,那么此时要么会有20W的访问被丢弃,要么干脆服务器瘫痪。无论是哪一种结果,对于用户都是非常不友好的!那么,如何去处理这样的场景的?此时就需要消息队列了!

1.1.2. JMS核心组件
组件名称 组件作用
JMS提供者 连接面向消息中间件,是JMS接口的一个实现。提供者可以是Java平台的JMS实现,也可以是非Java平台的面向消息中间件的适配器。
JMS客户 生产或者消费基于消息的Java应用程序或对象。
JMS生产者 创建并发送消息的JMS客户。
JMS消费者 接收消息的JMS客户。
JMS消息 包括可以在JMS客户之间传递的数据的对象。
JMS队列 一个容纳那些被发送的等待阅读的消息的区域。与队列名字所暗示的意义不同,消息的接收顺序并不一定要与消息的发送顺序一致。一旦一个消息被阅读,该消息将被从队列中移走。
JMS主题 一种支持发送消息给多个订阅者的机制。

JMS对象模型

组件及其作用

组件名称 功能介绍
ConnectionFactory 创建Connection对象的工厂,针对两种不同的JMS消息模型,分别有QueueConnectionFactory和TopicConnectionFactory两种。可以通过JNDI来查找ConnectionFactory对象模型。
Connection Connection表示在客户端和JMS系统之间建立的连接(针对TCP/IP包的封装)。Connection可以产生一个或多个Session。跟ConnectionFactory一样,Connection也有两种类型:QueueConnection和TopicConnection。
Session Session是操作消息的接口。可以通过Session创建生产者、消费者、消息等。Session提供了事物的功能。当需要使用Session发送/接收多个消息时,可以将这些发送、接收的动作放到一个事物中。同样,也分QueueSession和TopicSession。
MessageProducer 消息生产者由Session创建,并用于将消息发送到Destination。同样,消息生产者分两种类型:QueueSender、TopicPublisher。可以调用消息生产者的方法(send或者publish方法)发送消息。
MessageConsumer 消息消费者由Session创建,用于接收被发送到Destination的消息。两种类型:QueueReceiver、TopicSubscriber。可分别通过Session的createReceiver(Queue)或者createSubscriber(Topic)来创建。当然,也可以用Session的createDurableSubscriber方法创建持久化的订阅者。
Destination Destination的意思是消息生产者的消息发送目标或者消费者消费数据的来源。对于消息生产者来说,它的Destination是某个队列(Queue)或某个主题(Topic);对于消息消费者来说,它的Destination也是某个队列或主题。
1.1.3. JMS消息传输模型

在JMS标准中,有两种消息模型:P2P(Point To Point)、Pub/Sub(Publish/Subscribe)

1.1.3.1. P2P模型

P2P模型,即Point To Point,点对点消息传输模型。
在点对点消息传输模型中,应用程序由消息队列、发送者、接收者组成。每一个消息发送给一个特殊的消息队列,该队列保存了所有发送给它的消息。(除了被接收者消费掉的和过期的消息)

P2P消息传输模型的特点:

  • 每一个消息只有一个消费者(Consumer),即一旦消息被消费,就会被从消息队列中移除,不再存储于消息队列中了。
  • 发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送了消息之后,不管接收者有没有正在运行,都不会影响到消息被发送到消息队列。
  • 接收者在成功接收消息之后,需要向队列发送确认收到通知(acknowlegement)
1.1.3.2. Pub/Sub模型

Pub/Sub模型,即Publish/Subscribe,发布/订阅消息传输模型。
在发布/订阅消息传输模型中,发布者发布一个消息,该消息会通过Topic传递给所有的客户端。在这种模型中,发布者和订阅者彼此不知道对方,是匿名的,且可以动态发布和订阅Topic。在发布/订阅模型中,目的地被称为主题(Topic),Topic主要用于保存和传递消息,且会一直保存消息直到消息被传递给客户端。

Pub/Sub消息传输模型特点:

  • 每个消息可以有多个消费者。
  • 发布者和订阅者之间有时间上的依赖性。针对某个主题(Topic)的订阅者,它必须创建一个或多个订阅者之后,才能消费发布者的消息,而且为了消费消息,订阅者必须保持运行的状态。
  • 为了缓和这样严格的时间相关性,JMS允许订阅者创建一个可持久化的订阅。这样,即便订阅者没有被激活(运行),它也能接收到发布者的消息。
1.1.4. 消息接收

在JMS中,消息的接收可以使用以下两种方式:

消息接收方式 描述
同步 使用同步方式接收消息的话,消息订阅者调用receive()方法。在receive()方法中,消息未到达或在到达指定时间之前,方法会阻塞,直到消息可用。
异步 使用异步方式接收消息的话,消息订阅者需要注册一个消息监听者,类似于事件监听器,只要消息到达,JMS服务提供者会通过调用监听器的onMessage()方法递送消息。
1.1.5. JMS消息结构

消息(Message)主要由三部分组成,分别是Header、Properties、Body,详细描述如下:

消息组成部分 描述信息
Header 消息头,所有类型的消息这部分格式都是一样的
Properties 消息属性,按类型可以分为应用设置的属性、标准属性和消息中间件定义的属性
Body 消息正文,指我们具体需要消息传输的内容

1.2. 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.3. Kafka的设计目标

  • 高吞吐率 在廉价的商用机器上单机可支持每秒100万条消息的读写
  • 消息持久化 所有消息均被持久化到磁盘,无消息丢失,支持消息重放
  • 完全分布式 Producer,Broker,Consumer均支持水平扩展
  • 同时适应在线流处理和离线批处理

1.4. Kafka的发展历史

  1. 2010年底,开源到github,初始版本为0.7.0;
  2. 2011年7月因为备受关注,kafka正式捐赠给apache进行孵化;
  3. 2012年10月,kafka从apache孵化器项目毕业,成为apache顶级项目;
  4. 2014年,jay kreps,neha narkhede,jun rao离开linkedin,成立confluent,此后linkedin和confluent成为kafka的核心贡组织,致力于将kafka推广应用;
  5. Kafka集成了分发、存储和计算的“流式数据平台”,不再是一个简单的分布式消息系统。

1.5. Kafka的常见应用场景

**日志收集:**一个公司可以用Kafka可以收集各种服务的log,通过kafka以统一接口服务的方式开放给各种consumer,例如hadoop、Hbase、Solr等。
**消息系统:**解耦和生产者和消费者、缓存消息等。
**用户活动跟踪:**Kafka经常被用来记录web用户或者app用户的各种活动,如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到kafka的topic中,然后订阅者通过订阅这些topic来做实时的监控分析,或者装载到hadoop、数据仓库中做离线分析和挖掘。
**运营指标:**Kafka也经常用来记录运营监控数据。包括收集各种分布式应用的数据,生产各种操作的集中反馈,比如报警和报告。
**流式处理:**比如spark streaming、flink和storm等整合应用。

1.6. Kafka的核心概念


如图中,红色方框里面的都是kafka相对较核心概念,具体阐述如下:
Broker(代理): Kafka 节点,一个 Kafka 节点就是一个 broker,多个 broker 可以组成一个 Kafka 集群,每一个broker可以有多个topic。
Producer(生产者): 生产 message (数据)发送到 topic。
Consumer(消费者): 订阅 topic 消费 message,consumer 作为一个线程来消费。
Consumer Group(消费组): 一个 Consumer Group 包含多个 consumer,这个是预先在配置文件中配置好的。
Topic(主题): 一种类别,每一条发送到kafka集群的消息都可以有一个类别,这个类别叫做topic,不同的消息会进行分开存储,如果topic很大,可以分布到多个broker上,例如 page view 日志、click 日志等都可以以 topic的形式存在,Kafka 集群能够同时负责多个 topic 的分发。也可以这样理解:topic被认为是一个队列,每一条消息都必须指定它的topic,可以说我们需要明确把消息放入哪一个队列。
Partition(分区): topic 物理上的分组,一个 topic 可以分为多个 partition,每个 partition 是一个有序的队列。
Replicas(副本): 每一个分区,根据副本因子N,会有N个副本。比如在broker1上有一个topic,分区为topic-1, 副本因子为2,那么在两个broker的数据目录里,就都有一个topic-1,其中一个是leader,一个replicas。
Segment: partition 物理上由多个 segment 组成,每个 Segment 存着 message 信息。

1.7. Kafka的核心API

  • The Producer API allows an application to publish streams of records to one or more Kafka topics.Producer API(生产者API)允许一个应用程序去推送流式记录到一个或者多个kafka的topic中。
  • The Consumer API allows applications to read streams of data from topics in the Kafka cluster.Consumer API(消费者API)允许一个应用程序去订阅消费一个或者多个主题,并处理生产给他们的流式记录。
  • The Streams API allows transforming streams of data from input topics to output topics.Streams API允许将数据流从输入主题转换为输出主题。
  • The Connect API allows implementing connectors that continually pull from some source data system into Kafka or push from Kafka into some sink data system.Connect API允许实现连接器,这些连接器可以持续地从某个数据源中拉取数据到Kafka,或将数据从Kafka推入某个接收的数据系统。
  • The Admin API supports managing and inspecting topics, brokers, acls, and other Kafka objects.Admin API支持管理和检查主题、代理、ACL和其他Kafka对象。

第二章 Kafka环境部署

2.1. 单机版本搭建

单机版本的搭建最为快速、简单,但是使用场景非常局限。仅适用于进行简单的测试阶段。
强烈建议安装多Broker的集群版本!

2.1.1. 下载并解压安装

下载地址:http://archive.apache.org/dist/kafka/2.4.1/kafka_2.12-2.4.1.tgz
注:
安装包的命名中,2.12表示Scala的版本。由于Kafka是使用Scala语言来编写的,因此在下载Kafka的时候,会让你选择Scala语言的版本。你只需要选择与你本地的Scala版本相符的Kafka即可。

# 将下载好的Kafka的安装包上传到/root/software目录下
# 进入到/root/software目录下,解压安装
[root@qianfeng01 ~]$ cd /root/software
[root@qianfeng01 software]$ tar -zxvf kafka_2.12_2.4.1.tgz -C /usr/local
2.1.2. 启动服务
2.1.2.1. 启动ZooKeeper

Kafka严重依赖ZooKeeper,所以我们在启动Kafka之前,需要启动ZooKeeper服务。Kafka提供给咱们快速使用的zk服务,即解压开压缩包,其根目录下的bin目录下提供zk的启停服务,但仅适用于单机模式(zk也是单实例)。多broker模式强烈建议使用自行部署的ZooKeeper。
Kafka自带的ZooKeeper的启停脚本如下:

启用Kafka自带的ZooKeeper服务

[root@qianfeng01 kafka-2.4.1]$ cd /usr/local/kafka-2.4.1
[root@qianfeng01 kafka-2.4.1]$ bin/zookeeper-server-start.sh config/zookeeper.properties &
2.1.2.2. 启动Kafka
[root@qianfeng01 kafka-2.4.1]$ cd /usr/local/kafka-2.4.1
[root@qianfeng01 kafka-2.4.1]$ bin/kafka-server-start.sh config/server.properties

启动之后,可以使用jps命令查看当前节点的进程。如果出现名为kafka的进程,说明Kafka的单机版本搭建完成。

2.1.3. 创建主题

在Kafka中,消息是需要存储与主题中的,Producer会将消息写入到指定的Topic中,而消费者会从指定的Topic中读取数据。

# 创建一个名为test的主题
[root@qianfeng01 ~]$ cd /usr/local/kafka-2.4.1
[root@qianfeng01 kafka-2.4.1]$ bin/kafka-topics.sh --create \
--bootstrap-server qianfeng01:9092 \
--replication-factor 1 \
--partitions 1 \
--topic test

# 如何知道主题创建完成了呢?可以使用下面这个命令查看所有的主题列表
[root@qianfeng01 kafka-2.4.1]$ bin/kafka-topics.sh --list \
--bootstrap-server qianfeng01:9092
2.1.4. 发送消息

Kafka自带一个命令行客户端(client),它将从文件或标准输入中获取输入,并将其作为消息发送到Kafka集群。默认情况下,每一行都将作为单独的消息发送。
运行producer,然后输入一些信息到控制台并发送到服务端:

[root@qianfeng01 kafka-2.4.1]$ bin/kafka-console-producer.sh \
--broker-list localhost:9092 \
--topic test
>this is a message       	# 发送的第一条消息
>this is anthor message   	# 发送的第二条消息
# --broker-list是指定broker的服务器地址,默认端口是9092
2.1.5. 消费消息

kafka有一个消费者客户端命令,它可以转存消息到标准输出:

[root@qianfeng01 kafka-2.4.1]$ bin/kafka-console-consumer.sh \
--bootstrap-server localhost:9092 \
--topic test \
--from-beginning   
# --bootstrap-server 指定kafkaserver地址 
# --from-beginning从开始位置开始消费,默认情况使用from-beginning

注意:
如果有一个producer生产消息终端,另外有多个consumer终端,那么多个consumer将会同时立即消费。
所有命令行都有更多的额外参数,可以参考文档查看更多的options。

2.2. 集群版本搭建

对于kafka,单个broker仅仅是集群规模就一个,而多broker就是启动多个broker的实例(推荐在多台节点上启动),其它的什么都不改变。为了更好理解kafka,我们扩展我们的集群为三台节点。

2.2.1. 集群规划
IP 主机名 Kafka角色 描述
192.168.10.101 qianfeng01 broker 启动Broker的角色
192.168.10.102 qianfeng02 broker 启动Broker的角色
192.168.10.103 qianfeng03 broker 启动Broker的角色
2.2.2. 准备工作
2.2.2.1. JDK
[root@qianfeng01 ~]$ cd /root/software
# 这里的JDK的名字,视自己的下载到的安装包而定。
[root@qianfeng01 software]$ tar -zxvf jdk-8u321-linux-aarch64.tar.gz -C /usr/local
  • 配置环境变量
[root@qianfeng01 ~]$ vim /etc/profile

export JAVA_HOME=/usr/local/jdk1.8.0_321
export PATH=$PATH:$JAVA_HOME/bin

# 保存后,重新加载配置文件使其生效
[root@qianfeng01 ~]$ sou
rce /etc/profile
2.2.2.2. Kafka
  • 下载Kafka,并上传到/root/software目录下,下载地址:http://archive.apache.org/dist/kafka/2.4.1/kafka_2.12-2.4.1.tgz安装包的命名中,2.12表示Scala的版本。由于Kafka是使用Scala语言来编写的,因此在下载Kafka的时候,会让你选择Scala语言的版本。你只需要选择与你本地的Scala版本相符的Kafka即可。
  • 解压安装Kafka
# 进入到/root/software目录下,解压安装
[root@qianfeng01 ~]$ cd /root/software
# 解压到/usr/local下
[root@qianfeng01 software]$ tar -zxvf kafka_2.12_2.4.1.tgz -C /usr/local
[root@qianfeng01 software]$ cd /usr/local
# 原来的名字太长,使用起来麻烦,改名
[root@qianfeng01 local]$ mv kafka_2.12_2.4.1 kafka-2.4.1
# 修改环境变量
[root@qianfeng01 local]$ vim /etc/profile

export KAFKA_HOME=/usr/local/kafka-2.4.1
export PATH=$PATH:$KAFKA_HOME/bin

# 保存后,重新加载配置文件使其生效
[root@qianfeng01 ~]$ source /etc/profile
2.2.3. 修改配置文件
  • 修改配置文件$KAFKA_HOME/config/server.properties
# 当前节点Kafka实例的ID号,必须是整数,且在整个集群中不能重复
broker.id=1
# Kafka数据保存的目录,需要手动创建
logs.dir=/usr/local/kafka-2.4.1/data
# Kafka元数据在ZooKeeper中存储的目录,指定自己的ZooKeeper,不要使用内置的ZooKeeper。
# 最后的/kafka表示在ZooKeeper的根下创建kafka节点,管理所有Kafka的元数据。
zookeeper.connect=qianfeng01:2181,qianfeng02:2181,qianfeng03:2181/kafka
  • 将修改配置文件之后的Kafka发送到其他的节点
[root@qianfeng01 ~]$ cd /usr/local
# 创建数据存储目录
[root@qianfeng01 ~]$ mkdir kafka-2.4.1/data
# 分发Kafka
[root@qianfeng01 local]$ scp -r kafka-2.4.1 qianfeng02:$PWD
[root@qianfeng01 local]$ scp -r kafka-2.4.1 qianfeng03:$PWD
# 环境变量也同步一下
[root@qianfeng01 local]$ scp /etc/profile qianfeng02:/etc
[root@qianfeng01 local]$ scp /etc/profile qianfeng03:/etc
  • 到另外的两台节点上修改broker.id
[root@qianfeng01 ~]$ ssh qianfeng02
[root@qianfeng02 ~]$ vim /usr/local/kafka-2.4.1/config/server.properties
broker.id=2

[root@qianfeng01 ~]$ ssh qianfeng03
[root@qianfeng03 ~]$ vim /usr/local/kafka-2.4.1/config/server.properties
broker.id=3
2.2.4. 启动Kafka
  • 启动ZooKeeperKafka是非常依赖ZooKeeper的,需要在ZooKeeper上存储元数据信息,因此必须要先启动ZooKeeper。依次在三个节点上启动ZooKeeper就可以。
  • 启动Kafka
[root@qianfeng01 ~]$ cd /usr/local/kafka-2.4.1
[root@qianfeng01 ~]$ bin/kafka-server-start.sh -daemon config/server.properties

[root@qianfeng02 ~]$ cd /usr/local/kafka-2.4.1
[root@qianfeng02 ~]$ bin/kafka-server-start.sh -daemon config/server.properties

[root@qianfeng03 ~]$ cd /usr/local/kafka-2.4.1
[root@qianfeng03 ~]$ bin/kafka-server-start.sh -daemon config/server.properties
  • AppleSilicon注意事项由于适配的问题,ARM架构的JDK的JVM配置中的G1GC暂时处于测试阶段,因此在启动Kafka的时候会出现如下问题:
Error: VM option 'UseG1GC' is experimental and must be enabled via -XX:+UnlockExperimentalVMOptions.
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program w
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值