一.kafka如何确保高可用(High Availability):
Kafka在0.8版本之前是没有HA机制来确保高可用的,当某一个broker挂掉,partition就挂了。即存在单点故障。0.8之后提供了副本机制,副本机制会将 一个broker下某个topic的一个partition放入到另外一个broker里,这个备份的分区和原分区都叫做副本(replica)。在所有的副本里,只能有一个leader,其余的副本都作为follower,同一时间内只有leader负责读写,follower不起任何作用。这样做的原因是为了确保消费者单调读 且 确保能立即读取写入的信息(Read-your-writes)。其他所有的follower会异步的拉去leader消息,拉的快的会进入ISR里,拉的慢得超过replica.lag.time.max.ms 配置的超时值的,会被踢进OSR里,这个过程是动态的,如果一个follower开始没跟上leader的消息写入速度,被踢出了ISR,等到跟上后又会重新进入ISR。当leader挂掉之后,为了保证高可用性,从ISR中获取一个副本,升格为leader。如果ISR全挂了,有两种策略,一是等待ISR第一个恢复的副本,二是开启unclean从OSR中选择一个副本作为leader。为保证高可用 可以选择第二种牺牲一致性的方式。
二.kafka如何保证高性能:
1.分区:
kafka将topic分区,每一个broker里面会保存topic的不同分区,这样就可以让一个消费者组同时消费不同的分区,提高吞吐。一个消费组下只应有一个消费者去消费一个分区。理想情况下,一个消费者对应一个partition性能最佳。
2.页缓存:
kafka重度依赖页缓存技术,kafka只是将数据写入页缓存(内存)中而不直接操作磁盘,由操作系统决定什么时候把页缓存中数据刷到磁盘上。同时写入页缓存的数据是按照磁盘顺序去写入的,因此刷到磁盘上的速度也较快。当读操作发生时,先从页缓存中查询是否有所需信息,若没有才会调度磁盘。
3. Sendfile:
若页缓存中没有所需信息,需要去调度磁盘。原本网络io操作需要四个步骤 : 硬盘 -> 内核态 PageCache -> 用户态程序读取 -> 内核态socket写入 -> 拷贝至网卡。Sendfile优化后,使用零拷贝可以将buffer从内核态和用户态间任意切换。PageCache仅会传递一个文件描述符给socket,就等效于直接从PageCache中拷贝至网卡。少两步IO操作。
三.controller选举机制
Broker选举:第一个启动的broker会在zk中创建临时节点/controller,利用zk的强一致性,成为唯一的控制器节点,而其余的broker会监听该节点。随后由controller决定每个broker的master,每当broker挂掉,controller会检测其副本,重新决定出master。当控制器broker断开时,/controller临时节点会删除,其余连接的broker将收到事件通知,抢占式注册为新的controller
网友评论