Kafka到Pulsar:数据流演进之路 | 青训营笔记

125 阅读7分钟

这是我参与「第四届青训营 」笔记创作活动的第7天。

今日内容:#Kafka到pulsar的数据流演进之路

学习重点:消息队列、Kafka、Pulsar

一.课前预习

消息队列应用场景

消息队列常见使用场景:异步处理,应用解耦,流量削锋和消息通讯。

1.异步处理

场景说明:用户注册后,需要发注册邮件和注册短信。传统的做法有两种 1.串行的方式;2.并行方式

(1)串行方式:

将注册信息写入[数据库]成功后,发送注册邮件,再发送注册短信。以上三个任务全部完成后,返回给客户端

image.png

(2)并行方式:

将注册信息写入数据库成功后,发送注册邮件的同时,发送注册短信。以上三个任务完成后,返回给客户端。与串行的差别是,并行的方式可以提高处理的时间

image.png

假设三个业务节点每个使用50毫秒钟,不考虑网络等其他开销,则串行方式的时间是150毫秒,并行的时间可能是100毫秒。

因为CPU在单位时间内处理的请求数是一定的,假设CPU1秒内吞吐量是100次。则串行方式1秒内CPU可处理的请求量是7次(1000/150)。并行方式处理的请求量是10次(1000/100)

引入消息队列,将不是必须的业务逻辑,异步处理。改造后的架构如下:

image.png

按照以上约定,用户的响应时间相当于是注册信息写入数据库的时间,也就是50毫秒。注册邮件,发送短信写入消息队列后,直接返回,因此写入消息队列的速度很快,基本可以忽略,因此用户的响应时间可能是50毫秒。因此架构改变后,系统的吞吐量提高到每秒20 QPS。比串行提高了3倍,比并行提高了两倍

2.应用解耦

场景说明:用户下单后,订单系统需要通知库存系统。传统的做法是,订单系统调用库存系统的接口。如下图 image.png

传统模式的缺点:

·假如库存系统无法访问,则订单减库存将失败,从而导致订单失败

·订单系统与库存系统耦合

如何解决以上问题呢?引入应用消息队列后的方案,如下图:

image.png

·订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功

·库存系统:订阅下单的消息,采用拉/推的方式,获取下单信息,库存系统根据下单信息,进行库存操作

·假如:在下单时库存系统不能正常使用。也不影响正常下单,因为下单后,订单系统写入消息队列就不再关心其他的后续操作了。实现订单系统与库存系统的应用解耦

3.流量削锋

一般在秒杀或团抢活动中使用广泛

应用场景:秒杀活动,一般会因为流量过大,导致流量暴增,应用挂掉。为解决这个问题,一般需要在应用前端加入消息队列。

·可以控制活动的人数

-可以缓解短时间内高流量压垮应用

image.png   ·用户的请求,服务器接收后,首先写入消息队列。假如消息队列长度超过最大数量,则直接抛弃用户请求或跳转到错误页面

·秒杀业务根据消息队列中的请求信息,再做后续处理

4.消息通讯

消息通讯是指,消息队列一般都内置了高效的通信机制,因此也可以用在纯的消息通讯。比如实现点对点消息队列,或者聊天室等

点对点通讯:

image.png

客户端A和客户端B使用同一队列,进行消息通讯。

聊天室通讯:

image.png

客户端A,客户端B,客户端N订阅同一主题,进行消息发布和接收。实现类似聊天室效果。

 (转自CSDN)

二、课中笔记

一、消息队列

1.应用场景

1.1MQ消息通道

优势:异步解耦/ 削峰填谷(等待故障恢复,可以继续服务)/ 高可用(独立)/ 发布订阅

image.png

1.2EventBridge事件总线

事件源-事件集-事件目标

image.png

1.3data platform流数据平台(重点)

Connect/ streaming/ function 批和流数据处理和灵活的数据预处理

image.png

2.主流消息队列

image.png

