kafaka有几个参数来保证数据在异常情况下不丢失。一直以来都没有搞的太清楚,后来又一次看了官方的文档,然后理解了,但不知昨天又想这个事情的时候,发现又模糊了。所以还是写下来,以来加深理解,而来做个思维备份吧。(说到思维备份,突然想到了黑镜里面的意识副本,什么时候我们的现实生活中也能有一种工具,可以把这个时候的想法瞬间保存起来,这貌似就不用我手动备份了。不过这种东西要是真实现了,貌似也很恐怖,呵呵)
kafka 的partition通过增加副本机器来防止宕机造成的数据丢失。partition中有leader角色 和 副本角色。leader负责处理producer 和 consume的请求,而副本机器只负责sync leader收到的消息。
按照正常的思维,当producer发消息给leader后,leader需要复制给其他副本,如果复制成功,那么数据就可以在至少一台机器不宕机的情况下,保证数据的不丢失。
但是有没有想过,不管是leader 还是 副本机器,他们都是将消息写log的,也就是已经持久化了,那么宕机了,按说也不会丢失啊。那是因为根本没有持久化。kafka的broker收到消息后,确实写的log,但是只是写到了page cache中,并没有刷到磁盘上。刷磁盘的动作是一个批处理的策略,会通过消息量,间隔时间来定期定量来刷,所以如果在刷之前宕机了(物理机宕机,进程挂掉其实并不会导致未刷到磁盘的数据丢失),消息就有可能宕机。其实就是每次broker收到了消息,然后立马将消息刷的磁盘(通过系统调用sync,来强制刷磁盘),这也不能保证数据不会丢