linux运维、架构之路-Kafka集群部署

一、Kafka介绍

      Kafka是一个开源的分布式消息引擎/消息中间件,同时Kafka也是一个流处理平台。Kakfa支持以发布/订阅的方式在应用间传递消息,同时并基于消息功能添加了Kafka Connect、Kafka Streams以支持连接其他系统的数据(Elasticsearch、Hadoop等)。Kafka最核心的最成熟的还是他的消息引擎,所以Kafka大部分应用场景还是用来作为消息队列削峰平谷。另外,Kafka也是目前性能最好的消息中间件。

二、Kafka架构图

 

       Kafka集群(Cluster)中,一个Kafka节点就是一个Broker,消息由Topic来承载,可以存储在1个或多个Partition中。发布消息的应用为Producer、消费消息的应用为Consumer,多个Consumer可以促成Consumer Group共同消费一个Topic中的消息。

名称

说明

Broker

Kafka节点

Topic

主题,用来承载消息

Partition

分区,用于主题分片存储

Producer

生产者,向主题发布消息的应用

Consumer

消费者,从主题订阅消息的应用

Consumer Group

消费者组,由多个消费者组成

三、Kafka集群部署

Kafka 官网文档:http://kafka.apache.org/
Kafka 下载地址:http://kafka.apache.org/downloads

1、服务器规划

系统

IP

软件

JAVA

主机名

CentOS7.5

192.168.56.11

kafka_2.11-2.0.0.tgz

jdk1.8.0_181

kafka1

CentOS7.5

192.168.56.12

kafka_2.11-2.0.0.tgz

jdk1.8.0_181

kafka2

CentOS7.5

192.168.56.13

kafka_2.11-2.0.0.tgz

jdk1.8.0_181

kafka3

2、系统基础环境准备

#参照: https://www.cnblogs.com/yanxinjiang/p/12752871.html
#安装好JDK和Zookeeper集群 

  Kakfa集群需要依赖ZooKeeper存储Broker、Topic等信息,这里我们部署三台ZK。

3、创建软件目录并解压

mkdir /app
tar xf kafka_2.11-2.0.0.tgz -C /app/
ln -s /app/kafka_2.11-2.0.0/ /app/kafka

4、创建日志路径

mkdir /app/kafka/logs -p

5、修改配置文件

#[root@moban config]# egrep -v "#|$^" server.properties 
broker.id=0   #节点配置,此处需要修改
listeners=PLAINTEXT://192.168.56.11:9092    #节点IP配置
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/app/kafka/logs                   #配置日志路径
num.partitions=1
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
log.retention.hours=2
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
zookeeper.connect=192.168.56.11:2181,192.168.56.12:2181,192.168.56.13:2181   #指定Zookeeper集群地址
zookeeper.connection.timeout.ms=6000
group.initial.rebalance.delay.ms=0

6、如果需要修改jdk路径,可在启动脚本中进行配置

vim /app/kafka/bin/kafka-server-start.sh
export JAVA_HOME=/app/jdk1.8.0_181

7、分发Kafka文件

scp -rp /app/kafka_2.11-2.0.0/ 192.168.56.12:/app/
scp -rp /app/kafka_2.11-2.0.0/ 192.168.56.13:/app/

#创建Kafka软链接
ln -s /app/kafka_2.11-2.0.0/ /app/kafka

8、修改Kafka节点配置文件

①节点kafka1配置

broker.id=0

listeners=PLAINTEXT://192.168.56.11:9092

②节点kafka1配置

broker.id=1

listeners=PLAINTEXT://192.168.56.12:9092

③节点kafka1配置

broker.id=2

listeners=PLAINTEXT://192.168.56.13:9092

9、启动Kafka服务

nohup /app/kafka/bin/kafka-server-start.sh  /app/kafka/config/server.properties &   #启动
/app/kafka/bin/zookeeper-server-stop.sh    #停止

查看进程

[root@moban ~]# jps
41425 Jps
41080 Kafka
40938 QuorumPeerMain

10、Kafka测试

①创建Topic

     在kafka1(Broker)上创建测试Tpoic:test-ken-io,这里我们指定了3个副本、1个分区

/app/kafka/bin/kafka-topics.sh --create --bootstrap-server 192.168.56.11:9092 --replication-factor 3 --partitions 1 --topic test-ken-io

报错2.2以上版本无报错

Exception in thread "main" joptsimple.UnrecognizedOptionException: bootstrap-server is not a recognized option
    at joptsimple.OptionException.unrecognizedOption(OptionException.java:108)
    at joptsimple.OptionParser.handleLongOptionToken(OptionParser.java:510)
    at joptsimple.OptionParserState$2.handleArgument(OptionParserState.java:56)
    at joptsimple.OptionParser.parse(OptionParser.java:396)
    at kafka.admin.TopicCommand$TopicCommandOptions.<init>(TopicCommand.scala:358)
    at kafka.admin.TopicCommand$.main(TopicCommand.scala:44)
    at kafka.admin.TopicCommand.main(TopicCommand.scala)

注:如果使用的Kafka版本低于2.2,则应使用--zookeeperoption并将连接字符串传递给zookeeper

 

https://stackoverflow.com/questions/55494988/why-is-kafka-not-creating-a-topic-bootstrap-server-is-not-a-recognized-option

 

/app/kafka/bin/kafka-topics.sh --create --zookeeper 192.168.56.11:2181 --replication-factor 3 --partitions 1 --topic test-ken-io
Created topic "test-ken-io".

②其他节点查看Topic

 Topic在kafka01上创建后也会同步到集群中另外两个Broker:kafka2、kafka3

[root@kafka2 ~]# /app/kafka/bin/kafka-topics.sh --list --zookeeper 192.168.56.12:2181
test-ken-io

[root@kafka3 ~]# /app/kafka/bin/kafka-topics.sh --list --zookeeper 192.168.56.13:2181
test-ken-io

③发送消息

这里我们向Broker(id=0)的Topic=test-ken-io发送消息

[root@kafka1 ~]# /app/kafka/bin/kafka-console-producer.sh --broker-list  192.168.56.11:9092  --topic test-ken-io
>test by ken.io

④消费消息

在Kafka2上消费Broker03的消息

[root@moban ~]# /app/kafka/bin/kafka-console-consumer.sh --bootstrap-server 192.168.56.13:9092 --topic test-ken-io --from-beginning
test by ken.io

在Kafka3上消费Broker02的消息

[root@kafka3 ~]# /app/kafka/bin/kafka-console-consumer.sh --bootstrap-server 192.168.56.12:9092 --topic test-ken-io --from-beginning
test by ken.io

注:以上测试都可以收到消息

这是因为这两个消费消息的命令是建立了两个不同的Consumer
如果我们启动Consumer指定Consumer Group Id就可以作为一个消费组协同工,1个消息同时只会被一个Consumer消费到

posted @ 2020-04-23 11:26  闫新江  阅读(624)  评论(0编辑  收藏  举报