二、Kafka详解

1.架构

Producer/ consumer/ broker/ zookeeper

1.1ZooKeeper

image.png

1.2Broker

消息接收/持久化/高可用保证

image.png

1.3Controller选举:

Broker在zk中注册controller,注册后就成为controller,其余会watch,到期重新注册

Controller作用:

副本failover切换/ topic meta信息广播/ 扩缩容的状态控制/ 状态机维护

image.png

1.4Coordinator

负载的均衡/ 不同场景不同分配策略

image.png

image.png

2.高可用

依赖副本同步/副本切换

2.1ISR机制

AR/OSR/ISR

Assign Replica 已分配所有副本

Out Sync Replica 很久未同步副本

Insync.replica 一直在同步的副本

min. Insync.replica 最少isr下限

image.png

2.2写入Ack机制

=1 leader副本写成功即为成功

=0 oneway/ producer发送后成功

=-1 isr所有副本都成功即成功

2.3副本同步

image.png

LEO log end offset 日志末尾

HW 是ISR中最小的LEO,也是consumer可见的部分

  副本选举

Clean和unclean选举机制

都是优先选lsr中副本。无可用时,前者认定partition不可用,后者选其他存活副本。

 

3.Kafka集群运维

3.1集群扩缩容

image.png

目标:

Topic( partition这在broker中分布均匀/ 同一个partition的replica分布在多个broker)

Broker(之中replica分布均匀)

3.2步骤和问题

扩容broker节点 – 计算均衡的replica分布拓扑 – controller将新部分分布元数据广播- broker将新副本数据同步 – 缩容的broker节点下线

扩缩容问题:

时间长、期间集群不稳定、期间无法执行其他操作

 

3.3Kafka未来演进

image.png

去除zk依赖

数据存取困难、开销大、违背软件设计原则、网络分区复杂、并发访问zk问题多

Kraft库替换

Precess.roles= broker/ controller/ broker+controller/ null

image.png

3.4运维调优经验

单机吞吐(2.3.1ver./ 40c 500gb 12*1tb 25gb/ ack=-1 replica=2or3)

参数配置(timeout.ms=30000/topics.enable=false/rebalance.enable=false unclean选举关闭)

扩缩容优化(均匀分布)

指标可视化(图表 pct99)

 

三、Pulsar

1.pulsar架构

image.png

1.1Proxy

提供gateway代理能力,解耦客户端和broker,提供云环境和k8s环境下的网关能力(网络隔离)

1.2.broker

无状态组件负责模块:http服务器/ 调度分发器

数据层代理:bookie通讯/ 流量代理

image.png

1.3pulsar 存储

不同存储中的抽象

image.png

定义抽象实现多介质

image.png

根据需求(实时程度,冷热程度划分)多级存储

缓存:tail-read – bookkeeper:catch-up短时间的热数据– s3等冷存:catch-up长时间的冷数据

image.png

image.png

2.bookkeeper架构

有效降低长尾延时

image.png

image.png

基本概念:

Ledger:基本存储和读写单元

Fragment:最小分布单元,和ledger默认一一对应

Entry:一条日志=一个entry=一个record,有对应entry id

新建ledger:

image.png

参数变化提高系统能力

Bk的读写一致性

加锁处理

Pipeline模式

Entry id<=LAC

image.png

读写分离

写入:缓存+定期刷盘 优化排序

读入:先读memtable,没命中就读索引

3.pulsar特性

生产模式:*

shared/ exclusive/ exclusive with fencing/ waitforexclusive

多个往一个topic生产/ 独占生产+其余standby/断开/无法创建

消费模式:

Exclusive 独占订阅

Failover 故障时切换

Shared 共享、queue队列模型

Key_shared key哈希

多租户:

体现于url中

image.png

Plugin

一套插件支持各种类型

image.png

4.集群HA&Scale_up

topic根据哈希值落入哈希环,顺时针归属于不同bundle

bundle均匀分给broker

image.png