Kafka 中的数据不丢失机制及 CAP 理论详解
1. 生产者生产数据不丢失
发送消息方式
生产者发送给 kafka 数据,可以采用同步方式或异步方式
同步方式:
发送一批数据给 kafka 后,等待 kafka 返回结果:
生产者等待 10s,如果 broker 没有给出 ack 响应,就认为失败。
生产者重试 3 次,如果还没有响应,就报错.
异步方式:
发送一批数据给 kafka,只是提供一个回调函数:
先将数据保存在生产者端的 buffer 中。buffer 大小是 2 万条 。
满足数据阈值或者数量阈值其中的一个条件就可以发送数据。
发送一批数据的大小是 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 理论下,更多的是需要在可用性和一致性之间做权衡。
2. Partition tolerance
先看 Partition tolerance,中文叫做"分区容错"。
大多数分布式系统都分布在多个子网络。每个子网络就叫做一个区(partition)。分区容错的意思是,区间通信可能失败。比如,一台服务器放在中国,另一台服务器放在美国,这就是两个区,它们之间可能无法通信。
上图中,G1 和 G2 是两台跨区的服务器。G1 向 G2 发送一条消息,G2 可能无法收到。系统设计的时候,必须考虑到这种情况。
一般来说,分区容错无法避免,因此可以认为 CAP 的 P 总是存在的。即永远可能存在分区容错这个问题
3. Consistency
Consistency 中文叫做"一致性"。意思是,写操作之后的读操作,必须返回该值。举例来说,某条记录是 v0,用户向 G1 发起一个写操作,将其改为 v1。
接下来,用户的读操作就会得到 v1。这就叫一致性。
问题是,用户有可能向 G2 发起读操作,由于 G2 的值没有发生变化,因此返回的是 v0。G1 和 G2 读操作的结果不一致,这就不满足一致性了。
为了让 G2 也能变为 v1,就要在 G1 写操作的时候,让 G1 向 G2 发送一条消息,要求 G2 也改成 v1。
这样的话,用户向 G2 发起读操作,也能得到 v1。
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 确认,才发送下一条数据。
猜你喜欢:
版权声明: 本文为 InfoQ 作者【五分钟学大数据】的原创文章。
原文链接:【http://xie.infoq.cn/article/39da714394fb3b4706d02afa3】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论