有时候为了更好地了解kafka集群的运行机制,需要自己搭建kafka集群。本文的目的就是让大家在单机上快速搭建kafka集群(仅作为单机测试
使用)。
环境及工具版本
- mac OS 10.15.5
- kafka_2.11-0.11.0.2
步骤
一、下载kafka
本文使用 kafka_2.11-0.11.0.2 版本的kafka做实验,可直接点击下面地址下载。
0.11版本kafka下载地址:https://www.apache.org/dyn/closer.cgi?path=/kafka/0.11.0.2/kafka_2.11-0.11.0.2.tgz
版本号前面的2.11表示scala的版本,后面的0.11才是kafka的版本。这是由于早期scala的客户端用scala写的,因此需要依赖scala。0.11版本之后的kafka版本命名与之前的不一样(1.1,2.1…),请自行识别。
下载到自己的指定路径后,解压压缩包,进入kafka目录。
> tar -xzf kafka_2.11-0.11.0.2.tgz
> cd kafka_2.11-0.11.0.2
二、启动服务
1、启动Zookeeper
kafka 使用 Zookeeper 做分布式协调工具(用来保证高可用),因此需要先启动Zookeeper服务,kafka安装包内有内置单节点的Zookeeper,直接启动即可。
> bin/zookeeper-server-start.sh config/zookeeper.properties
2、启动kafka
kafka的默认配置文件位于 xxx/kafka_2.11-0.11.0.2/config
目录下的 server.properties。
因为我们需要创建多个节点,所以再复制两份配置文件。
> cp config/server.properties config/server-1.properties
> cp config/server.properties config/server-2.properties
修改配置文件的内容:
config/server-1.properties:
broker.id=1
listeners=PLAINTEXT://:9093
log.dir=/tmp/kafka-logs-1
config/server-2.properties:
broker.id=2
listeners=PLAINTEXT://:9094
log.dir=/tmp/kafka-logs-2
- breker.id属性是集群中每个节点的唯一名称
- listeners是监听端口
- log.dir是日志目录
我们需要重写端口和日志目录是因为我们在单机上启动了多个节点,这样做可以防止节点之间覆盖彼此的数据。
接下来启动kafka的各个节点
> bin/kafka-server-start.sh config/server.properties &
> bin/kafka-server-start.sh config/server-1.properties &
> bin/kafka-server-start.sh config/server-2.properties &
我们到/tmp目录下,会发现3个broker文件夹
> ls | grep kafka-logs
kafka-logs
kafka-logs-1
kafka-logs-2
三、创建Topic
> bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 3 --partitions 3 --topic topic_p3
Created topic "topic_p3".
这里解释一下参数:
- zookeeper: zookeeper地址,这个参数在1.0版本之后用
'bootstrap-server'
代替 - replication-factor:topic的副本数,副本位于集群中不同的broker上,因此副本的数量不能比broker的数量还多,否则创建topic的时候会报错。
- partitions:topic的分区数,每个topic都可以由1-N个partion组成,均匀分布在多个broker上面。partion的数量越多,会增加性能开销,因此这个这个参数要根据实际情况来指定。
- topic : topic的名称,要注意topic的名称中不能同时出现句点(’.’)和下划线(’_’),因为有可能发生冲突。
创建成功后,我们可以用下面命令来观察一下topic在集群的情况。
>bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic topic_p3
Topic:topic_p3 PartitionCount:3 ReplicationFactor:3 Configs:
Topic: topic_p3 Partition: 0 Leader: 1 Replicas: 1,2,0 Isr: 1,2,0
Topic: topic_p3 Partition: 1 Leader: 2 Replicas: 2,0,1 Isr: 2,0,1
Topic: topic_p3 Partition: 2 Leader: 0 Replicas: 0,1,2 Isr: 0,1,2
第一行是所有分区的概述,下面的每一行代表一个Partition。可以根据节点的功能把节点分为3种类型:
- Leader:主节点,负责该Partition(分区)的读写
- Replicas: 副本节点列表,为这个分区复制日志,leader和存活的节点都可以为副本节点。
- Isr: 是一组同步副本节点,它是副本列表的一个子集
手动创建topic不是必须的,可以在配置文件里面设置,当写入或者消费的时候可以自动创建topic
我们再简单看一下存储文件结构,进入kafka-logs目录
>ls |grep topic_p3-
topic_p3-0
topic_p3-1
topic_p3-2
这三个就是 topic_p3-* 就代表了3个partition.
再进去partition里面看看,可以看到四种文件,简单地说明一下各自的作用。
- 000…000.index : 索引文件,用来存放索引,索引包含两个部分,分别为相对offset和position
- 000…000.log : 日志文件,用来存放数据
- 000…000.timeindex :kafka的具体时间日志
- leader-epoch-checkpoint : 0.11版本用来存储数据备份进度的文件
文件存储这块知识点很多,涉及到很多kafka的优化手段,比如二分查找、稀疏索引、顺序I/O、零拷贝。但这不是本文的重点,因此不深入探讨。感兴趣的可以参考下面几篇文章:
1、分布式消息通讯kafka原理分析
2、leader-epoch 的讨论
四、生产和消费数据
1、生产数据
>bin/kafka-console-producer.sh --broker-list localhost:9092 --topic topic_p3
>hello
>world
2、消费数据
> bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --from-beginning --topic topic_p3
hello
world
此时,一个单机版kafka集群就搭建好了。
我们回过头来看一下/tmp/kafka-logs目录,会发现里面多了很多"__consumer_offsets-*",这是一个内部topic。
实际上,它用于保存consumer提交到Kafka的offset。
如果想知道关于__consumer_offsets-*更多的东西,可以参考这篇文章:关于__consumer_offsets-*的讨论
本文参考kafka官方文档:0.11版本文档