1. 生产者生产数据不丢失

发送消息方式

生产者发送给kafka数据,可以采用同步方式异步方式

同步方式

发送一批数据给kafka后,等待kafka返回结果:

  1. 生产者等待10s,如果broker没有给出ack响应,就认为失败。
  2. 生产者重试3次,如果还没有响应,就报错.

异步方式

发送一批数据给kafka,只是提供一个回调函数:

  1. 先将数据保存在生产者端的buffer中。buffer大小是2万条 。
  2. 满足数据阈值或者数量阈值其中的一个条件就可以发送数据。
  3. 发送一批数据的大小是500条。

    注:如果broker迟迟不给ack,而buffer又满了,开发者可以设置是否直接清空buffer中的数据。

ack机制(确认机制)

生产者数据发送出去,需要服务端返回一个确认码,即ack响应码;ack的响应有三个状态值0,1,-1

0:生产者只负责发送数据,不关心数据是否丢失,丢失的数据,需要再次发送

1:partition的leader收到数据,不管follow是否同步完数据,响应的状态码为1

-1:所有的从节点都收到数据,响应的状态码为-1

如果broker端一直不返回ack状态,producer永远不知道是否成功;producer可以设置一个超时时间10s,超过时间认为失败。

2. broker中数据不丢失

在broker中,保证数据不丢失主要是通过副本因子(冗余),防止数据丢失。

3. 消费者消费数据不丢失

在消费者消费数据的时候,只要每个消费者记录好offset值即可,就能保证数据不丢失。也就是需要我们自己维护偏移量(offset),可保存在 Redis 中。

1. 分布式系统当中的CAP理论

分布式系统(distributed system)正变得越来越重要,大型网站几乎都是分布式的。

分布式系统的最大难点,就是各个节点的状态如何同步。

为了解决各个节点之间的状态同步问题,在1998年,由加州大学的计算机科学家 Eric Brewer 提出分布式系统的三个指标,分别是:

  • Consistency:一致性

  • Availability:可用性

  • Partition tolerance:分区容错性

Eric Brewer 说,这三个指标不可能同时做到。最多只能同时满足其中两个条件,这个结论就叫做 CAP 定理。

CAP理论是指:分布式系统中,一致性、可用性和分区容忍性最多只能同时满足两个

一致性:Consistency

  • 通过某个节点的写操作结果对后面通过其它节点的读操作可见
  • 如果更新数据后,并发访问情况下后续读操作可立即感知该更新,称为强一致性
  • 如果允许之后部分或者全部感知不到该更新,称为弱一致性
  • 若在之后的一段时间(通常该时间不固定)后,一定可以感知到该更新,称为最终一致性

可用性:Availability

  • 任何一个没有发生故障的节点必须在有限的时间内返回合理的结果

分区容错性:Partition tolerance

  • 部分节点宕机或者无法与其它节点通信时,各分区间还可保持分布式系统的功能

一般而言,都要求保证分区容忍性。所以在CAP理论下,更多的是需要在可用性和一致性之间做权衡。

#yyds干货盘点#Kafka中的数据不丢失机制及CAP理论详解

2. Partition tolerance

先看 Partition tolerance,中文叫做"分区容错"。

大多数分布式系统都分布在多个子网络。每个子网络就叫做一个区(partition)。分区容错的意思是,区间通信可能失败。比如,一台服务器放在中国,另一台服务器放在美国,这就是两个区,它们之间可能无法通信。

#yyds干货盘点#Kafka中的数据不丢失机制及CAP理论详解

上图中,G1 和 G2 是两台跨区的服务器。G1 向 G2 发送一条消息,G2 可能无法收到。系统设计的时候,必须考虑到这种情况。

一般来说,分区容错无法避免,因此可以认为 CAP 的 P 总是存在的。即永远可能存在分区容错这个问题

3. Consistency

Consistency 中文叫做"一致性"。意思是,写操作之后的读操作,必须返回该值。举例来说,某条记录是 v0,用户向 G1 发起一个写操作,将其改为 v1。
#yyds干货盘点#Kafka中的数据不丢失机制及CAP理论详解
接下来,用户的读操作就会得到 v1。这就叫一致性。
#yyds干货盘点#Kafka中的数据不丢失机制及CAP理论详解
问题是,用户有可能向 G2 发起读操作,由于 G2 的值没有发生变化,因此返回的是 v0。G1 和 G2 读操作的结果不一致,这就不满足一致性了。

#yyds干货盘点#Kafka中的数据不丢失机制及CAP理论详解

为了让 G2 也能变为 v1,就要在 G1 写操作的时候,让 G1 向 G2 发送一条消息,要求 G2 也改成 v1。

#yyds干货盘点#Kafka中的数据不丢失机制及CAP理论详解

这样的话,用户向 G2 发起读操作,也能得到 v1。

#yyds干货盘点#Kafka中的数据不丢失机制及CAP理论详解

4. Availability

Availability 中文叫做"可用性",意思是只要收到用户的请求,服务器就必须给出回应。
用户可以选择向 G1 或 G2 发起读操作。不管是哪台服务器,只要收到请求,就必须告诉用户,到底是 v0 还是 v1,否则就不满足可用性。

九、Kafka中的CAP机制

kafka是一个分布式的消息队列系统,既然是一个分布式的系统,那么就一定满足CAP定律,那么在kafka当中是如何遵循CAP定律的呢?kafka满足CAP定律当中的哪两个呢?

kafka满足的是CAP定律当中的CA,其中Partition tolerance通过的是一定的机制尽量的保证分区容错性

其中C表示的是数据一致性。A表示数据可用性

kafka首先将数据写入到不同的分区里面去,每个分区又可能有好多个副本,数据首先写入到leader分区里面去,读写的操作都是与leader分区进行通信,保证了数据的一致性原则,也就是满足了Consistency原则。然后kafka通过分区副本机制,来保证了kafka当中数据的可用性。但是也存在另外一个问题,就是副本分区当中的数据与leader当中的数据存在差别的问题如何解决,这个就是Partition tolerance的问题。

kafka为了解决Partition tolerance的问题,使用了ISR的同步策略,来尽最大可能减少Partition tolerance的问题

每个leader会维护一个ISR(a set of in-sync replicas,基本同步)列表。

ISR列表主要的作用就是决定哪些副本分区是可用的,也就是说可以将leader分区里面的数据同步到副本分区里面去,决定一个副本分区是否可用的条件有两个:

  • replica.lag.time.max.ms=10000 副本分区与主分区心跳时间延迟

  • replica.lag.max.messages=4000 副本分区与主分区消息同步最大差

produce 请求被认为完成时的确认值:request.required.acks=0

  • ack=0:producer不等待broker同步完成的确认,继续发送下一条(批)信息。
  • ack=1(默认):producer要等待leader成功收到数据并得到确认,才发送下一条message。
  • ack=-1:producer得到follwer确认,才发送下一条数据。

参考文档:

  1. 美团数据平台及数仓建设实践,超十万字总结
  2. 上百本优质大数据书籍,附必读清单(大数据宝藏)
  3. 五万字 | 耗时一个月整理出这份Hadoop吐血宝典