这是我参与「第四届青训营」笔记创作活动的第13天。
知识点小记
主流的消息队列
| RabbitMQ | RocketMQ | Kafka | Pulsar | ||
|---|---|---|---|---|---|
| 推出时间 | 2007 | 2012 | 2010 | 2016 | |
| 使用语言 | Erlang | Java | Scala/Java | Java | |
| 单机吞吐量 | 一般 | 较高 | 高 | 高 | |
| 延迟 | 低 | 低 | 一般 | 低 | |
| 可用性(分片) | 高(主从架构) | 高(主从架构) | 非常高(分布式) | 非常高() | 分布式 |
| 一致性 | 较高 | 高 | 高 | 高 | |
| 扩展性 | 较高 | 高 | 高 | 非常高 |
Kafka框架结构
zookeeper
存储元数据信息,Broker Meta信息、Controller信息、Topic信息、Config信息。
Broker
Broker:若干个Broker节点组成Kafka集群。Broker作为消息的接受模块,使用React网络模型进行消息数据的接收。Broker作为消息的持久化模块,进行消息的副本复制以及持久化。Broker作为高可用模块,通过副本间的Failover进行高可用保证。
Controller
选举:Broker启动会尝试去zookeeper中注册controller节点,注册上controller节点的Broker即为Controller。其余的Broker会watch controller节点,节点出现异常则进行重新注册。
作用:Broker重启或宕机时,负责副本的切换。Topic创建或删除时,负责Topic meta信息广播。集群扩缩容时们进行状态控制。
Kafka高可用
Kafka的高可用:提供ISR副本复制机制,提供热备功能。写入端提供ACK=1,0,-1三种情况的机制控制副本同步强弱。提供clean/unclean副本选举机制。
AR、OSR、OSR:
- AR(Assign Replica):已经分配的所有副本。
- OSR(Out Sync Replica):很久没有同步数据的副本
- ISR:一直都在同步数据的副本,可以作为热备份进行切换的副本。可以通过min.insync.replicas定义最少的isr数量。
ACK为1、0、-1三种情况:
- 为1:Leader副本写入成功,Producer就认为写入成功了。
- 为0:Producer发送数据后即默认写入成功。
- 为-1:ISR中的所有副本都写成功,Producer才认为写成功。
clean/unclean选举机制:
- clean:优先选取ISR中的副本作为leader,如果ISR中无可用副本,则该partition不可用。
- unclean:优先选取ISR中的副本作为leader,如果ISR中无可用副本,则选择其他的存活副本。
副本同步机制
参数:
- LEO:日志中最末尾的数据。
- HW:ISR中最小的LEO作为HW。
如下图中生产者没写入消息前HW和LEO均为3,在写入消息后,当Follower1完全cach-up而Follower2只复制了消息4,此时三个ISR共同复制成功到了消息4,所以此时LEO为5,HW为4。
Kafka集群扩缩容
扩缩容的目标为:partition在各个partition之间分布均匀,同一个partition的replica不会分布在同一台broker,broker之间的replica的数量是均匀的。
Kafka集群扩缩容步骤
扩容:
- 扩容Broker节点:Leader副本写入成功,Producer即认为写成功。
- 计算均衡的Replica分布拓扑。
- Controller负责将新的副本分布元数据(leader/follower信息)广播给broker。
- Broker负责将新副本的数据同步。
缩容:将扩容的步骤改为2、3、4、1。其中1为下线缩容的broker节点。
Pulsar架构
Pulsar Broker
- Pulasar Broker无状态组件,负责运行两个模块
- Hrrp服务器:暴露result接口,提供生产者和消费者topic查找api
- 调度分发器:异步的tcp服务器,通过自定义二进制协议进行数据传输
- Pulasar Broker作为数据层代理
- Bookie通讯:作为Ledger代理如则和Bookie进行通讯
- 流量代理:消息写入Ledger存储到Bookie,消息缓存在堆外,负责快速响应
Pulsar Storage
- Pulsar数据存储Segment在不同存储中抽象,定义好抽象后,可实现多个介质存储,例如:GFS、S3、Bookie等
- Pulsar采用不同级别的存储方式:L1、L2、L3。
-
L1(缓存):Borker使用堆外内存暂存存储信息
-
L2(Boolleeper):使用Qurom写,能有效降低长尾
-
L3(S3等冷存):存储成本低、扩展性好
-
Pulsar生产模式
- Shared:多个Producer可以同时往一个Topic中生产消息
- Exclusive:只有一个Producer可以connect并生产消息,其他Producer可以启动成功,作为Stand-by
- ExclusiveWithFencing:只有一个Producer可以connect并生产消息,其他Producer启东时,老的Producer会断开连接。
- WaitForExclusive:只要一个Producer可以connect并生产消息,其他Producer会卡在创建Producer环节。
Pulsar消费模式
- Exclusive(独占订阅):在任何时间,一个消费者组中有且只有一个消费者来消费Topic中的消息。
- Failover(故障切换):多个消费者可以附加到同一订阅,但是,一个订阅中的所有消费者,只会有一个消费者被选为该订阅的主消费者。其他消费者将被指定为故障转移消费者。
- Shared(共享订阅):在同一个订阅背后,用户按照应用的需求挂载任意多的消费者。订阅中的所有消息以循环分发形式发送给订阅背后的多个消费者,并且一个消息jin仅传递给一个消费者。
- Key_Shared(按key共享订阅):在同一个订阅背后,用户按照应用的需求挂载任意多的消费者。订阅中的所有消息以key-hash发送给订阅背后的多个消费者,并且一个消息仅传递给一个消费者。