
92
|
第
6
章
须让两个不可用分区中的一个重新变为可用的(比如重启
broker
),并等待它变为同步的。
6.4
在可靠的系统里使用生产者
即使我们尽可能把
broker
配置得很可靠,但如果没有对生产者进行可靠性方面的配置,整
个系统仍然有可能出现突发性的数据丢失。
请看以下两个例子。
•
为
broker
配置了
3
个副本,并且禁用了不完全首领选举,这样应该可以保证万无一失。
我们把生产者发送消息的 acks 设为 1(只要首领接收到消息就可以认为消息写入成功)。
生产者发送一个消息给首领,首领成功写入,但跟随者副本还没有接收到这个消息。首
领向生产者发送了一个响应,告诉它“消息写入成功”,然后它崩溃了,而此时消息还
没有被其他副本复制过去。另外两个副本此时仍然被认为是同步的(毕竟判定一个副本
不同步需要一小段时间),而且其中的一个副本成了新的首领。因为消息还没有被写入
这个副本,所以就丢失了,但发送消息的客户端却认为消息已成功写入。因为消费者看
不到丢失的消息,所以此时的系统仍然是一致的(因为副本没有收到这个消息,所以消
息不算已提交),但从生产者角度来看,它丢失了一个消息。
•
为
broker
配置了
3
个副本,并且禁用了不完全首领选举。我们接受了之前的教训,把
生产者的 acks 设为 all。假设现在往
Kafka
发送消息,分区的首领刚好崩溃,新的首领
正在选举当中,
Kafka
会向生产者返回“首领不可用”的响应。在这个时候,如果生产
者没能正确处理这个错误,也没有重试发送消息直到发送成功,那么消息也有可能丢失。
这算不上是 ...