消息队列系统Kafka_01

消息队列

消息:是指在应用系统之间传送的数据。
队列:排队的模型 先进先出 类似于火车进隧道。
消息队列(Message Queue)是一种应用间的通信方式。消息发布者只管把消息发布到MQ中而不管谁来取,消息使用者只管从MQ中取消息而不管谁发布的。帮助应用系统解耦

RabbitMQ,ActiveMQ,RocketMQ:主要是基于pub/sub
Kafka:主要是基于push/pull,不是一个标准的消息队列实现。
在这里插入图片描述

在这里插入图片描述

消息队列的应用场景

  • 应用耦合
    多应用间通过消息队列对同一消息进行处理,避免调用接口失败导致整个过程失败;

  • 异步并行处理
    多应用对消息队列中同一消息进行处理,应用间并发处理消息,相比串行处理,减少处理时间;

  • 限流削峰
    广泛应用于秒杀或抢购活动中,避免流量过大导致应用系统挂掉的情况;

  • 消息驱动的系统
    系统分为消息队列、消息生产者、消息消费者,生产者负责产生消息,消费者(可能有多个)负责对消息进行处理;

消息队列的两种模式

消息队列包括两种模式,点对点模式(point to point, queue)和发布/订阅模式(publish/subscribe,topic)

点对点:两个人之间互相通信,都是点对点这种模型
消息队列
发送者 (生产者)
接收者(消费者)
在这里插入图片描述
消息发送者生产消息发送到queue中,然后消息接收者从queue中取出并且消费消息。消息被消费以后,queue中不再有存储,所以消息接收者不可能消费到已经被消费的消息。

发布订阅:群聊
发布/订阅模式下包括三个角色:
角色主题(Topic)
发布者(Publisher)
订阅者(Subscriber)
在这里插入图片描述
发布者将消息发送到Topic,系统将这些消息传递给多个订阅者。

Kafka

kafka是最初由linkedin公司开发的,使用scala语言编写,kafka是一个分布式的消息队列系统,可以用于搜索日志,监控日志,访问日志等。
分布式就是由多个节点组成,一个节点就是一个服务器。

在kafka当中节点叫做broker ,一个节点就是一个broker,一个broker就是一个服务器
hadoop当中节点 datanode
hbase当中当中 HMaster以及HRegionServer

Kafka的好处

  • 可靠性:分布式的,分区,复制和容错的。
  • 可扩展性:kafka消息传递系统轻松缩放,无需停机。
  • 耐用性:kafka使用分布式提交日志,这意味着消息会尽可能快速的保存在磁盘上,因此它是持久的。
  • 性能:kafka对于发布和定于消息都具有高吞吐量。即使存储了许多TB的消息,他也爆出稳定的性能。
  • kafka非常快:保证零停机和零数据丢失。(因为对磁盘顺序读写)

kafka应用场景
流式处理:实时处理 数据从出现到产生,在一秒钟以内能够处理完成
流式计算:程序一旦启动,就会一直运行下去,一旦有数据,就能够马上被处理掉

生产者生产数据到kafka里面去 ,然后通过一些实时处理的框架例如storm或者sparkStreaming或者flink等等一些实时处理的框架去处理kafka里面的数据。

kafka的基本架构

在这里插入图片描述
节点 Broker:kafka集群中包含一个或者多个服务实例,这种服务实例被称为Broker
生产者 Producer:producer 主要负责生产数据到 topic里面去
topic:虚拟的概念,某一类消息的主题,某一类消息都是存放在某一个topic当中
一个topic有多个partition:一个partition里面有多个segment段,每个segment默认1GB
一个segment: 一个.index文件 + 一个.log文件
.log:存放用户真实的产生的数据
.index文件:存放的索引文件,用于查找.log文件里面的数据。不是针对每一条数据都建索引,而是隔一段时间建一个,之后折半查找。
消费者 Consumer:consumer 主要就是消费topic里面的数据
Consumer Group:每一个Consumer属于一个特定的Consumer Group(可以为每个Consumer指定 groupName)

conusmer消费到哪一条数据需要进行记录:offset来进行记录 数据的偏移量 每条数据都有唯一的offset

kafka需要依赖zk保存一些节点信息 kakfa紧耦合zookeeper
在这里插入图片描述

在这里插入图片描述
kafka当中数据消费的时候,消费者都需要指定属于哪一个消费组
一个消费组里面,可以有多个消费者

调大分区的个数:可以加快数据的消费的速度
kafka当中的数据消费出现延迟:加大消费者线程数量,加大分区的个数

任意时刻,一个分区里面的数据,只能被一个消费组里面的一个线程进行消费
partition的个数与线程的个数
partition个数 = 线程的个数 刚刚好,一个线程消费一个分区
partition个数 > 线程的个数 有线程需要去消费多个分区里面的数据
partition个数 < 线程的个数 有线程在闲置 (线程限制可以做替补)

kakfa当中副本的策略:使用isr这种策略来维护一个副本列表
isr synchronize replication :同步完成的副本列表
主分区:可以有多个副本 ,为了最大程度的同步完成数据,使用多个副本,每个副本都启动线程去复制主分区上面的数据
尽量的保证副本分区当中的数据与主分区当中的数据一致的。如果副本分区当中的数据与主分区当中的数据差别太大,将副本分区移除ISR列表(维护副本分区列表,看有哪些副本分区能跟得上)。如果副本分区的心跳时间比较久远,也会将副本分区移除ISR列表。

kafka集群环境搭建

  1. 初始化环境准备
    安装jdk,安装zookeeper并保证zk服务正常启动

  2. 下载安装包并上传解压
    node01执行以下命令,下载并解压
    cd /export/softwares
    wget http://archive.apache.org/dist/kafka/1.0.0/kafka_2.11-1.0.0.tgz
    tar –zxvf kafka_2.11-1.0.0.tgz -C /export/servers/

  3. node01服务器修改kafka配置文件
    node01执行以下命令进入到kafka的配置文件目录,修改配置文件
    node01执行以下命令创建数据文件存放目录
    mkdir -p /export/servers/kafka_2.11-1.0.0/logs
    cd /export/servers/kafka_2.11-1.0.0/config
    vim server.properties

broker.id=0
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/export/servers/kafka_2.11-1.0.0/logs
num.partitions=2
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
log.flush.interval.messages=10000
log.flush.interval.ms=1000
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
zookeeper.connect=node01:2181,node02:2181,node03:2181
zookeeper.connection.timeout.ms=6000
group.initial.rebalance.delay.ms=0
delete.topic.enable=true
host.name=node01
  1. 安装包分发到其他服务器上面去
    node01执行以下命令,将node01服务器的kafka安装包发送到node02和node03服务器上面去
    cd /export/servers/
    scp -r kafka_2.11-1.0.0/ node02: P W D s c p − r k a f k a 2 . 11 − 1.0.0 / n o d e 03 : PWD scp -r kafka_2.11-1.0.0/ node03: PWDscprkafka2.111.0.0/node03:PWD

  2. node02与node03服务器修改配置文件
    node02与node03服务器修改kafka配置文件

node02使用以下命令修改kafka配置文件
cd /export/servers/kafka_2.11-1.0.0/config
vim server.properties

broker.id=1
log.dirs=/export/servers/kafka_2.11-1.0.0/logs
zookeeper.connect=node01:2181,node02:2181,node03:2181
delete.topic.enable=true
host.name=node02

node03使用以下命令修改kafka配置文件
cd /export/servers/kafka_2.11-1.0.0/config
vim server.properties

broker.id=2
log.dirs=/export/servers/kafka_2.11-1.0.0/logs
zookeeper.connect=node01:2181,node02:2181,node03:2181
host.name=node03
  1. kafka集群启动与停止

注意事项:在kafka启动前,一定要让zookeeper启动起来。
node01执行以下命令将kafka进程启动在后台
cd /export/servers/kafka_2.11-1.0.0
nohup bin/kafka-server-start.sh config/server.properties 2>&1 &

node02执行以下命令将kafka进程启动在后台
cd /export/servers/kafka_2.11-1.0.0
nohup bin/kafka-server-start.sh config/server.properties 2>&1 &

node03执行以下命令将kafka进程启动在后台
cd /export/servers/kafka_2.11-1.0.0
nohup bin/kafka-server-start.sh config/server.properties 2>&1 &

三台机器也可以执行以下命令停止kafka集群

cd /export/servers/kafka_2.11-1.0.0
bin/kafka-server-stop.sh

Kafka集群操作

  1. 创建topic
    bin/kafka-topics.sh查看脚本用法
    bin/kafka-topics.sh --create --zookeeper node01:2181 --replication-factor 2 --partitions 3 --topic test
    –partitions:创建有几个分区
    –replication-factor 2:副本数

  2. 查看主题命令
    cd /export/servers/kafka_2.11-1.0.0
    bin/kafka-topics.sh --list --zookeeper node01:2181,node02:2181,node03:2181
    2181是跟zookeeper的通信端口号

  3. 生产者生产数据
    bin/kafka-console-producer.sh --broker-list node01:9092,node02:9092,node03:9092 --topic test
    9092是跟broker通信端口号

  4. 消费者消费数据
    bin/ kafka-console-consumer.sh --from-beginning --topic test --zookeeper node01:2181,node02:2181,node03:2181

bin/ kafka-console-consumer.sh --bootstrap-server node01:9092,node02:9092,node03:9092 --from-beginning --topic test
5. 运行describe topics命令
bin/kafka-topics.sh --describe --zookeeper node01:2181 --topic test
“leader”是负责给定分区的所有读取和写入的节点。每个节点将成为随机选择的分区部分的领导者。(因为在kafka中 如果有多个副本的话,就会存在leader和follower的关系,表示当前这个副本为leader所在的broker是哪一个)
“replicas”是复制此分区日志的节点列表,无论它们是否为领导者,或者即使它们当前处于活动状态。(所有副本列表 0 ,1,2)
“isr”是“同步”复制品的集合。这是副本列表的子集,该列表当前处于活跃状态并且已经被领导者捕获。(可用的列表 数)

  1. 增加topic分区数
    –alter:修改
    bin/kafka-topics.sh --zookeeper zkhost:port --alter --topic topicName --partitions 8

  2. 增加配置
    动态修改kakfa的配置
    任意kafka服务器执行以下命令可以增加topic分区数
    bin/kafka-topics.sh --zookeeper node01:2181 --alter --topic test --config flush.messages=1

  3. 删除配置
    动态删除kafka集群配置
    bin/kafka-topics.sh --zookeeper node01:2181 --alter --topic test --delete-config flush.messages

  4. 删除topic
    目前删除topic在默认情况下知识打上一个删除的标记,在重新启动kafka后才删除。如果需要立即删除,则需要在
    server.properties中配置:
    delete.topic.enable=true
    然后执行以下命令进行删除topic
    kafka-topics.sh --zookeeper zkhost:port --delete --topic topicName

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值