kafka详解

一、kafka 简介

1.1 kafka介绍

  • Kafka是一个分布式消息队列:生产者、消费者的功能。它提供了类似于JMS的特性,但是在设计实现上完全不同,此外它并不是JMS规范的实现。
  • Apache Kafka是一个开源消息系统,由Scala写成。是由Apache软件基金会开发的一个开源消息系统项目,该项目的目标是为处理实时数据提供一个统一、高通量、低等待的平台。
  • Kafka对消息保存时根据Topic进行归类,发送消息者称为Producer,消息接受者称为Consumer,此外kafka集群有多个kafka实例组成,每个实例(server)成为broker。无论是kafka集群,还是producer和consumer都依赖于zookeeper集群保存一些meta信息,来保证系统可用性

1.2 kafka核心组件

  • Producer:消息生产者,产生的消息将会被发送到某个topic
  • Consumer:消息消费者,消费的消息内容来自某个topic
  • Topic:每条发布到kafka集群的消息都有一个类别,这个类别被称为topic,topic 在逻辑上对record(记录、日志)进行分组保存,消费者需要订阅相应的topic才能消费topic中的消息
  • Broker:每一个kafka实例(或者说每台kafka服务器节点)就是一个broker,一个broker可以有多个topic
  • 偏移量(Offset):一个分区对应一个磁盘上的文件,而消息在文件中的位置就称为 offset(偏移量),offset 为一个 long 型数字,它可以唯一标记一条消息。
  • 分区(partition):每个 topic 都可以分成多个 partition,每个 partition 在存储层面是 append log 文件。

1.3 kafka 架构

kafka架构.jpeg

1.4 kafka特性

  • 高吞吐量、低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒,每个topic可以分多个partition, consumer group 对partition进行consumer操作。
  • 可扩展性:kafka集群支持热扩展- 持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失
  • 容错性:允许集群中节点失败(若副本数量为n,则允许n-1个节点失败)
  • 高并发:支持数千个客户端同时读写

二、kafka 部署

2.1 kafka节点1

[root@dockerserver1 src]# wget https://mirrors.tuna.tsinghua.edu.cn/apache/kafka/3.1.0/kafka_2.12-3.1.0.tgz --no-check-certificate
[root@dockerserver1 src]# tar -zxf kafka_2.12-3.1.0.tgz
[root@dockerserver1 src]# mv kafka_2.12-3.1.0 /apps/kafka
#修改配置文件
[root@dockerserver1 config]# cat /apps/kafka/config/server.properties  | grep -Ev "^$|^#"
broker.id=1
listeners=PLAINTEXT://192.168.111.10: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=/data/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=192.168.111.10:2181,192.168.111.11:2181,192.168.111.12:2181
zookeeper.connection.timeout.ms=18000
group.initial.rebalance.delay.ms=0

#启动服务
[root@dockerserver1 config]# /apps/kafka/bin/kafka-server-start.sh -daemon /apps/kafka/config/server.properties 

2.2 kafka节点2

[root@dockerserver1 src]# wget https://mirrors.tuna.tsinghua.edu.cn/apache/kafka/3.1.0/kafka_2.12-3.1.0.tgz --no-check-certificate
[root@dockerserver1 src]# tar -zxf kafka_2.12-3.1.0.tgz
[root@dockerserver1 src]# mv kafka_2.12-3.1.0 /apps/kafka
#修改配置文件
[root@dockerserver1 config]# cat /apps/kafka/config/server.properties  | grep -Ev "^$|^#"
broker.id=1
listeners=PLAINTEXT://192.168.111.11: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=/data/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=192.168.111.10:2181,192.168.111.11:2181,192.168.111.12:2181
zookeeper.connection.timeout.ms=18000
group.initial.rebalance.delay.ms=0

#启动服务
[root@dockerserver1 config]# /apps/kafka/bin/kafka-server-start.sh -daemon /apps/kafka/config/server.properties 

2.3 kafka节点3

[root@dockerserver1 src]# wget https://mirrors.tuna.tsinghua.edu.cn/apache/kafka/3.1.0/kafka_2.12-3.1.0.tgz --no-check-certificate
[root@dockerserver1 src]# tar -zxf kafka_2.12-3.1.0.tgz
[root@dockerserver1 src]# mv kafka_2.12-3.1.0 /apps/kafka
#修改配置文件
[root@dockerserver1 config]# cat /apps/kafka/config/server.properties  | grep -Ev "^$|^#"
broker.id=1
listeners=PLAINTEXT://192.168.111.12: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=/data/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=192.168.111.10:2181,192.168.111.11:2181,192.168.111.12:2181
zookeeper.connection.timeout.ms=18000
group.initial.rebalance.delay.ms=0

