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

156 阅读5分钟

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

知识点小记

主流的消息队列

RabbitMQRocketMQKafkaPulsar
推出时间2007201220102016
使用语言ErlangJavaScala/JavaJava
单机吞吐量一般较高
延迟一般
可用性(分片)高(主从架构)高(主从架构)非常高(分布式)非常高()分布式
一致性较高
扩展性较高非常高

Kafka框架结构

1.png

zookeeper

存储元数据信息,Broker Meta信息、Controller信息、Topic信息、Config信息。

Broker

2.png 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。 3.png

Kafka集群扩缩容

扩缩容的目标为:partition在各个partition之间分布均匀,同一个partition的replica不会分布在同一台broker,broker之间的replica的数量是均匀的。

Kafka集群扩缩容步骤

扩容:

  1. 扩容Broker节点:Leader副本写入成功,Producer即认为写成功。
  2. 计算均衡的Replica分布拓扑。
  3. Controller负责将新的副本分布元数据(leader/follower信息)广播给broker。
  4. Broker负责将新副本的数据同步。

缩容:将扩容的步骤改为2、3、4、1。其中1为下线缩容的broker节点。

Pulsar架构

4.png

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发送给订阅背后的多个消费者,并且一个消息仅传递给一个消费者。