单机快速搭建多节点kafka集群

有时候为了更好地了解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版本文档

你可能感兴趣的:(消息队列)