• Kafka 单节点部署


           三种安装Kafka的方式,分别为:单节点单Broker部署、单节点多Broker部署、集群部署(多节点多Broker)。实际生产环境中使用的是第三种方式,以集群的方式来部署Kafka。 

          Kafka强依赖ZK,如果想要使用Kafka,就必须安装ZK,Kafka中的消费偏置信息、kafka集群、topic信息会被存储在ZK中。有人可能会说我在使用Kafka的时候就没有安装ZK,那是因为Kafka内置了一个ZK,一般我们不使用它。

    一、Kafka 单节点部署

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

    ZooKeeper官网:http://zookeeper.apache.org/

    下载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

    笔者在安装完Zookeeper后,输入命令启动后,jps中并没有查看到QuorumPeerMain进程,说明没有启动成功,进入Zookeeper的log目录下查看日志,发现报了一个错误,如下

    AdminServer$AdminServerException: Problem starting AdminServer on address 0.0.0.0, port 8080 and command URL /commands

    原因:zookeeper的管理员端口被占用
    解决:笔者使用的zookeeper的版本为3.5.1,该版本中有个内嵌的管理控制台是通过jetty启动,会占用8080 端口,需要修改配置里的“admin.serverPort=8080”,默认8080没有写出来,只要改为一个没使用的端口即可,例如:admin.serverPort=8181

    1.Kafka 单节点单Broker部署及使用

    部署架构

    这里写图片描述

    配置Kafka

    参考官网:http://kafka.apache.org/quickstart

    进入kafka的config目录下,有一个server.properties,添加如下配置

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

    启动Zookeeper

    [hadoop@Master ~]$ 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@Master ~]$ jps
    9173 Kafka
    9462 Jps
    8589 QuorumPeerMain
    [hadoop@Master ~]$ jps -m
    9472 Jps -m
    9173 Kafka /opt/kafka/config/server.properties
    8589 QuorumPeerMain /opt/zookeeper/bin/../conf/zoo.cfg

    创建topic

    [hadoop@Master ~]$ kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test

    参数说明:
    –zookeeper:指定kafka连接zk的连接url,该值和server.properties文件中的配置项{zookeeper.connect}一样
    –replication-factor:指定副本数量
    –partitions:指定分区数量
    –topic:主题名称

    查看所有的topic信息

    [hadoop@Master ~]$ kafka-topics.sh --list --zookeeper localhost:2181 test

    启动生产者

    [hadoop@Master ~]$ kafka-console-producer.sh --broker-list localhost:9092 --topic test

    启动消费者

    [hadoop@Master ~]$ kafka-console-consumer.sh --zookeeper localhost:2181 --topic test --from-beginning

    测试

    • 生产者生产数据

    这里写图片描述

    • 消费者消费数据

    这里写图片描述

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

    • 生产者消费数据

    这里写图片描述

    • 消费者1消费数据(含有–from-beginning参数)

    这里写图片描述

    • 消费者2消费数据(没有–from-beginning参数)

    这里写图片描述

    总结:–from-beginning参数如果有表示从最开始消费数据,旧的和新的数据都会被消费,而没有该参数表示只会消费新产生的数据

    2.Kafka 单节点多Broker部署及使用

    部署架构

    这里写图片描述

    配置Kafka

    参考官网:http://kafka.apache.org/quickstart

    拷贝server.properties三份

    [hadoop@Master ~]$ cd /opt/kafka/config
    [hadoop@Master config]$ cp server.properties server-1.properties 
    [hadoop@Master config]$ cp server.properties server-2.properties 
    [hadoop@Master config]$ 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=2
    # 监听
    listeners=PLAINTEXT://:9094
    # 日志目录
    log.dirs=/home/hadoop/kafka-logs-2

    修改server-3.properties文件

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

    启动Zookeeper

    [hadoop@Master ~]$ 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@Master ~]$ jps
    11905 Kafka
    11619 Kafka
    8589 QuorumPeerMain
    12478 Jps
    12191 Kafka
    [hadoop@Master ~]$ jps -m
    11905 Kafka /opt/kafka/config/server-2.properties
    11619 Kafka /opt/kafka/config/server-1.properties
    12488 Jps -m
    8589 QuorumPeerMain /opt/zookeeper/bin/../conf/zoo.cfg
    12191 Kafka /opt/kafka/config/server-3.properties

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

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

    查看所有的topic信息

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

    查看某个topic的详细信息

    [hadoop@Master ~]$ 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,3,1 Isr: 2,3,1

     

    启动生产者

    $ kafka-console-producer.sh --broker-list localhost:9093,localhost:9094,localhost:9095 --topic my-replicated-topic

    启动消费者

    $ 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@Master ~]$ 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,3,1 Isr: 2,3,1

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

    步骤1中可以看到 2 为leader,1 和 3为 follower,将follower为1的进程kill掉
    这里写图片描述

    启动生产和消费者测试信息是否正确

    这里写图片描述
    这里写图片描述

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

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

    borker2的角色为leader,将它kill掉,borker 3变成了leader
    这里写图片描述

    启动生产和消费者测试信息是否正确

    这里写图片描述

    这里写图片描述

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

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

    2.Kafka 集群搭建(多节点多Broker)

    Kafka 集群方式部署,需要先安装ZK集群,笔者是三个节点组成的集群,具体安装配置请参考Hadoop HA 高可用集群搭建 中的ZK集群安装,在这笔者主要介绍Kafka的集群安装配置。

    下载安装包

    wget http://mirror.bit.edu.cn/apache/kafka/0.9.0.0/kafka_2.10-0.9.0.0.tgz

    解压安装包

    tar -zxvf kafka_2.10-0.9.0.0.tgz -C ~/export/servers/

    创建软连接

    ln -s kafka_2.10-0.9.0.0/ kafka

    修改配置文件server.properties

    ############################# Server Basics #############################
    # broker 的全局唯一编号,不能重复
    broker.id=0
    
    ############################# Socket Server Settings #############################
    # 配置监听,,默认
    listeners=PLAINTEXT://:9092
    
    # 用来监听连接的端口,producer和consumer将在此端口建立连接,,默认
    port=9092
    
    # 处理网络请求的线程数量,默认
    num.network.threads=3
    
    # 用来处理磁盘IO的线程数量,默认
    num.io.threads=8
    
    # 发送套接字的缓冲区大小,默认
    socket.send.buffer.bytes=102400
    
    # 接收套接字的缓冲区大小,默认
    socket.receive.buffer.bytes=102400
    
    # 请求套接字的缓冲区大小,默认
    socket.request.max.bytes=104857600
    
    ############################# Log Basics #############################
    # kafka 运行日志存放路径
    log.dirs=/root/export/servers/logs/kafka
    
    # topic 在当前broker上的分片个数,默认为1
    num.partitions=2
    
    # 用来恢复和清理data下数据的线程数量,默认
    num.recovery.threads.per.data.dir=1
    
    ############################# Log Retention Policy #############################
    # segment文件保留的最长时间,超时将被删除,默认
    log.retention.hours=168
    
    # 滚动生成新的segment文件的最大时间,默认
    log.roll.hours=168

    配置环境变量

    # Kafka Environment Variable
    export KAFKA_HOME=/root/export/servers/kafka
    export PATH=$PATH:$KAFKA_HOME/bin

    分发安装包
    注意:分发安装包,也要创建软连接,配置环境变量

    scp -r ~/export/servers/kafka_2.10-0.9.0.0/ storm02:~/export/servers
    scp -r ~/export/servers/kafka_2.10-0.9.0.0/ storm03:~/export/servers

    再次修改配置文件

    笔者的ZK集群,使用的节点的主机名分别为storm01、storm02、storm03
    依次修改各服务器上配置文件server.properties 的 broker.id,分别是0,1,2不得重复
    修改host.name分别为storm01,storm02,storm03

    这里写图片描述
    这里写图片描述

    启动Kafka集群
    注意:在启动Kafka集群前,确保ZK集群已经启动且能够正常运行

    这里写图片描述

    测试

    • 创建topic
    [root@storm01 ~]# kafka-topics.sh --create --zookeeper storm01:2181 --replication-factor 3 --partitions 2 --topic test
    Created topic "test".
    [root@storm01 ~]# kafka-topics.sh --describe --zookeeper storm01:2181 --topic test
    Topic:test  PartitionCount:2    ReplicationFactor:3 Configs:
        Topic: test Partition: 0    Leader: 0   Replicas: 0,1,2 Isr: 0,1,2
        Topic: test Partition: 1    Leader: 1   Replicas: 1,2,0 Isr: 1,2,0
    • 启动生产者
    [root@storm01 ~]# kafka-console-producer.sh --broker-list storm01:9092,storm02:9092,storm03:9092 --topic test
    hello
    hello kafka cluster
    test
    hello storm
    • 启动两个消费者,消费消息
    [root@storm02 ~]# kafka-console-consumer.sh --zookeeper storm02:2181 --topic test --from-beginning
    hello
    hello kafka cluster
    test
    hello storm
    [root@storm03 ~]# kafka-console-consumer.sh --zookeeper storm03:2181 --topic test --from-beginning
    hello
    hello kafka cluster
    test
    hello storm

    Kafka集群模式(多节点多Broker)下Broker容错性测试

    Kafka 单节点多Broker中笔者已经做了Broker的容错性测试,得出的结论是:不管当前状态的borker是leader还是follower,当我们kill掉后,只要有一个borker能够正常使用,则消息仍然能够正常的生产和发送。即Kafka的容错性是有保证的!

    Kafka 集群中和单节点多Broker的测试相同,结果相同,请参考Kafka 单节点多Broker容错性测试

  • 相关阅读:
    前端开发中同步和异步的区别
    SQL STUFF函数 拼接字符串
    Javascript的精华
    .net网站报错:对象的当前状态使该操作无效
    免费 WebOffice使用
    DotNetBar教程
    C#获取周的第一天、最后一天、月第一天和最后一天
    C#判断文字是否为汉字
    C# 将字符串转为ऩ这种的 html实体编码
    SqlServer将没有log文件的数据库文件附加到服务器中
  • 原文地址:https://www.cnblogs.com/aishanyishi/p/10325675.html
Copyright © 2020-2023  润新知