KAFKA的部署与使用

kafka的部署模式

  1. 单节点Broker部署
  2. 单节点多Broker部署
  3. 集群部署(多节点多Broker部署)
  • 实际的生产环境中使用的是第3中方式,以集群的方式来部署kafka。kafka强依赖ZK,如果想要使用Kafka,就必须安装ZK,kafka中的消息偏置信息、kafka集群、topic信息会被存储在ZK中。有人可能会说在在使用kafka的时候就没有安装ZK,那是因为kafka内置了一个ZK,一般我们不使用它。
  • 单节点ZK部署

下载Zookeeper并解压到指定目录

$ wget http://www-eu.apache.org/dist/zookeeper/zookeeper-3.5.1-alpha/zookeeper-3.5.1-alpha.tar.gz
$ tar -zxvf zookeeper-3.5.1-alpha.tar.gz -c /opt/zookeeper

 进入Zookeeper的config目录下

$ cd /opt/zookeeper/conf

拷贝zoo_sample.cfg文件重命名为zoo.cfg,然后修改dataDir属性

# 数据的存放目录
dataDir=/home/hadoop/zkdata
# 端口,默认就是2181
clientPort=2181

配置环境变量

# Zookeeper Environment Variable
export ZOOKEEPER_HOME=/opt/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin 

Zookeeper 启动停止命令

$ zkServer.sh start
$ zkServer.sh stop
  • 单节点Broker部署及使用

  • Kafka中单节点部署又分为两种,一种为单节点单Broker部署,一种为单节点多Broker部署,因为是节点的kafka,所以在安装ZK的时候也只需要单节点即可

部署架构

 

 配置Kafka

vim $KAFKA_HOME/config/server.properties
# broker的全局唯一编号,不能重复 broker.id
=0 # 监听 listeners=PLAINTEXT://:9092 # 日志目录 log.dirs=/home/hadoop/kafka-logs # 配置zookeeper的连接(如果不是本机,需要该为ip或主机名) zookeeper.connect=localhost:2181

启动Zookeeper

[hadoop@hadoop001]$zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

启动Kafka

$ kafka-server-start.sh $KAFKA_HOME/config/server.properties

打印的日志信息没有报错,可以看到如下信息

[Kafka Server 0], started (kafka.server.KafkaServer)

但是并不能保证Kafka已经启动成功,输入jps查看进程,如果可以看到Kafka进程,表示启动成功

[hadoop@hadoop001 ~]$ jps
17940 Jps
16966 Kafka
13789 QuorumPeerMain
[hadoop@hadoop001 ~]$ jps -m
17940 Jps -m 9173 Kafka /opt/kafka/config/server.properties 
13789 QuorumPeerMain /opt/zookeeper/bin/../conf/zoo.cfg

创建topic

[hadoop@hadoop001 bin]$ kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
Created topic "test".

查看所有的topic信息

[hadoop@hadoop001 bin]$ kafka-topics.sh --list --zookeeper localhost:2181
test
wsk_test

 启动生产者

[hadoop@hadoop001 bin]$ kafka-console-producer.sh --broker-list localhost:9092 --topic test
kafaka
zz
zz
kkk
zzz
bbb

 启动消费者

[hadoop@hadoop001 bin]$ kafka-console-consumer.sh --zookeeper localhost:2181 --topic test --from-beginningkafka
kafaka
zz
zz
kkk
zzz
bbb

测试  

  • 生产者生产数据

 

  • 消费者消费数据

 我们在启动一个消费者,去掉后面的参数–from-beginning,看有什么区别

  • 总结:不带参数–from-beginning,数据的消费不会对历史数据进行消费,就是说,在这个消费启动之前的数据,都不会在这里被消费,只会消费这个消费启动以后的数据。

Kafka 单节点多Broker部署及使用

  • 配置Kafka

拷贝server.properties三份

cd $KAFKA_HOME/config
cp server.properties server-1.properties

cp server.properties server-2.properties

cp server.properties server-3.properties

修改server-1.properties文件

# broker的全局唯一编号,不能重复
broker.id=1
# 监听
listeners=PLAINTEXT://:9093
# 日志目录
log.dirs=/home/hadoop/kafka-logs-1

修改server-2.properties文件

# broker的全局唯一编号,不能重复
broker.id=3
# 监听
listeners=PLAINTEXT://:9094
# 日志目录
log.dirs=/home/hadoop/kafka-logs-3

修改server-3.properties文件 

# broker的全局唯一编号,不能重复
broker.id=2
# 监听
listeners=PLAINTEXT://:9095
# 日志目录
log.dirs=/home/hadoop/kafka-logs-2

启动Zookeeper

[hadoop@hadoop001]$zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

启动Kafka(分别启动server1、2、3)

$ kafka-server-start.sh $KAFKA_HOME/config/server-1.properties
$ kafka-server-start.sh $KAFKA_HOME/config/server-2.properties
$ kafka-server-start.sh $KAFKA_HOME/config/server-3.properties

查看进程

[hadoop@hadoop001 ~]$ jps
19761 Kafka
4323 Kafka
5717 Jps
5051 Kafka
13789 QuorumPeerMain

