简单图示:
Kafka本身可以作为集群,因为它就是一个分布式消息队列。但是kafka没有类似Hadoop的nodemanager管理datanode、resourcesmanager管理nodemanager的机制,它不能管理自己,所以需要借用zookeeper来管理资源。
Zookeeper是主从复制的,有一个leader,其他都是follower。Leader虽然是领导者,但是实际上所有数据和follower是一样的,是同步数据的,不过客户端的写操作只通过leader进行。
那么外部的请求怎么实现?大致有三步:
第一步为外部请求首先到zookeeper上的(因为数据同步,到哪一个服务器都可以,不需要是leader)。第二步通过zookeeper的元数据可以找到集群内部的服务器的api接口访问,将这个结果返回到外部请求。第三步是外部请求再带着api信息就能准确的找到对应的kafka服务器并发生请求。
需要注意的是这个过程外部请求并不直接通过Zookeeper来路由到Kafka服务器。