两张图读懂kafka应用
假设N副本全挂了,node恢复后会面临同步数据的过程,这期间ISR中没有node,会导致该分区服务不可用。kafka采用一种降级措施来处理:选举第一个恢复的node作为leader提供服务,以它的数据为基准,这个措施被称为脏leader选举。由于leader是主要提供服务的,kafka broker将多个partition的leader均分在不同的server上以均摊风险。每个parition都有leader,如果在每个partition内运行选主进程,那么会导致产生非常多选主进程。kakfa采用一种轻量级的方式:从broker集群中选出一个作为controller,这个controller监控挂掉的broker,为上面的分区批量选主。 一致性 上面的方案保证了数据高可用,有时高可用是体现在对一致性的牺牲上。如果希望达到强一致性,可以采取如下措施: 禁用脏leader选举,ISR没有node时,宁可不提供服务也不要未完全同步的node。 设置最小ISR数量min_isr,保证消息至少要被min_isr个node确认才能提交。 持久化 基于以下几点事实,kafka重度依赖磁盘而非内存来存储消息。 硬盘便宜,内存贵 顺序读+预读取操作,能提高缓存命中率 操作系统利用富余的内存作为pagecache,配合预读取(read-ahead)+写回(write-back)技术,从cache读数据,写到cache就返回(操作系统后台flush),提高用户进程响应速度 java对象实际大小比理想大小要大,使得将消息存到内存成本很高 当堆内存占用不断增加时,gc抖动较大 基于文件顺序读写的设计思路,代码编写简单 在持久化数据结构的选择上,kafka采用了queue而不是Btree kafka只有简单的根据offset读和append操作,所以基于queue操作的时间复杂度为O(1),而基于Btree操作的时间复杂度为O(logN) 在大量文件读写的时候,基于queue的read和append只需要一次磁盘寻址,而Btree则会涉及多次。磁盘寻址过程极大降低了读写性能
(编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |