kafka 基础架构和环境搭建

参考:

  • Kafka、RocketMQ、RabbitMQ的比较
  • CDH常用端口汇总
  • kafka document 配置参数

消息队列的概念

消息队列应用场景

  • 异步处理,将一些比较耗时的操作放在其他系统中,通过消息队列将需要进行处理的消息进行存储,其他系统可
    以消费消息队列中的数据。比较常见的场景:发送短信验证码、发送邮件
  • 系统解耦,一个微服务可以将消息放入到消息队列中,另一个微服务可以从消息队列中把消息取出来进行处理
  • 流量削峰,消息队列是低延迟、高可靠、高吞吐的,可以应对大量并发
  • 日志处理(大数据领域,用户日志数据存放到消息队列中,由flink或spark streaming处理)

Kafka 是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域。由apache开发的开源流平台,由scala和java编写。一个分布式的流平台应该包含3点关键的能力:

  • 发布和订阅流数据流
  • 以容错的持久化方式存储数据流
  • 处理数据流

通常将kafka用于两类程序

  1. 建立实时数据管道,可靠地在系统或应用之间获取数据
  2. 构建实时流应用程序,转换或响应数据流

相关的组件包括

  • Producers,将消息数据放入到Kafka集群中
  • Consumers,将消息数据从Kafka集群中拉取出来
  • Connectors,连接器可以将数据库中的数据导入到Kafka,也可以将Kafka的数据导出到数据库中
  • Stream Processors:流处理器可以Kafka中拉取数据,也可以将数据写入到Kafka中

消息队列的两种模式

(1)点对点模式(一对一)

kafka 基础架构和环境搭建_第1张图片

消息发送者生产消息发送到消息队列中,然后消息接收者从消息队列中取出并且消费消息。消息被消费以后,消息队列中不再有存储,所以消息接收者不可能消费到已经被消费的消息。

  • 每个消息只有一个接收者(Consumer)(即一旦被消费,消息就不再在消息队列中)
  • 发送者和接收者间没有依赖性,发送者发送消息之后,不管有没有接收者在运行,都不会影响到发送者下次发送消息;
  • 接收者在成功接收消息之后需向队列应答成功,以便消息队列删除当前接收的消息;

(2)发布订阅模式(一对多)

在这里插入图片描述

  • 每个消息可以有多个订阅者
  • 发布者和订阅者之间有时间上的依赖性。针对某个主题(topic)的订阅者,它必须创建一个订阅者之后,才能消费发布者的消息。·
  • 为了消费消息,订阅者需要提前订阅该角色主题,并保持在线运行
  • 消费者消费数据之后不会清除消息

kafka基础架构

kafka 基础架构和环境搭建_第2张图片

kafka 基础架构和环境搭建_第3张图片

基础架构

  • Producer : 消息生产者,就是向 kafka broker 发消息的客户端;

  • Consumer : 消息消费者,向 kafka broker 取消息的客户端;

  • Consumer Group (CG): 消费者组,由多个 consumer 组成。 消费者组内每个消费者负责消费不同分区的数据一个分区只能由一个组内的一个消费者消费;消费者组之间互不影响(并行消费)。 所有的消费者都属于某个消费者组,即消费者组是逻辑上的一个订阅者。

  • Broker : 一台 kafka 服务器就是一个 broker。一个集群由多个 broker 组成。一个 broker可以容纳多个 topic

  • Topic : 可以理解为一个队列, 生产者和消费者面向的都是一个 topic;

  • Partition: 为了实现扩展性,一个非常大的 topic 可以分布到多个 broker(即服务器)上,一个 topic 可以分为多个 partition,每个 partition 是一个有序的队列;

  • Replica: 副本,为保证集群中的某个节点发生故障时, 该节点上的 partition 数据不丢失 且 kafka 仍然能够继续工作,kafka 提供了副本机制,一个 topic 的每个分区都有若干个副本,一个 leader 和若干个 follower

  • leader: 每个分区多个副本的“主”,生产者发送数据的对象,以及消费者消费数据的对象都是 leader。

  • follower: 每个分区多个副本中的“从”,实时从 leader 中同步数据,保持和 leader 数据的同步。 leader 发生故障时,某个 follower 会成为新的 leader

注意:

  • leader和follower一定不在同一台机器

  • 一个分区的数据只能由一个消费者进行消费

  • zookeeper已经成为kafka的一个瓶颈,未来数据将不会存储在zookeeper中

Kafka环境搭建

