异步解耦、削峰填谷、发布订阅、高可用
事件源:将云服务、自定义应用。SaaS应用等应用程序产生的事件消息发布到事件集
事件集:存储接收到的事件消息,并根据事件规则将事件消息路由到事件目标
事件目标:消费事件消息
提供批/流数据处理能力、各类组件提供各类Connect、提供Streaming/Function能力、根据数据schema灵活的进行数据预处理
保存元数据以及提供选主能力
Broker角色
Controller选举
Controller作用
副本同步机制
副本切换机制
AR:Assign Replica已经分配的所有副本
OSR:Out Sync Replica、很久没有同步数据的副本
ISR:一直都在同步数据的副本、可以作为热备进行切换的副本、min.insync.replicas最少isr数量配置
ACK=1:leader副本写入成功,producer即认为写成功
ACK=0:Oneway模式、Producer发送后即为成功
ACK=-1:ISR中所有副本都成功,Producer才认为写成功
LEO:Log End Offset日志最末尾的数据
HW:ISR中最小的LEO作为HW、HW的消息为Consumer可见的消息
clean选举:优先选取Isr中的副本作为leader、如果Isr中无可用副本,则partition不可用
unclean选举:优先选取Isr中的副本作为leader、如果Isr中无可用副本,则选取其他存活副本
Kafka集群扩容之后的目标分别需要在Topic、Broker维度上考虑:
Topic维度:partition在各个broker之间分布是均匀的、同一个partition的replica不会分布在一台broker
Broker维度:broker之间replica的数量是均匀的
扩容broker节点:leader副本写入成功,producer即认为写成功
计算均衡的replica分布拓扑:保证topic的partition在broker间分布均匀、保证broker之间replica分布均匀
controller负责新的副本分布元数据广播:controller将新的leader/follower信息广播给broker
broker负责新副本的数据同步:broker上有需要同步数据的副本则进行数据同步
扩缩容时间长,涉及到数据迁移,在生产环境中一次扩缩容可能要迁移TB甚至PB的数据
扩缩容期间集群不稳定,保证数据的完整性,往往会从最老的数据进行同步,这样会导致集群时刻处于从磁盘读取数据的状态,disk/net/cpu负载都会比较高
扩缩容期间无法执行其他操作,在一次扩缩容操作结束之前,无法进行其他运维操作
依赖zookeeper存在问题
使用KRaft作为元数据和数据存储介质
process.roles = broker
:服务器在KRaft模式下充当Brokerprocess.roles = controller
:服务器在KRaft模式下充当Controllerprocess.roles = broker,controller
:服务器在KRaft模式下充当Broker和Controllerprocess.roles = null
:集群假定是运行在ZooKeeper模式下连接集群的两种方式
Pulsar Client -> Broker
Pulsar Client -> Proxy
作用及应用场景
Pulsar broker无状态组件,负责运行两个模块
Pulsar broker作为数据层代理
Pulsar数据存储Segment在不同存储中的抽象
定义好抽象后,即可实现多介质存储
L1(缓存)
L2(Bookkeeper)
L3(S3等冷存)
Ledger:BK的一个基本存储单元,BK Client的读写操作都是以Ledger为粒度的
Fragment:BK的最小分布单元,物理最小存储单元,也是Ledger的储存单位,默认情况下一个Ledger会对应一个Fragment,也可以对应多个
Entry:每条日志都是一个Entry,代表一个record,每条record都会有一个对应的Entry id
核心概念
Ensemble Size(E):一个Ledger所涉及的Bookie集合
Write Quorum Size(Qw):副本数
Ack Quorum Size(Qa):写请求成功需要满足的副本数
所有的reader都可以安全读取entry ID小于或者等于LAC的记录,从而保证reader不会读取未确认的数据,从而保证了reader之间的一致性
写入优化
读取优化
Topic-Partition
可以发现,partition<->broker之间只是映射关系,broker在扩缩容过程中只需要更改映射
exclusive:独占订阅(stream模式):独占订阅中,在任何时间,一个消费者组(订阅)中有且只有一个消费者来消费topic中的消息
failover故障切换(stream流模式):使用故障切换订阅,多个消费者可以附加到同一订阅。但是,一个订阅中所有的消费者,只会有一个消费者被选为该订阅的主消费者。其他消费者将被指定为故障转移消费者。
shared共享订阅(queue队列模型):使用共享订阅,在同一个订阅背后,用户按照应用的需求挂载任意多的消费者。订阅中的所有消息以循环分发形式发送给订阅背后的多个消费者,并且一个消息仅传递给一个消费者。
key_shared按key共享订阅(queue队列模型):使用共享订阅,在同一个订阅背后,用户按照应用的需求挂载任意多的消费者。订阅中的所有消息以key-hash发送给订阅背后的多个消费者,并且一个消息仅传递给一个消费者。
Pulsar多租户体现在url中,使用多级映射做资源管理。
Pulsar Plugin支持无缝迁移,支持多种协议
当前支持Plugin的类型:KOP(Kafka on Pulsar) 、ROP(RocketMQ on Pulsar) 、AOP(AMQP on Pulsar) 、Mop(MQTT on Pulsar)
实现plugin需要支持的功能:路由查询、Message Protocol、Offset & Msgld
支持数据容灾能力
多层架构,状态分离之后的优势
存储计算分离之后带来的优劣势,在计算层上,对于写入的数据,可以做预处理,简单ETL。可以做数据缓存,应对高扇出度场景。无状态、扩缩容之后,能快速完成负载均衡balance。在存储层上,按照数据冷热进行存储介质区分,降低成本;历史数据可海量保存,数据无价;可直接通过存储层接口读取数据,批式计算。