当前位置:   article > 正文

Kafka环境搭建

kafka环境搭建
搭建前准备
Java环境

Kafka采用的是Scala语言开发,运行在JVM上,因此部署Kafka的服务器需要安装JDK。

Zookeeper环境

Kafka依赖于Zookeeper进行分布式协调,因此需要部署Zookeeper。Zookeeper的安装步骤如下:

  1. # 下载Zookeeper安装包
  2. wget https://archive.apache.org/dist/zookeeper/zookeeper-3.5.8/apache-zookeeper-3.5.8-bin.tar.gz
  3. #解压
  4. tar -zxvf apache-zookeeper-3.5.8-bin.tar.gz
  5. #重命名
  6. mv apache-zookeeper-3.5.8-bin zookeeper-3.5.8
  7. cd zookeeper-3.5.8
  8. cp conf/zoo_sample.cfg conf/zoo.cfg
  9. # 启动zookeeper服务
  10. bin/zkServer.sh start
  11. #查看zk的根目录相关节点
  12. bin/zkCli.sh
  13. ls /
单节点搭建
下载&解压安装包
  1. wget https://archive.apache.org/dist/kafka/2.4.1/kafka_2.11-2.4.1.tgz # 2.11是scala的版本,2.4.1是kafka的版本
  2. tar -xzf kafka_2.11-2.4.1.tgz
  3. cd kafka_2.11-2.4.1
修改配置文件

修改conf/server.properties配置文件:

  1. #broker.id属性在kafka集群中必须要是唯一
  2. broker.id=0
  3. #kafka部署的机器ip和提供服务的端口号
  4. listeners=PLAINTEXT://192.168.68.100:9092
  5. #kafka的消息存储文件
  6. log.dir=/usr/local/data/kafka-logs
  7. #kafka连接zookeeper的地址
  8. zookeeper.connect=192.168.68.100:2181

server.properties核心配置详解

Property

Default

Description

broker.id

0

每个broker都可以用一个唯一的非负整数id进行标识;这个id可以作为broker的“名字”,你可以选择任意你喜欢的数字作为id,只要id是唯一的即可。

log.dirs

/tmp/kafka-logs

kafka存放数据的路径。这个路径并不是唯一的,可以是多个,路径之间只需要使用逗号分隔即可;每当创建新partition时,都会选择在包含最少partitions的路径下进行。

listeners

PLAINTEXT://:9092

server接受客户端连接的端口,ip配置kafka本机ip即可

zookeeper.connect

localhost:2181

zooKeeper连接字符串的格式为:hostname:port,此处hostname和port分别是ZooKeeper集群中某个节点的host和port;zookeeper如果是集群,连接方式为 hostname1:port1, hostname2:port2, hostname3:port3

log.retention.hours

168

每个日志文件删除之前保存的时间。默认数据保存时间对所有topic都一样。

num.partitions

1

创建topic的默认分区数

default.replication.factor

1

自动创建topic的默认副本数量,建议设置为大于等于2

min.insync.replicas

1

当producer设置acks为-1时,min.insync.replicas指定replicas的最小数目(必须确认每一个repica的写数据都是成功的),如果这个数目没有达到,producer发送消息会产生异常

delete.topic.enable

false

是否允许删除主题

启动服务
bin/kafka-server-start.sh config/server.properties &
集群搭建

对于Kafka来说,一个单独的broker意味着kafka集群只有一个节点。想要增加kafka集群中的节点数,只需要多启动几个broker的实例节点即可。现在搭建三个节点的kafka集群,kafka集群三台服务器IP分别为:192.168.68.81、192.168.68.91、192.168.68.100,在这三台服务器上分别执行以下操作,修改对应kafka实例的IP及实例ID。

下载&解压安装包
  1. wget https://archive.apache.org/dist/kafka/2.4.1/kafka_2.11-2.4.1.tgz # 2.11是scala的版本,2.4.1是kafka的版本
  2. tar -xzf kafka_2.11-2.4.1.tgz
  3. cd kafka_2.11-2.4.1
