就可靠性
而言,基本没有任何东西可以保证做到百分之百的可靠。只能是通过一些策略来最大程度的保证可靠性。
1.增大副本数
。副本数越多,越能够保证数据的可靠性。但是副本数越多也会引起磁盘,网络带宽的浪费,还有性能的下降。
所以,一般设置为3
即可满足大多数的场景对可靠性的要求,部分银行之类的可能会设置成5.
2.生产端对于一些由于网络故障等造成发送失败的可重试异常,可以通过设置重试次数(retries
)来增加可靠性。
3.生产者设置ack机制
,为-1
.但是也可能出现某个分区的数据的follower同步速度太慢都被踢出了ISR集合
,那么设置成-1和设置成1的效果其实一样了,因为这种情况只有Leader收到数据就可以,没有其他保证性了。可以通过min.issync.replicas
参数来进行配置,表示ISR
集合中的最小副本数,也就是说,必须保证ISR>1
的时候,ack机制
才会更可靠。默认是1.
4.正常情况下,通过sender线程
写入到页缓存后,会有操作系统进行刷盘任务,当然kafka
也可以配置同步刷盘的策略。
5.消费端尽量保证手动处理偏移量
。保证数据能成功消费,不会造成数据丢失的情况。
6.kafka producer .send(message,Callback)
可以通过回调函数,来处理发送失败的数据。
7.设置 unclean.leader.election.enable = false
。这是 Broker
端的参数,它控制的是哪些 Broker
有资格竞选分区的 Leader
。如果一个 Broker
落后原先的 Leader
太多,那么它一旦成为新的 Leader
,必然会造成消息的丢失。故一般都要将该参数设置成 false
,即不允许这种情况的发生。