本环境的相关包版本如下

  • kafka_2.12-3.0.0.tgz
  • jdk-8u212-linux-x64.tar.gz
  • zookeeper-3.4.10.tar.gz

配置基础环境

启动三台ec2实例,相互之间配置免密码登录,提前安装java8(貌似aws corretto没有jps,自己找一个jdk包安装)

  • master(172.31.16.100)
  • slave1(172.31.16.101)
  • slave2(172.31.16.102)

编写同步脚本如下,之后的所有配置都从master上同步到从节点

#!/bin/bash
if [ $# -lt 1 ]
then
    echo Not Enough Arguement!
    exit;
fi
for host in master slave1 slave2
do
    echo ==================== $host ====================
    for file in $@
    do
        if [ -e $file ]
        then
            pdir=$(cd -P $(dirname $file); pwd)
            fname=$(basename $file)
            ssh $host "mkdir -p $pdir"
            rsync -av $pdir/$fname ec2-user@$host:$pdir
        else
            echo $file does not exists!
        fi
    done
done

修改hosts之后同步配置

$ sudo vim /etc/hosts
172.31.16.100 master
172.31.16.101 slave1
172.31.16.102 slave2

配置zookeeper

提前启动zookeeper

配置zookeeper,zookeeper内部原理和API操作

#!/bin/bash
if [ $# -lt 1 ]
then
    echo "No Args Input..."
    exit ;
fi
case $1 in
    "start")
        echo " =================== 启动 zookeeper ==================="
        ssh master "/opt/module/zookeeper-3.4.10/bin/zkServer.sh start"
        ssh slave1 "/opt/module/zookeeper-3.4.10/bin/zkServer.sh start"
        ssh slave2 "/opt/module/zookeeper-3.4.10/bin/zkServer.sh start"
    ;;
    "stop")
        echo " =================== 关闭 zookeeper==================="
        ssh master "/opt/module/zookeeper-3.4.10/bin/zkServer.sh stop"
        ssh slave1 "/opt/module/zookeeper-3.4.10/bin/zkServer.sh stop"
        ssh slave2 "/opt/module/zookeeper-3.4.10/bin/zkServer.sh stop"
    ;;
    "status")
        echo " =================== 关闭 zookeeper==================="
        ssh master "/opt/module/zookeeper-3.4.10/bin/zkServer.sh status"
        ssh slave1 "/opt/module/zookeeper-3.4.10/bin/zkServer.sh status"
        ssh slave2 "/opt/module/zookeeper-3.4.10/bin/zkServer.sh status"
    ;;
    *)
        echo "Input Args Error..."
    ;;
esac

查看jps状态

#!/bin/bash
for host in master slave1 slave2
do
    echo =============== $host ===============
    ssh $host jps
done

查看zookeeper状态

$ myzoo.sh status
 =================== 关闭 zookeeper===================
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: follower
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: leader
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: follower

配置kafka

解压缩包

sudo mkdir -p /opt/module/
sudo chown 1000:1000 /opt/module
tar -xzvf kafka_2.12-3.0.0.tgz -C /opt/module/

查看bin目录

master:/opt/module/kafka_2.12-3.0.0$ ls bin/
connect-distributed.sh        kafka-dump-log.sh              kafka-storage.sh
connect-mirror-maker.sh       kafka-features.sh              kafka-streams-application-reset.sh
connect-standalone.sh         kafka-get-offsets.sh           kafka-topics.sh
kafka-acls.sh                 kafka-leader-election.sh       kafka-transactions.sh
kafka-broker-api-versions.sh  kafka-log-dirs.sh              kafka-verifiable-consumer.sh
kafka-cluster.sh              kafka-metadata-shell.sh        kafka-verifiable-producer.sh
kafka-configs.sh              kafka-mirror-maker.sh          trogdor.sh
kafka-console-consumer.sh     kafka-producer-perf-test.sh    windows
kafka-console-producer.sh     kafka-reassign-partitions.sh   zookeeper-security-migration.sh
kafka-consumer-groups.sh      kafka-replica-verification.sh  zookeeper-server-start.sh
kafka-consumer-perf-test.sh   kafka-run-class.sh             zookeeper-server-stop.sh
kafka-delegation-tokens.sh    kafka-server-start.sh          zookeeper-shell.sh
kafka-delete-records.sh       kafka-server-stop.sh

修改配置文件server.properties

//kafka的唯一识别号
broker.id=0
//日志和数据的存放目录
log.dirs=/opt/module/kafka_2.12-3.0.0/datas
//kafka依赖zookeeper
zookeeper.connect=master:2881.slave1:2181,slave2:2181/kafka

