图解 Kafka 架构与工作原理

1、数据在写入的时候可以指定需要写入的分区,如果有指定,则写入对应的分区

2、如果没有指定分区,但是设置了数据的key,则会根据key的值hash出一个分区

3、如果既没指定分区,又没有设置key,则会轮询选出一个分区

2.2、消费数据

与生产者一样,消费者主动的去kafka集群拉取消息时,也是从Leader分区去拉取数据。

这里我们需要重点了解一个名词:消费组!

考虑到多个消费者的场景,kafka 在设计的时候,可以由多个消费者组成一个消费组,同一个消费组者的消费者可以消费同一个 topic 下不同分区的数据,同一个分区只会被一个消费组内的某个消费者所消费,防止出现重复消费的问题!

但是不同的组,可以消费同一个分区的数据!

你可以这样理解,一个消费组就是一个客户端,一个客户端可以由很多个消费者组成,以便加快消息的消费能力。

但是,如果一个组下的消费者数量大于分区数量,就会出现很多的消费者闲置。

如果分区数量大于一个组下的消费者数量,会出现一个消费者负责多个分区的消费,会出现消费性能不均衡的情况。

因此,在实际的应用中,建议消费者组的consumer的数量与partition的数量保持一致!

三、kafka 安装


光说理论可没用,下面我们就以 centos7 为例,介绍一下 kafka 的安装和使用。

kafka 需要 zookeeper 来保存服务实例的元信息,因此在安装 kafka 之前,我们需要先安装 zookeeper。

3.1、安装zookeeper

zookeeper 安装环境依赖于 jdk,因此我们需要事先安装 jdk

安装jdk1.8

yum -y install java-1.8.0-openjdk

下载zookeeper,并解压文件包

#在线下载zookeeper

wget http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.12/zookeeper-3.4.12.tar.gz

#解压

tar -zxvf zookeeper-3.4.12.tar.gz

创建数据、日志目录

#创建数据和日志存放目录

cd /usr/zookeeper/

mkdir data

mkdir log

#把conf下的zoo_sample.cfg备份一份,然后重命名为zoo.cfg

cd conf/

cp zoo_sample.cfg zoo.cfg

配置zookeeper

#编辑zoo.cfg文件

vim zoo.cfg

重新配置dataDir和dataLogDir的存储路径

最后,启动 Zookeeper 服务

#进入Zookeeper的bin目录

cd zookeeper/zookeeper-3.4.12/bin

#启动Zookeeper

./zkServer.sh start

#查询Zookeeper状态

./zkServer.sh status

#关闭Zookeeper状态

./zkServer.sh stop

3.2、安装kafka

到官网http://kafka.apache.org/downloads.html下载想要的版本,我这里下载是最新稳定版2.8.0。

#下载kafka 安装包

wget https://apache.osuosl.org/kafka/2.8.0/kafka-2.8.0-src.tgz

#解压文件包

tar -xvf kafka-2.8.0-src.tgz

按需修改配置文件server.properties(可选)

#进入配置文件夹

cd kafka-2.8.0-src/config

#编辑server.properties

vim server.properties

server.properties文件内容如下:

broker.id=0

listeners=PLAINTEXT://localhost:9092

num.network.threads=3

num.io.threads=8

socket.send.buffer.bytes=102400

socket.receive.buffer.bytes=102400

socket.request.max.bytes=104857600

log.dirs=/tmp/kafka-logs

num.partitions=1

num.recovery.threads.per.data.dir=1

offsets.topic.replication.factor=1

transaction.state.log.replication.factor=1

transaction.state.log.min.isr=1

log.retention.hours=168

log.segment.bytes=1073741824

log.retention.check.interval.ms=300000

zookeeper.connect=localhost:2181

zookeeper.connection.timeout.ms=6000

group.initial.rebalance.delay.ms=0

其中有四个重要的参数:

broker.id:唯一标识ID

listeners=PLAINTEXT://localhost:9092:kafka服务监听地址和端口

log.dirs:日志存储目录

zookeeper.connect:指定zookeeper服务地址

可根据自己需求修改对应的配置!

3.3、启动 kafka 服务

进入bin脚本目录

cd kafka-2.8.0-src/bin

启动 kafka 服务

nohup kafka-server-start.sh …/config/server.properties server.log 2> server.err &

3.4、创建主题topics

创建一个名为testTopic的主题,它只包含一个分区,只有一个副本:

进入bin脚本目录

cd kafka-2.8.0-src/bin

#创建topics

kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic testTopic

运行list topic命令,可以看到该主题。

进入bin脚本目录

cd kafka-2.8.0-src/bin

#查询当前kafka上所有的主题

kafka-topics.sh --list --zookeeper localhost:2181

输出内容:

testTopic

3.5、发送消息

Kafka 附带一个命令行客户端,它将从文件或标准输入中获取输入,并将其作为消息发送到 Kafka 集群。默认情况下,每行将作为单独的消息发送。

运行生产者,然后在控制台中键入一些消息以发送到服务器。

进入bin脚本目录

cd kafka-2.8.0-src/bin

#运行一个生产者,向testTopic主题中发消息

kafka-console-producer.sh --broker-list localhost:9092 --topic testTopic

输入两条内容并回车:

Hello kafka!

This is a message

3.5、接受消息

Kafka 还有一个命令行使用者,它会将消息转储到标准输出。

进入bin脚本目录

cd kafka-2.8.0-src/bin

#运行一个消费者,从testTopic主题中拉取消息

kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic testTopic --from-beginning

输出结果如下:

Hello kafka!

This is a message
四、小结

本文主要围绕 kafka 的架构模型和安装环境做了一些初步的介绍,难免会有理解不对的地方,欢迎网友批评、吐槽。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值