安装配置 Kafka

Kafka 简介

Kafka 是一个基于分布式的消息发布 - 订阅系统,它被设计成快速、可扩展的、持久的分布式流处理平台。与其他消息发布 - 订阅系统类似,Kafka 在主题当中保存消息的信息。生产者向主题写入数据,消费者从主题读取数据。由于 Kafka 的特性是支持分布式,同时也是基于分布式的,所以主题也是可以在多个节点上被分区和覆盖的。

术语
  • Topic 用来对消息进行分类,每个进入到 Kafka 的信息都会被放到一个 Topic 下
  • Broker 用来实现数据存储的主机服务器
  • Partition 每个 Topic 中的消息会被分为若干个 Partition,以提高消息的处理效率
  • Producer 消息的生产者
  • Consumer 消息的消费者
  • Consumer Group 消息的消费群组

运行环境

三台 CentOS 7.5 虚拟机
  • server1 192.168.78.101 ( Master KDC Server )
  • server2 192.168.78.102 ( Client )
  • server3 192.168.78.103 ( Client )
软件 版本
  • JDK 1.8.0_181
  • Kafka 2.11-2.0.1 (Scala 版本 - Kafka 版本)

安装配置 Kafka

下载并解压安装包

​ 从 官网下载 对应版本,放到服务器目录,此处我们放到 /opt 下并解压:

[root@server1 opt]# wget http://mirror.bit.edu.cn/apache/kafka/2.0.1/kafka_2.11-2.0.1.tgz
[root@server1 opt]# tar -zxvf kafka_2.11-2.0.1.tgz
[root@server1 opt]# cd kafka_2.11-2.0.1/
启动 Kafka 服务器

Kafka 需要用到 Zookeeper ,因此在启动前需要先启动后者。如果本地尚未安装,可以使用 Kafka 自带的单节点 Zookeeper 实例:

[root@server1 kafka_2.11-2.0.1]# bin/zookeeper-server-start.sh config/zookeeper.properties

​ 但接下来我们要配置多节点集群,所以需要假设已经配置好本地 Zookeeper-daemon 参数指定后台启动:

[root@server1 kafka_2.11-2.0.1]# bin/kafka-server-start.sh -daemon config/server.properties
创建 Topic

​ 创建名为 HelloWorld 的 Topic:

[root@server1 kafka_2.11-2.0.1]# bin/kafka-topics.sh --create --zookeeper server1:2181 --replication-factor 1 --partitions 1 --topic HelloWorld

​ 查看 Topic

[root@server1 kafka_2.11-2.0.1]# bin/kafka-topics.sh --list --zookeeper server1:2181

​ 除手动创建 Topic 外,也可在 config/server.properties 中添加如下项,使生产消息时自动创建不存在的 Topic :

auto.create.topics.enable = true # default true
生产者发送消息

Kafka 生产者命令行可以接收文件或者标准输入,并将其作为消息发送给 Kafka 集群。默认情况下,每一行都会作为一条单独的消息。

[root@server1 kafka_2.11-2.0.1]# bin/kafka-console-producer.sh --broker-list server1:9092 HelloWorld --topic HelloWorld
>foo
>bar
消费者接收消息

Kafka 消费者命令行可以接收消息并作为标准输出。在开启生产者的同时,另外启动一个终端作为消费者:

[root@server1 kafka_2.11-2.0.1]# bin/kafka-console-consumer.sh --bootstrap-server server1:9092 —topic HelloWorld --whitelist HelloWorld --from-beginning
foo
bar

​ 注意,此处需要加上 --whitelist HelloWorld,否则命令无法执行。

​ 另外,新版本 Consumer 已将信息保存 Kafka 中,无需与 Zookeeper 通信,但如果使用的旧版 Consumer,并且将元数据保存在 Zookeeper 中,就需要将 --bootstrap-server 替换为 --zookeeper

[root@server1 kafka_2.11-2.0.1]# bin/kafka-console-consumer.sh --zookeeper server1:2181 —topic HelloWorld --whitelist HelloWorld --from-beginning
搭建多节点多 Broker 集群
复制 Kafka 节点
[root@server1 opt]# scp -r kafka_2.11-2.0.1 root@server2:/opt/kafka_2.11-2.0.1
[root@server1 opt]# scp -r kafka_2.11-2.0.1 root@server3:/opt/kafka_2.11-2.0.1
修改 broker.id

broker.id 是集群中每个节点的唯一标识,所以我们需要各节点下 config/server.properties 中的 broker.id 修改为不同数值,如 3 个节点分别为 0 / 1 / 2。另外,因为 broker 运行在不同节点,不能再使用自带的 Zookeeper,所以需要设置 Zookeeper 集群,配置如下:

# server1
broker.id = 1
zookeeper.connect = server1:2181,server2:2181,server3:2181

# server2
broker.id = 2
zookeeper.connect = server1:2181,server2:2181,server3:2181

# server3
broker.id = 3
zookeeper.connect = server1:2181,server2:2181,server3:2181
启动所有节点
[root@server1 opt]# bin/kafka-server-start.sh config/server.properties
[root@server2 opt]# bin/kafka-server-start.sh config/server.properties
[root@server3 opt]# bin/kafka-server-start.sh config/server.properties