分发文件,并修改broker.id

修改环境变量

export JAVA_HOME=/opt/module/jdk1.8.0_212
export PATH=$PATH:$JAVA_HOME/bin
export KAFKA_HOME=/opt/module/kafka_2.12-3.0.0_2.12-3.0.0
export PATH=$PATH:$KAFKA_HOME/bin

启动kafka

bin/kafka-server-start.sh config/server.properties

启动脚本

#!/bin/bash
if [ $# -lt 1 ]
then
    echo "No Args Input..."
    exit ;
fi
case $1 in
    "start")
        echo " =================== 启动 kafka==================="
        ssh master "kafka-server-start.sh -daemon /opt/module/kafka_2.12-3.0.0/config/server.properties"
        ssh slave1 "kafka-server-start.sh -daemon /opt/module/kafka_2.12-3.0.0/config/server.properties"
        ssh slave2 "kafka-server-start.sh -daemon /opt/module/kafka_2.12-3.0.0/config/server.properties"
    ;;
    "stop")
        echo " =================== 关闭 kafka==================="
        ssh master "kafka-server-stop.sh stop"
        ssh slave1 "kafka-server-stop.sh stop"
        ssh slave2 "kafka-server-stop.sh stop"
    ;;
    *)
        echo "Input Args Error..."
    ;;
esac

查看进程,QuorumPeerMain是zookeeper进程

master:$ jpsall.sh
=============== master ===============
29589 QuorumPeerMain
32824 Kafka
32906 Jps
32366 ZooKeeperMain
=============== slave1 ===============
4929 QuorumPeerMain
7124 Jps
7050 Kafka
=============== slave2 ===============
29825 Kafka
27703 QuorumPeerMain
29899 Jps

查看zookeeper节点

[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper, kafka]
[zk: localhost:2181(CONNECTED) 7] ls /kafka
[cluster, controller_epoch, controller, brokers, feature, admin, isr_change_notification, consumers, log_dir_event_notification, latest_producer_id_block, config]

注意点

  • 每次重启kafka时需要先将datas目录中存储的数据删除,不然可能会报clusterid不匹配的错误,也可以手动修改meta.properties中的clusterid,按照报错提示修改即可
  • 需要删除zk中的节点信息(kafka)

shell命令

kafka-topics.sh

参数 描述
–bootstrap-server 连接的kafka broker主机名称和端口号
–topic 操作的主体名称
–create 创建主题
–delete 删除主题
–alter 修改主题
-list 列出所有主题
–describe 查看主题的详细描述
–partition 设置分区数
–replocation-factor 设置分区副本
–config 更新系统默认配置

查看当前服务器的所有topic

9092: Kafka集群节点之间通信的RPC端口

kafka-topics.sh --bootstrap-server master:9092,slave1:9092 --list

创建topic

kafka-topics.sh --bootstrap-server master:9092 --topic first --create --partitions 1 --replication-factor 3 

查看topic的详细信息

kafka-topics.sh --bootstrap-server master:9092 --describe --topic first
Topic: first    TopicId: CxCmQXEHSKeWnXXmA2UK_g PartitionCount: 1       ReplicationFactor: 3    Configs: segment.bytes=1073741824
        Topic: first    Partition: 0    Leader: 2       Replicas: 2,1,0 Isr: 1,0,2

修改分区数

kafka-topics.sh --bootstrap-server master:9092 --alter --topic first --partitions 3
//查看topic详细信息,分区只能增加不能减少
Topic: first    TopicId: CxCmQXEHSKeWnXXmA2UK_g PartitionCount: 3       ReplicationFactor: 3    Configs: segment.bytes=1073741824
        Topic: first    Partition: 0    Leader: 2       Replicas: 2,1,0 Isr: 1,0,2
        Topic: first    Partition: 1    Leader: 0       Replicas: 0,1,2 Isr: 0,1,2
        Topic: first    Partition: 2    Leader: 1       Replicas: 1,2,0 Isr: 1,2,0

删除topic

注意:需要 server.properties 中设置 delete.topic.enable=true 否则只是标记删除

bin/kafka-topics.sh --bootstrap-server master:9092 --delete --topic first

发送消息

bin/kafka-console-producer.sh --bootstrap-server master:9092 --topic first

消费信息

bin/kafka-console-consumer.sh --bootstrap-server master:9092 --topic first
bin/kafka-console-consumer.sh --bootstrap-server master:9092 --from-beginning --topic first

image-20220512171902435

你可能感兴趣的:(大数据,kafka,大数据,分布式)