#启动服务
[root@dockerserver1 config]# /apps/kafka/bin/kafka-server-start.sh -daemon /apps/kafka/config/server.properties 

三、kafka 验证

3.1 测试kafka读写数据

  • https://kafka.apache.org/quickstart

3.1.1 创建topic

  • 创建名为logstashtest,partitions(分区)为3,replication(每个分区的副本数/每个分区的分区因子)为3的topic
#不同版本的kafka创建topic方式不同
[root@dockerserver1 config]# /apps/kafka/bin/kafka-topics.sh --create --zookeeper 192.168.111.10:2181 --partitions 3 --replication-factor 3 --topic test
Exception in thread "main" joptsimple.UnrecognizedOptionException: zookeeper is not a recognized option
	at joptsimple.OptionException.unrecognizedOption(OptionException.java:108)
	at joptsimple.OptionParser.handleLongOptionToken(OptionParser.java:510)
	at joptsimple.OptionParserState$2.handleArgument(OptionParserState.java:56)
	at joptsimple.OptionParser.parse(OptionParser.java:396)
	at kafka.admin.TopicCommand$TopicCommandOptions.<init>(TopicCommand.scala:567)
	at kafka.admin.TopicCommand$.main(TopicCommand.scala:47)
	at kafka.admin.TopicCommand.main(TopicCommand.scala)
[root@dockerserver1 config]# /apps/kafka/bin/kafka-topics.sh --create --topic test --bootstrap-server 192.168.111.10:9092
Created topic test.
[root@dockerserver1 config]# /apps/kafka/bin/kafka-topics.sh --create --topic test1 --bootstrap-server 192.168.111.10:9092 --partitions 3 --replication-factor 3
[root@dockerserver1 config]# /apps/kafka/bin/kafka-topics.sh --bootstrap-server 192.168.111.10:9092 --list
test

3.1.2 验证topic

[root@dockerserver1 config]# /apps/kafka/bin/kafka-topics.sh --describe --bootstrap-server 192.168.111.10:9092 --topic test
Topic: test	TopicId: dRRuNGVwRh-LmnKfsBp6zw	PartitionCount: 1	ReplicationFactor: 1	Configs: segment.bytes=1073741824
	Topic: test	Partition: 0	Leader: 2	Replicas: 2	Isr: 2
[root@dockerserver1 config]# /apps/kafka/bin/kafka-topics.sh --describe --bootstrap-server 192.168.111.10:9092 --topic test1
Topic: test1	TopicId: 3U0pNcW0T-mTVkMZ2jJpZQ	PartitionCount: 3	ReplicationFactor: 3	Configs: segment.bytes=1073741824
	Topic: test1	Partition: 0	Leader: 2	Replicas: 2,3,1	Isr: 2,3,1
	Topic: test1	Partition: 1	Leader: 3	Replicas: 3,1,2	Isr: 3,1,2
	Topic: test1	Partition: 2	Leader: 1	Replicas: 1,2,3	Isr: 1,2,3

3.1.3 获取所有topic

[root@dockerserver1 config]# /apps/kafka/bin/kafka-topics.sh --bootstrap-server 192.168.111.10:9092 --list
test
test1

3.1.4 测试发送消息

[root@dockerserver1 config]# /apps/kafka/bin/kafka-console-producer.sh --broker-list 192.168.111.10:9092,192.168.111.11:9092,192.168.111.12:9092 --topic test1
>
>hello world
>

3.1.5 测试获取消息

[root@dockerserver2 src]# /apps/kafka/bin/kafka-console-consumer.sh --topic test1 --bootstrap-server 192.168.111.12:9092 --from-beginning

hello world

3.1.6 删除topic

[root@dockerserver1 config]# /apps/kafka/bin/kafka-topics.sh --delete --bootstrap-server 192.168.111.10:9092 --topic test
[root@dockerserver1 config]# /apps/kafka/bin/kafka-topics.sh --bootstrap-server 192.168.111.10:9092 --list
__consumer_offsets
test1