​ 可以通过 jps 命令查看是否启动:

[root@server1 kafka_2.11-2.0.1]# jps # 下面的 QuorumPeerMain 为 Zookeeper
12135 Jps
11053 Kafka
10623 QuorumPeerMain
创建冗余 Topic

​ 我们可以使用 --replication-factor 指定复制因子为 3,因为我们启动了 3 个 broker。如果指定数为 n,那么 n - 1(n > 1) 个 broker 失败之前仍可保证数据为丢失,其中 n 不得大于 broker 数量。

[root@server1 kafka_2.11-2.0.1]# bin/kafka-topics.sh --create --zookeeper server1:2181 --replication-factor 3 --partitions 1 --topic MultiBroker

​ 查看 Topic 详情:

[root@server1 kafka_2.11-2.0.1]# bin/kafka-topics.sh --describe --zookeeper server1:2181 --topic MultiBroker
Topic:MultiBroker	PartitionCount:1	ReplicationFactor:3	Configs:
	Topic: MultiBroker	Partition: 0	Leader: 2	Replicas: 2,0,1	Isr: 2,0,1

​ 从上面可以看到,第一行是 Topic 概要信息,包括名称、分区数以及复制因子;第二行中的 0 / 1 / 2 分别代表不同的 broker,如目前 2 号 broker 为 leader,Replicas 表示每个 broker 上都有一个备份,Isr 表示当前存活并且能够更新备份的 broker:

  • Partition: 分区编号。当前 Topic 只有一个分区,故编号为 0

  • Leader: Leader 是为对应分区提供所有读/写的节点,随机产生。当前 Leader 为 0,代表 Broker 0

  • Replicas: 提供对应分区的备份列表,不受是否为 Leader 或者是否存活影响。当前为 2,0,1,即为 Broker 2,0,1

  • Isr: “in-sync” replicas 的集合,为 Replicas 的子集,仅包含当前存活且可从 Leader 中复制的节点。当前为 2,0,1,即为 Broker 2,0,1,稍后停掉一个 Broker 会发生变化

生产者发送消息
[root@server1 kafka_2.11-2.0.1]# bin/kafka-console-producer.sh --broker-list server1:9092 --topic MultiBroker
>foo
>bar
消费者接收消息
[root@server2 kafka_2.11-2.0.1]# bin/kafka-console-consumer.sh --bootstrap-server server1:9092 —topic MultiBroker --whitelist MultiBroker --from-beginning
foo
bar
[root@server3 kafka_2.11-2.0.1]# bin/kafka-console-consumer.sh --bootstrap-server server1:9092 —topic MultiBroker --whitelist MultiBroker --from-beginning
foo
bar

​ 注意此处两个 Consumer 都读到了内容,因为两者分属于不同的组,可以通过下列命令查看:

[root@server3 kafka_2.11-2.0.1]# bin/kafka-consumer-groups.sh --bootstrap-server server1:9092 --list
console-consumer-10318
console-consumer-17963

​ 若在启动 Consumer 时使用 --group test-group 参数指定分组,则同组内的 client 同一时间只有一个可以消费:

bin/kafka-console-consumer.sh --bootstrap-server server1:9092 --group test-group —topic MultiBroker --whitelist MultiBroker --from-beginning
验证容错性

​ 从前面可以看到,Kafka 在 3 节点集群中正常运行,且 MultiBroker 分区为 Leader 为 Broker 2,所以我们把 Broker 2 停掉会怎么样呢?可以使用 CTRL-C 或执行脚本:

[root@server3 kafka_2.11-2.0.1]# bin/kafka-server-stop.sh

​ 再次查看 MultiBroker 详情,可以发现 Leader 变为了 Broker 0,Replicas 未发生变化,但 Isr 变为了 0,1,说明当前只能在 Broker 0,1 上备份:

[root@server3 kafka_2.11-2.0.1]# bin/kafka-topics.sh --describe --zookeeper server1:2181 --topic MultiBroker
Topic:MultiBroker	PartitionCount:1	ReplicationFactor:3	Configs:
	Topic: MultiBroker	Partition: 0	Leader: 0	Replicas: 2,0,1	Isr: 0,1

​ 再次使用命令行模拟生产 / 消费消息 ,依然正常运行:

[root@server1 kafka_2.11-2.0.1]# bin/kafka-console-producer.sh --broker-list server1:9092 --topic MultiBroker
>new leader test
[root@server2 kafka_2.11-2.0.1]# bin/kafka-console-consumer.sh --bootstrap-server server1:9092 —topic MultiBroker --whitelist MultiBroker --from-beginning
new leader test

此时重启 Broker 3 会发生什么呢?没错,Broker 无缝衔接,照常使用:

[root@server3 kafka_2.11-2.0.1]# bin/kafka-topics.sh --describe --zookeeper server1:2181 --topic MultiBroker
Topic:MultiBroker	PartitionCount:1	ReplicationFactor:3	Configs:
	Topic: MultiBroker	Partition: 0	Leader: 0	Replicas: 2,0,1	Isr: 0,1,2

引用

Kafka Documentation

Apache Kafka Tutorial

Difference Between Partition and Replica - StackOverFlow

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值