kafka入门小记

微信扫一扫,分享到朋友圈

kafka入门小记

前言

本文是Kafka的基础科普文,主要讲述 什么是KafkaKafka的架构 以及 Kafka的基本使用 三个方面。

什么是Kafka

我在学习Kafka时,主要参考了极客时间的《Kafka核心技术与实战》,这门课程提到,Kafka既是一个开源的 分布式消息引擎 ,也是一个 分布式流处理平台 ,不过目前大部分的使用场景还是将其作为一个消息引擎,承接上下游。

简单理解的话,Kafka就是一个 生产者消费者队列 ,生产者往Kafka写入 消息 ,而消费者从Kafka读取消息。当然,Kafka肯定比一般的生产者消费者队列复杂得多。

Kafka的架构

对于初学者,个人觉得理解Kafka有几个关键点:主题、消息、Broker、消费者、生产者、副本(备份)机制、分区机制。

为了更容易理解,这里先奉上一份架构图(来自极客时间):

1.Broker

首先,像kafka、Docker、Hadoop这类软件,是有客户端和服务端之分的。

对于kafka而言,它的客户端就是上图的 生产者以及消费者 ,这些通常是使用Kafka提供的API编写的程序,而 服务端就是 Broker 。Kafka的Broker既可以分布在同一台机器,也可以 分布在不同机器上 ,目的是提高可用性。

2.副本机制

在上图的右上角可以看到有Leader副本和Follower副本(Replica),这个是Kafka的 备份机制 ,是实现高可用的第二种方式。

2.1 首先,副本的数量是人为可控的,但只会有一个Leader副本,剩下的都是Follower副本。

2.2 Leader副本负责 消息的读取和写入 ,而Follower副本 不提供读写 ,只负责将Leader的数据同步到自身中,提供数据冗余,保证高可用。(你可以看到上图生产者和消费者指向的都是Leader副本)

2.3 为什么Follower副本不提供读写?

2.3.1 对于写 ,如果Follower也提供写入的话,其实也就没有Leader和Follower的概念了,而且如何保证Leader和Follower数据一致也是个问题。

2.3.2 对于读 ,可能很多人会奇怪为什么Follower不提供读取的能力,从而分担Leader的压力,就像MySQL的主从机制一样。这是因为 Kafka的分区机制,已经实现了读取的负载均衡 ,所以Follower就没有必要提供读取的能力。

详情可以参考这里 为什么kafka不支持主从分离?

3.分区机制

分区机制指的是一个主题可以划分为多个分区,每条消息只会存放在某个分区下。分区机制不同于副本机制,它解决的是分布式系统的 伸缩性 问题。

这个如何理解呢?结合上图,想象一下,如果没有分区,即每个主题对应一个分区。如果你的系统只有一个大主题,也就是 这个主题只会存在一个Broker中 ,那么随着业务的增长,你这个主题下的数据会越来越多,从而导致单台Broker根本hold不住,那如何解决呢?

可能很多人会想到 将一个大主题划分为多个小主题 不就好了,这样就可以将不同主题分布在不同机器上。其实这个思想跟分区机制是非常相像的,不过这两者还是有一定区别。

这是因为主题一般是跟业务关联的,如果为了伸缩性,将一个主题拆分成几个主题,可能会违反原本的业务逻辑;而如果是分区,它是与业务无关的,所以为了伸缩性,你可以尽情地扩展你的分区(当然不是越多越好)。

4.主题和消息

主题(topic)和消息比较好理解,即消费者订阅了某个主题,当消费者往这个主题写入消息,消费者就可以收得到。

在Kafka中:

4.1 一条消息只会写入一个主题下某个分区。

4.2 消息的写入是 追加式 的,即每写入一条消息,偏移量加一,如上图,分区2就有5条消息。

5.消费者组

上图还有一个消费者组的概念,简单理解的话,消费者组就是将多个消费者绑定在一起。

我们知道,Kafka提供了 点对点发布订阅 两种模式,而主题与消费者组就是典型的点对点模式。

主题里的消息只会被消费者组里的一个消费者消费,并且当消费者组的某一个消费者挂了,还可以由另外的消费者顶上,也就是所谓的”重平衡”(重新平衡,Rebalance)

Kafka安装

关于Kafka的安装,可以参考我的另一篇文章 如果你不会用 kafka-docker,看这里

Kafka基本使用

注:这里的使用方式是与上述的安装方式关联的,另外,Kafka既可以在容器外,也可以在容器内执行命令,本质都是一样的。

容器外

# 创建一个topic
$ docker exec kafka-docker_kafka_1 \
kafka-topics.sh \
--create --topic topic001 \
--partitions 1 \
--zookeeper zookeeper:2181 \
--replication-factor 1
Created topic "topic001".
# 查看topic
$ docker exec kafka-docker_kafka_1 kafka-topics.sh --list --zookeeper zookeeper:2181
topic001
复制代码

容器内执行

# 1.进入容器
$ docker exec -it kafka-docker_kafka_1 bash
# 2.进入安装kafka的目录
$ cd /opt/kafka_2.11-0.11.0.3/bin/
# 3.创建Topic(名称为topic002,分区数量为1,副本数量为2)
$ ./kafka-topics.sh --create --topic topic002 --zookeeper zookeeper:2181 --partitions 1 --replication-factor 2
Created topic "topic002".
# 4.查看Topic列表
$ ./kafka-topics.sh --list --zookeeper zookeeper:2181
topic001
topic002
# 5.启动一个新的窗口,消费/监听发送的消息
$ docker exec kafka-docker_kafka_1 kafka-console-consumer.sh --bootstrap-server kafka-docker_kafka_1:9092 --topic topic002
# 6.创建一条消息(必须启动消费)
$ ./kafka-console-producer.sh --topic=topic002 --broker-list kafka-docker_kafka_1:9092
>helloworld(发送的消息)
# 7.查看某个Topic下的消息
$ docker exec kafka-docker_kafka_1 kafka-console-consumer.sh --bootstrap-server kafka-docker_kafka_1:9092 --topic topic002 --from-beginning
Helloworld
hellworld
复制代码

参考

极客时间《Kafka核心技术与实战》

微信扫一扫,分享到朋友圈

kafka入门小记

国产特斯拉Model 3实际价格最低降至24.99万元 降低2.1万元

上一篇

《八佰》超《绝地战警:疾速追击》:成2020全球最卖座电影

下一篇

你也可能喜欢

kafka入门小记

长按储存图像,分享给朋友