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引入依赖 kafka不依赖zk_hadoop

 

 

 配置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



测试  

  • 生产者生产数据

 

kafka引入依赖 kafka不依赖zk_kafka_02

  • 消费者消费数据

kafka引入依赖 kafka不依赖zk_hadoop_03

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

kafka引入依赖 kafka不依赖zk_kafka引入依赖_04

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

 

Kafka 单节点多Broker部署及使用

kafka引入依赖 kafka不依赖zk_kafka引入依赖_05

配置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



  • 生产者生产数据

kafka引入依赖 kafka不依赖zk_zookeeper_06

  • 消费者消费数据

kafka引入依赖 kafka不依赖zk_kafka_07

单节点多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)



kafka引入依赖 kafka不依赖zk_kafka引入依赖_08

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

kafka引入依赖 kafka不依赖zk_kafka_09

  • 消费者的数据

kafka引入依赖 kafka不依赖zk_hadoop_10

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

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

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

kafka引入依赖 kafka不依赖zk_zookeeper_11

 

 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)



 

kafka引入依赖 kafka不依赖zk_kafka_12

 

kafka引入依赖 kafka不依赖zk_kafka引入依赖_13

 

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

 

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