修改配置文件

修改conf/server.properties配置文件:

  1. #broker.id属性在kafka集群中必须要是唯一
  2. broker.id=0
  3. #kafka部署的机器ip和提供服务的端口号
  4. listeners=PLAINTEXT://192.168.68.100:9092
  5. #kafka的消息存储文件
  6. log.dir=/usr/local/data/kafka-logs
  7. #kafka连接zookeeper的地址,要把多个kafka实例组成集群,对应连接的zookeeper必须相同
  8. zookeeper.connect=192.168.68.81:2181,192.168.68.91:2181,192.168.68.100:2181
启动服务
bin/kafka-server-start.sh config/server.properties &
环境验证
创建Topic

创建一个topic,副本数设置为3,分区数设置为2

bin/kafka-topics.sh --create --zookeeper 192.168.68.81:2181,192.168.68.91:2181,192.168.68.100:2181 --replication-factor 3 --partitions 2 --topic my-replicated-topic
查看Topic信息
bin/kafka-topics.sh --describe --zookeeper 192.168.68.81:2181,192.168.68.91:2181,192.168.68.100:2181 --topic my-replicated-topic
  • leader节点负责给定partition的所有读写请求,同一个主题不同分区leader副本一般不一样(为了容灾)

  • replicas 表示某个partition在哪几个broker上存在备份。不管这个几点是不是”leader“,甚至这个节点挂了,也会列出。

  • isr 是replicas的一个子集,它只列出当前还存活着的,并且已同步备份了该partition的节点。

向Topic发送消息
bin/kafka-console-producer.sh --broker-list 192.168.68.81:9092,192.168.68.91:9092,192.168.68.100:9092 --topic my-replicated-topic>my test msg 1>my test msg 2 
从Topic消费消息
bin/kafka-console-consumer.sh --bootstrap-server 192.168.68.81:9092,192.168.68.91:9092,192.168.68.100:9092 --from-beginning --topic my-replicated-topicmy test msg 1my test msg 2
查看Topic分区leader信息
kafka将很多集群关键信息记录在zookeeper里,保证自己的无状态,从而在水平扩容时非常方便。
集群消费

log的partitions分布在kafka集群中不同的broker上,每个broker可以请求备份其他broker上partition上的数据。kafka集群支持配置一个partition备份的数量。针对每个partition,都有一个broker起到“leader”的作用,0个或多个其他的broker作为“follwers”的作用。leader处理所有的针对这个partition的读写请求,而followers被动复制leader的结果,不提供读写(主要是为了保证多副本数据与消费的一致性)。如果这个leader失效了,其中的一个follower将会自动的变成新的leader。

Producers

生产者将消息发送到topic中去,同时负责选择将message发送到topic的哪一个partition中。通过round-robin做简单的负载均衡。也可以根据消息中的某一个关键字来进行区分。通常第二种方式使用的更多。

Consumers

传统的消息传递模式有2种:队列( queue) 和(publish-subscribe)

  • queue模式:多个consumer从服务器中读取数据,消息只会到达一个consumer。

  • publish-subscribe模式:消息会被广播给所有的consumer。

Kafka基于这2种模式提供了一种consumer的抽象概念:consumer group。

  • queue模式:所有的consumer都位于同一个consumer group 下

  • publish-subscribe模式:所有的consumer都有着自己唯一的consumer group

消费顺序

一个partition同一个时刻在一个consumer group中只能有一个consumer instance在消费,从而保证消费顺序。Kafka只在partition的范围内保证消息消费的局部顺序性,不能在同一个topic中的多个partition中保证总的消费顺序性。

consumer group中的consumer instance的数量不能比一个Topic中的partition的数量多,否则,多出来的consumer消费不到消息。

如果有在总体上保证消费顺序的需求,那么我们可以通过将topic的partition数量设置为1,将consumer group中的consumer instance数量也设置为1,但是这样会影响性能,所以kafka的顺序消费很少用。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/793758
推荐阅读
相关标签
  

闽ICP备14008679号