Kafka架构设计:
一个topic分多个partition,多个partition可能存在于多个broker(计算机节点上),每个partition又分主从(leader+follower)
(1)对于生产者丢失数据:
(1)配置多个副本,保证数据的完整性。
leader 接收到消息,所有的 follower 都同步到了消息之后,才认为本次写成功了。如果没满足这个条件,生产者会自动不断的重试,所以在生产者方面消息可靠性较高,通过follower的消息一致性保证了写入成功性。通过 replica机制保证数据不丢,代价就是需要更多资源,尤其是磁盘资源,kafka 当前支持 GZip 和 Snappy压缩,来缓解这个问题 是否使用 replica 取决于在可靠性和资源代价之间的 balance。
(2)合理设置flush间隔。
kafka 的数据一开始就是存储在 PageCache 上的,定期 flush 到磁盘上的,也就是说,不是每个消息都被存储在磁盘了,如果出现断电或者机器故障等,PageCache 上的数据就丢。可以通过 log.flush.interval.messages 和 log.flush.interval.ms 来配置 flush 间隔,interval大,丢的数据多些,但小会影响性能。
(2)对于Kafka丢失数据:
Kafka 某个 broker 宕机,然后重新选举 partition 的 leader。若此时其他的 follower 刚好还有些数据没有同步,结果此时 leader 挂了,然后选举某个 follower 成 leader 之后,不就少了一些数据?
所以此时一般是要求起码设置如下 4 个参数:
(1)给 topic 设置 replication.factor