【Kafka】Kafka核心架构、备份机制汇总

kafka是一款基于发布与订阅的消息系统。它一般被称为“分布式提交日志”或者“分布式流平台”。文件系统或者数据库提交日志用来提供所有事物的持久化记录,通过重建这些日志可以重建系统的状态。同样地,kafka的数据是按照一定顺序持久化保存的,可以按需读取。

  • 1、kafka拓扑结构

  • 2、Kafka的特点

  1. 同时为分布和订阅提供高吞吐量。据了解,Kafka每秒可以生产约25万条消息(50MB),每秒处理55万条消息(110MB)这里说条数,可能不上特别准确,因为消息的大小可能不一致;
  2. 可进行持久化操作,将消息持久化到到磁盘,以日志的形式存储,因此可用于批量消费,例如ETL,以及实时应用程序。 通过将数据持久化到硬盘以及replication防止数据丢失。
  3. 分布式系统,易于向外拓展。所有的Producer、broker和consumer都会有多个,均为分布式。无需停机即可拓展机器。
  4. 消息被处理的状态是在consumer端维护,而不是由server端维护,当失败时能自动平衡。
  5. 支持Online和offline的场景。
  • 3、Kafka的核心概念

名词 解释
Producer 消息的生成者
Consumer 消息的消费者
ConsumerGroup 消费者组,可以并行消费Topic中的partition的消息
Broker 缓存代理,Kafka集群中的一台或多台服务器统称broker.
Topic Kafka处理资源的消息源(feeds of messages)的不同分类
Partition Topic物理上的分组,一个topic可以分为多个partion,每个partion是一个有序的队列。partion中每条消息都会被分 配一个 有序的Id(offset)
Message 消息,是通信的基本单位,每个producer可以向一个topic(主题)发布一些消息
Producers 消息和数据生成者,向Kafka的一个topic发布消息的 过程叫做producers
Consumers 消息和数据的消费者,订阅topic并处理其发布的消费过程叫做consumers
  • 3.1 Producers的概念

  1. 消息和数据生成者,向Kafka的一个topic发布消息的过程叫做producers
  2. Producer将消息发布到指定的Topic中,同时Producer也能决定将此消息归属于哪个partition;比如基于round-robin方式 或者通过其他的一些算法等;
  3. 异步发送批量发送可以很有效的提高发送效率。kafka producer的异步发送模式允许进行批量发送,先将消息缓存到内存中,然后一次请求批量发送出去。
  • 3.2 broker的概念:

  1. Broker没有副本机制,一旦broker宕机,该broker的消息将都不可用。
  2. Broker不保存订阅者的状态,由订阅者自己保存。
  3. 无状态导致消息的删除成为难题(可能删除的消息正在被订阅),Kafka采用基于时间的SLA(服务保证),消息保存一定时间(通常7天)后会删除。
  4. 消费订阅者可以rewind back到任意位置重新进行消费,当订阅者故障时,可以选择最小的offset(id)进行重新读取消费消息
  • 3.3 Message组成

  1. Message消息:是通信的基本单位,每个producer可以向一个topic发布消息。
  2. Kafka中的Message是以topic为基本单位组织的,不同的topic之间是相互独立的,每个topic又可以分成不同的partition每个partition储存一部分
  3. partion中的每条Message包含以下三个属性:
offset long
MessageSize int32
data messages的具体内容
  • 3.4 Consumers的概念

消息和数据消费者,订阅topic并处理其发布的消息的过程叫做consumers.
在kafka中,我们可以认为一个group是一个“订阅者”,一个topic中的每个partions只会被一个“订阅者”中的一个consumer
消费,不过一个consumer可以消费多个partitions中的消息
注:
Kafka的设计原理决定,对于一个topic,同一个group不能多于partition个数的consumer同时消费,否则将意味着某些 consumer无法得到消息

kafka的备份策略

Kafka的备份的单元是partition,也就是每个partition都都会有leader partiton和follow partiton。其中leader partition是用来进行和producer进行写交互,follow从leader副本进行拉数据进行同步,从而保证数据的冗余,防止数据丢失的目的。
如图:
这里写图片描述

follow副本是如何实现和leader副本进行数据同步的

首先我们了解下一些必要的专有名词:

  • ISR集合:ISR(In-Sync Replica)集合代表的是follow副本和leader副本消息相差不多的副本的集合。消息相差不到是一个比较模糊的概念。其实follow副本需要满足以下两个条件:
    1:follow副本必须和zookeeper保持连接。
    2:follow副本的最后的offset和leader中最新的数据之间的大小不能超过阈值。(也就是每个follow不能和leader副本消息相差太多)。
    Note:由于网络原因和宕机等原因免不了试follow副本会不能满足其中以上的条件(我理解的为任意一个条件),那么该follow副本将会被T出ISR集合中。举例:如果follow副本不满足上面条件2,此刻会被T出ISR集合,但是这个follow副本依然会进行数据的拉取,并且进行追赶,如果最新的offset和leader副本之间的数据量小于了阈值,那么该follow副本会从新加入到ISR集合中。
  • HW(HighWaterMark)顾名思义是一个标记。是用来标记当follow副本从leader副本中拉取消息并且同步到自身后,然后做在leader副本上做个HW来表明,此前的所有消息都在follow的副本上commit了。
  • LEO(Log End Offset)简单粗暴的理解就是记录leader副本中最新的offset的位置,然后记录在自己的log日志里。
    让我们通过图例来看下follow副本是如何进行复制数据的:
    这里写图片描述

follow的同步和异步复制数据

同步复制:就是所有的follow副本都进行进行同步数据后才进行HW。这样就导致如果其中的一个follow副本不管因为网络还是其他原因导致的迟迟不能同步数据成功的话。那么HW永远也不会进行,这样直接导致follow副本复制不可用。
异步复制:异步复制避免了同步复制的缺点,但是不保证从leader副本拉取数据都同步到follow副本中。如图:
这里写图片描述
kafka采取同步和异步的共同优点,所以使用ISR的方法。把Follow中同步慢的数据进行T除,从而保证了复制数据的速度。一句话总结就是用同步的方法,如果其中有同步数据慢的follow的情况,直接把该follow给T除。如果leader副本宕机,那么从ISR中选举出来新的leader副本。因为follow副本中都有记录HW。这样也会减少数据的丢失。Follow副本能够从leader中批量的读取数据并批量写入,从而减少了I/0的开销。

发布了109 篇原创文章 · 获赞 125 · 访问量 6291

猜你喜欢

转载自blog.csdn.net/beautiful_huang/article/details/104497133