kafka的部署模式
- 单节点Broker部署
- 单节点多Broker部署
- 集群部署(多节点多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信息
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的容错性是有保证的!