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 架构
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