组件
zookeepers(负责选举,均衡,meta记录,消费记录)
zookeeper在集群中与broker和consumer进行交互,维护数据和集群高可用。
- 记录consumer消费message的位置信息;
- partitions故障时进行Leader Election
- kafka的meta信息在zookeeper如何存储
kafka在zookeeper的结构图如下:
搭建一套测试集群,共三个节点,每个节点上面都有procuder/broker/consumer角色。没有WebUI页面,架构如下:

在系统架构中,将消息系统独立可起到架构解耦、易扩展、灵活性强、可恢复、数据冗余、异步通讯等优点。
kafka是分布式消息系统软件,实现了消息发布/订阅功能。还有一些其他的消息队列软件,比如RabbitMQ、Redis、ZeroMQ、ActiveMQ、RocketMQ等。这些消息系统各有优缺点。
kafka的优点如下:
producers是消息来源,提供消息写入接口,与zookeeper来实现数据的写入均衡。具体的写入过程见。
与producers有关的内容有:
producers和borders的数据写入方式是push。
consumers是消息系统的流出接口,多个consumers逻辑上组成consumer Group。CG的目标是实现同一需求的消费吞吐量。
同一个topic的message,只能被同一CG的一个Consumer消费;但可以被不同多个CG消费;
比如上图中,一条message被CG中的的C161消费,或者被C163消费,但不能同时被C161和C163消费。因为同一CG在zk中维护共同维护对一个topic的消费pos。
与consumers相关的内容有:
brokers的物理结构

图片备注:
brokers的存储内容归纳如下:
需要了解
zookeepers(负责选举,均衡,meta记录,消费记录)
zookeeper在集群中与broker和consumer进行交互,维护数据和集群高可用。
kafka在zookeeper的结构图如下:

三级目录是一些组件:

borker数据存储目录:/borker/topics/[topic]/partitions/[partition]/state
state数据结构:
{"controller_epoch":5, ##表示kafka集群中的中央控制器选举次数
"leader":1, ##当前partition的leader所在的borker id
"version":1, ##版本编号默认为1
"leader_epoch":6, ##leader选举次数
"isr":[2,1,3] ##当前partition的In-sync replica,副本组的borker id列表
}
borker数据存储示例:
{"version":1,
"partitions":{
"45":[2,1,3],
"34":[3,2,1],
"12":[2,3,1],
"8":[1,2,3],
"19":[3,1,2],
"23":[1,3,2],
"4":[3,2,1],
"40":[3,2,1],
"15":[2,1,3],
"11":[1,3,2],
"9":[2,1,3],
"44":[1,2,3],
"33":[2,1,3],
"22":[3,2,1],
"26":[1,2,3],
"37":[3,1,2],
"13":[3,1,2],
"46":[3,2,1],
"24":[2,3,1],
"35":[1,3,2],
"16":[3,2,1],
"5":[1,3,2],
"10":[3,2,1],
"48":[2,3,1],
"21":[2,1,3],
"43":[3,1,2],
"32":[1,2,3],
"49":[3,1,2],
"6":[2,3,1],
"36":[2,3,1],
"1":[3,1,2],
"39":[2,1,3],
"17":[1,3,2],
"25":[3,1,2],
"14":[1,2,3],
"47":[1,3,2],
"31":[3,1,2],
"42":[2,3,1],
"0":[2,3,1],
"20":[1,2,3],
"27":[2,1,3],
"2":[1,2,3],
"38":[1,2,3],
"18":[2,3,1],
"30":[2,3,1],
"7":[3,1,2],
"29":[1,3,2],
"41":[1,3,2],
"3":[2,1,3],
"28":[3,2,1]
}
}
为避免broker挂后造成数据丢失,kafka实现了高可用方式。
在“brokers的物理结构”中,replication有多个follewers,分散于不同的brokers。通过增量日志实现。

partition的log记录是顺序的,通过server.properties中log.retention.hours参数定义日志保留时长,过期则删除。新写入的message append记录在partition中。
为提升效率,
ISR是In-Sync Replicate 记录与Leader保持同步的列表。
判断Replica活着,(1)与zk有心跳通讯;(2)与Leader通讯及时。两者有一不满足,fellower都会从ISR中移除。
一般的leader选举算法,有Majority Vote/Zab/Raft/PacificA。kafka采用的即PacificA,kafka维护多个ISR,但不不像Majorty Vote算法,限制最少的2N+1节点和N+1以上投票。
即使只有1个follewer,也可完成Leader选举。

原文:http://www.cnblogs.com/wyett/p/7464119.html