有时候为了更好地了解kafka集群的运行机制,需要自己搭建kafka集群。本文的目的就是让大家在单机上快速搭建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
kafka 使用 Zookeeper 做分布式协调工具(用来保证高可用),因此需要先启动Zookeeper服务,kafka安装包内有内置单节点的Zookeeper,直接启动即可。
> bin/zookeeper-server-start.sh config/zookeeper.properties
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
我们需要重写端口和日志目录是因为我们在单机上启动了多个节点,这样做可以防止节点之间覆盖彼此的数据。
接下来启动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
> bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 3 --partitions 3 --topic topic_p3
Created topic "topic_p3".
这里解释一下参数:
'bootstrap-server'
代替创建成功后,我们可以用下面命令来观察一下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种类型:
手动创建topic不是必须的,可以在配置文件里面设置,当写入或者消费的时候可以自动创建topic
我们再简单看一下存储文件结构,进入kafka-logs目录
>ls |grep topic_p3-
topic_p3-0
topic_p3-1
topic_p3-2
这三个就是 topic_p3-* 就代表了3个partition.
再进去partition里面看看,可以看到四种文件,简单地说明一下各自的作用。
文件存储这块知识点很多,涉及到很多kafka的优化手段,比如二分查找、稀疏索引、顺序I/O、零拷贝。但这不是本文的重点,因此不深入探讨。感兴趣的可以参考下面几篇文章:
1、分布式消息通讯kafka原理分析
2、leader-epoch 的讨论
>bin/kafka-console-producer.sh --broker-list localhost:9092 --topic topic_p3
>hello
>world
> 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版本文档