研磨消息中间件Kafka之高可用相关机制
之前的文章中我们了解了Kafka的消息持久化及副本相关的策略,本文我们学习一下Kafka在高可用方面实现的技术方案。
Kafka在高可用方面主要包含如下的机制:
- 负载均衡与故障转移
- 伸缩性
我们对这两方面做详细的讲解。
负载均衡与故障转移
首先谈谈Kafka负载均衡的实现机理。
Kafka集群在默认情况相爱,每台服务器都有均等的机会为客户端提供服务,能够将负载分散在集群中的所有机器上,避免了某个节点资源被耗尽的情况出现。
Kafka实现负载均衡本质上是通过分区leader选举实现的,Kafka实现了一套智能的leader选举算法,可以保证集群内所有的机器都能以均等的机会分散各个分区(Partition)的leader,在整体上实现了负载均衡。
接着讨论一下负载均衡的实现。
故障转移,顾名思义,就是在服务器出现故障的时候,集群能够高效的检测到该failure,并立刻将该服务器上的服务自动转移到其他正常的服务节点上。
一般情况下,故障转移是通过“心跳”或者“会话”机制来实现的,也就是当主服务器与备份服务器之间的心跳无法维持或者主服务器注册到服务中心的会话超时过期了,我们就认为主服务器此时已经down掉,集群需要自动的启动某个备份服务器替代down机的主服务器提供服务。
对Kafka而言,故障转移采用的机制是会话机制。
每一个Kafka服务器启动后都会用会话将自己注册到zookeeper上,当它出现故障,与zk之间的会话维持不了导致超时,则Kafka集群会再选取另外一台服务器代替该服务器继续提供服务。
伸缩性
如果服务需要具备伸缩性,那很大程度上表明该服务本身是无状态的,而Kafka服务器正是利用了无状态的思想,将状态的保存与管理交给分布式协调服务zookeeper来做,服务器本身便不需要做复杂的状态保持,降低了维护的复杂度。
因为服务本身无状态,因此可以通过增减节点达到集群的扩缩容。
当然Kafka本身并不是什么状态都不保持,它也保留了一部分必要的内部状态。