这是我参与「第四届青训营」笔记创作活动的第12天
引言
1 消息队列概述
消息队列主要应用在:MQ消息通道、EventBridge事件总线、Data Platform流数据平台
MQ消息通道特点:异步解耦、削峰填谷、高可用、发布订阅
EventBridge数据总线组成:事件源(生产者)、事件集(规则路由)、事件目标(消费者)
DataPlatform流数据平台:
- 提供批/流数据处理能力
- 各类组件提供各类Connect
- 提供Streaming/Function能力
- 根据数据schema灵活的进行数据预处理
主流消息队列的相关介绍:
2 Kafka详解
2.1 Kafka架构介绍
Kafka存储数据:
- Broker Meta信息(临时节点)
- Controller信息(临时节点)
- Topic信息(持久节点)
- Config信息(持久节点)
Zookeeper介绍:选举机制采用Paxos机制,提供一致性写入(强一致性)读取(会话一致性),提供可用性(一半以上节点存活即可读写),提供功能(watch机制、持久/临时节点能力)。
Broker介绍(作用):
- 若干个 Broker节点组成 Kafka集群
- Broker作为消息的接收模块,使用React网络模型进行消息数据的接收
- Broker作为消息的持久化模块,进行消息的副本复制以及持久化
- Broker作为高可用模块,通过副本间的Failover进行高可用保证
Controller选举:
- Broker启动会尝试去zk中注册Controller节点
- 注册上Controller节点的broker即为Controller
- 其余Broker会watch controller节点,节点出现异常则进行重新注册
Controller作用:
- Broker重启/宕机时,负责副本的Failover切换
- Topic创建/删除时,负责Topic meta信息广播
- 集群扩缩容时,进行状态控制
- Partition/Replica状态机维护
Coordinator介绍:
- 负责topic-partition<-> consumer的负载均衡
- 根据不同的场景提供不同的分配策略
- Dynamic Membership Protocol
- Static Membership Protocol
- Incremental Cooperative Rebalance
2.2 Kafka高可用
副本同步机制:
- AR:Assign Replica,已经分配的所有副本
- OSR:out Sync Replica,很久没有同步数据的副本
- ISR:一直都在同步数据的副本,可以作为热备进行切换的副本,min.insync.replicas最少isr数量配置
写入Ack机制:
- Ack = 1:Leader副本写入成功,Producer即认为写成功
- Ack = 0:OneWay模式,Producer发送后即为成功
- Ack = -1:ISR 中所有副本都成功,Producer 才认为写成功
副本同步:
- LEO:Log End Offset,日志最末尾的数据
- HW:ISR最小的LEO作为HW,HW的消息为Consumer可见的消息
副本切换机制:
优先选取Isr中的副本作为leader,如果lsr中无可用副本,Clean选举(partition不可用)或Unclean选举(选择其他存活副本)
2.3 Kafka集群扩缩容
Kafka集群扩缩容之后的目标:Topic维度(partition在各个broker之间分布是均匀的,同一个partition的replica不会分布在一台broker)、Broker维度(Broker之间replica的数量是均匀的)。
集群扩容步骤:
1 扩容Broker节点:Leader副本写入成功,Producer即认为写成功
2 计算均衡的Replica分布拓扑:保证Topic的partition在broker间分布均匀·保证Broker 之间Replica分布均匀
3 Controller负责新的副本分布元数据广播:Controller 将新的leaderlfollower信息广播给broker
4 Broker负责新副本的数据同步:Broker上有需要同步数据的副本则进行数据同步
集群缩容步骤:
1 计算均衡的Replica分布拓扑:保证Topic的partition在 broker间分布均匀、保证Broker之间Replica分布均匀
2 Controller负责新的副本分布元数据广播:Controller将新的leader/follower信息广播给broker
3 Broker负责新副本的数据同步:Broker上有需要同步数据的副本则进行数据同步
4 下线缩容的 Broker节点:数据同步完毕之后下线缩容的Broker节点
集群扩缩容需要注意问题:扩缩容时间长、扩缩容期间集群不稳定和无法执行其他操作
2.4 Kafka未来演进之路
去除zookeeper依赖
使用KRaft作为元数据和数据存储介质
2.5 Kafka运维/调优经验介绍
集群参数配置:
zookeeper.session.timeout.ms = 30000
log.segment.bytes = 536870912
log.retention.hours = 36
log.retention.bytes = 274877906944
num.network.threads = 32
num.io.threads = 200
auto.create.topics.enable = false
auto.leader.rebalance.enable = false
unclean.leader.election.enable = false
advertised.listeners = SASL_PLAINTEXT://:,PLAINTEXT:/:
security.inter.broker.protocol = SASL_PLAINTEXT
扩缩容优化(为了Topic-Partition均匀分布在Broker间,Broker间的Replica是均匀的):
3 Pulsar详解
3.1 Pulsar架构介绍
Pulsar客户端连接集群的两种方式:Broker、Proxy
Proxy方式:
当外网访问内网时,部分场景无法知道Broker地址,如云环境或者Kubernetes环境。Proxy提供类似GateWay代理能力,解耦客户端和Broker,保障Broker安全。
Broker方式:
Pulsar Broker无状态组件,负责运行两个模块。Http服务器:暴露了restful接口,提供生产者和消费者topic查找api。调度分发器:异步的tcp服务器,通过自定义二进制协议进行数据传输。
Pulsar Broker作为数据层代理。Bookie通讯:作为Ledger代理负责和Bookie进行通讯。流量代理:消息写入Ledger存储到Bookie,消息缓存在堆外,负责快速响应。
Storage介绍:
Pulsar数据存储Segment在不同存储中的抽象如下。定义好抽象之后,即可实现多介质存储。
分布式Journal系统(Bookeeper)中为Journal/Ledger
分布式文件系统(GFS/HDFS)中为文件
普通磁盘中为文件
分布式 Blob存储中为Blob
分布式对象存储中为对象
- L1(缓存):Broker使用堆外内存短暂存储消息,适用于Tail-Read读场景
- L2(Bookkeeper):Bookkeeper使用Qurom写,能有效降低长尾,适用于Catch-Up 较短时间内的较热数据
- L3(S3等冷存):存储成本低,扩展性好,适用于Catch-Up长时间内的冷数据
3.2 Bookkeepr其他内容
BK组件:
Ledger是BK的一个基本存储单元。Fragment是BK的最小分布单元,也是Ledger的组成单位。Entry表示每条日志都是一个Entry。
生产模式:Shared、Exclusive、ExclusiveWVithFencing、WaitForExclusive
消费模式:Exclusive、Failover、Shared、Key_Shared
讲解了:集群HA & Scale-up、Pulsar vs Kafka
4 周边和生态
讲解:Pulsar IO、Kafka Schema、Pulsar SQL