[hadoop@hadoop001 ~]$ jps -m
12096 Jps -m
19761 Kafka /home/hadoop/app/kafka_2.11-0.10.0.0/config/server-1.properties
4323 Kafka /home/hadoop/app/kafka_2.11-0.10.0.0/config/server-2.properties
5051 Kafka /home/hadoop/app/kafka_2.11-0.10.0.0/config/server-3.properties
13789 QuorumPeerMain /home/hadoop/app/zookeeper-3.4.6/bin/../conf/zoo.cfg

创建topic(指定副本数量为3)

[hadoop@hadoop001 ~]$ kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 3 --partitions 1 --topic my-replicated-topic
Created topic "my-replicated-topic".

查看所有的topic信息

[hadoop@hadoop001 ~]$ kafka-topics.sh --list --zookeeper localhost:2181
my-replicated-topic
test
wsk_test

 查看某个topic的详细信息 

hadoop@hadoop001 ~]$ kafka-topics.sh --describe --zookeeper localhost:2181 --topic my-replicated-topic
Topic:my-replicated-topic	PartitionCount:1	ReplicationFactor:3	Configs:
	Topic: my-replicated-topic	Partition: 0	Leader: 2	Replicas: 2,1,3	Isr: 2,1,3

启动生产者

[hadoop@hadoop001 ~]$ kafka-console-producer.sh --broker-list localhost:9093,localhost:9094,localhost:9095 --topic my-replicated-topic

启动消费者

[hadoop@hadoop001 ~]$  kafka-console-consumer.sh --zookeeper localhost:2181 --topic my-replicated-topic --from-beginning
  • 生产者生产数据

  • 消费者消费数据

单节点多borker容错性测试

  • Kafka是支持容错的,上面我们已经完成了kafka单节点Blocker的部署,下面我们来对Kafka的容错性进行测试,测试步骤如下

(1)查看topic的详细信息,观察那个blocker的角色是leader,那些blocker的角色follower

[hadoop@hadoop001 ~]$ kafka-topics.sh --describe --zookeeper localhost:2181 --topic my-replicated-topic
Topic:my-replicated-topic	PartitionCount:1	ReplicationFactor:3	Configs:
	Topic: my-replicated-topic	Partition: 0	Leader: 2	Replicas: 2,1,3	Isr: 2,1,3

[hadoop@hadoop001 ~]$ jps -m
12096 Jps -m
19761 Kafka /home/hadoop/app/kafka_2.11-0.10.0.0/config/server-1.properties
4323 Kafka /home/hadoop/app/kafka_2.11-0.10.0.0/config/server-2.properties
5051 Kafka /home/hadoop/app/kafka_2.11-0.10.0.0/config/server-3.properties
13789 QuorumPeerMain /home/hadoop/app/zookeeper-3.4.6/bin/../conf/zoo.cfg



 (2)手工kill掉任意一个状态是follower的borker,测试生成和消费信息是否正确

步骤1中可以看到 2 为leader,1 和 3为 follower,将follower为1的进程kill掉 

kill -9 19761   (查看于步骤1的jps -m)

杀死以后继续在生产者输入数据

  • 消费者的数据

结论:kill掉任意一个状态是follower的broker,生成和消费信息正确,不受任何影响

 (3)手工kill掉状态是leader的borker,测试生产和消费的信息是否正确

borker2的角色为leader,将它kill掉,borker 3变成了leader 

 2,leader被杀死以后消费者会有大量的警告信息但是并没有报错

继续在生产者输入数据,消费者依旧能照常运转消费。

[2019-07-15 14:50:25,788] WARN [ConsumerFetcherThread-console-consumer-80431_hadoop001-1563173078257-f10aadd9-0-2], Error in fetch kafka.consumer.ConsumerFetcherThread$FetchRequest@3df9da19 (kafka.consumer.ConsumerFetcherThread)
java.nio.channels.ClosedChannelException
    at kafka.network.BlockingChannel.send(BlockingChannel.scala:110)
    at kafka.consumer.SimpleConsumer.liftedTree1$1(SimpleConsumer.scala:98)
    at kafka.consumer.SimpleConsumer.kafka$consumer$SimpleConsumer$$sendRequest(SimpleConsumer.scala:83)
    at kafka.consumer.SimpleConsumer$$anonfun$fetch$1$$anonfun$apply$mcV$sp$1.apply$mcV$sp(SimpleConsumer.scala:132)
    at kafka.consumer.SimpleConsumer$$anonfun$fetch$1$$anonfun$apply$mcV$sp$1.apply(SimpleConsumer.scala:132)
    at kafka.consumer.SimpleConsumer$$anonfun$fetch$1$$anonfun$apply$mcV$sp$1.apply(SimpleConsumer.scala:132)

结论:kill掉状态是leader的borker,生产和消费的信息正确

 总结:不管当前状态的borker是leader还是follower,当我们kill掉后,只要有一个borker能够正常使用,则消息仍然能够正常的生产和发送。即Kafka的容错性是有保证的!

原文地址:https://www.cnblogs.com/xuziyu/p/11189181.html