[size=large][color=red][b]Kafka的Leader是什么[/b][/color][/size]
首先Kafka会将接收到的消息分区(partition),[b]每个主题(topic)的消息有不同的分区。[/b]这样一方面消息的存储就不会受到单一服务器存储空间大小的限制,另一方面消息的处理也可以在多个服务器上并行。
其次为了保证高可用,[color=red][b]每个分区都会有一定数量的副本(replica)。[/b][/color]这样如果有部分服务器不可用,副本所在的服务器就会接替上来,保证应用的持续性。
[img]http://dl2.iteye.com/upload/attachment/0124/6625/0986f57d-f7d1-3d73-a36f-63694646c7da.png[/img]
但是,为了保证较高的处理效率,消息的读写都是在固定的一个副本上完成。[size=medium][color=red][b]这个副本就是所谓的Leader,而其他副本则是Follower。[/b][/color][/size]而Follower则会定期地到Leader上同步数据。
[size=large][color=red][b]Leader选举[/b][/color][/size]
如果某个分区所在的服务器除了问题,不可用,kafka会从该分区的其他的副本中选择一个作为新的Leader。之后所有的读写就会转移到这个新的Leader上。现在的问题是应当选择哪个作为新的Leader。[color=blue][size=medium][b]显然,只有那些跟Leader保持同步的Follower才应该被选作新的Leader。[/b][/size][/color]
Kafka会在Zookeeper上针对每个Topic维护一个称为ISR(in-sync replica,已同步的副本)的集合,该集合中是一些分区的副本。只有当这些副本都跟Leader中的副本同步了之后,kafka才会认为消息已提交,并反馈给消息的生产者。如果这个集合有增减,kafka会更新zookeeper上的记录。
[color=red][b]如果某个分区的Leader不可用,Kafka就会从ISR集合中选择一个副本作为新的Leader。[/b][/color]
显然通过ISR,kafka需要的冗余度较低,可以容忍的失败数比较高。假设某个topic有f+1个副本,kafka可以容忍f个服务器不可用。
[size=large][color=red][b]为什么不用少数服从多数的方法[/b][/color][/size]
少数服从多数是一种比较常见的一致性算法和Leader选举法。它的含义是只有超过半数的副本同步了,系统才会认为数据已同步;选择Leader时也是从超过半数的同步的副本中选择。这种算法需要较高的冗余度。譬如只允许一台机器失败,需要有三个副本;而如果只容忍两台机器失败,则需要五个副本。[b]而kafka的ISR集合方法,分别只需要两个和三个副本。[/b]
[size=large][color=red][b]如果所有的ISR副本都失败了怎么办[/b][/color][/size]
此时有两种方法可选,一种是等待ISR集合中的副本复活,一种是选择任何一个立即可用的副本,而这个副本不一定是在ISR集合中。[b]这两种方法各有利弊,实际生产中按需选择。
如果要等待ISR副本复活,虽然可以保证一致性,但可能需要很长时间。而如果选择立即可用的副本,则很可能该副本并不一致。[/b]
首先Kafka会将接收到的消息分区(partition),[b]每个主题(topic)的消息有不同的分区。[/b]这样一方面消息的存储就不会受到单一服务器存储空间大小的限制,另一方面消息的处理也可以在多个服务器上并行。
其次为了保证高可用,[color=red][b]每个分区都会有一定数量的副本(replica)。[/b][/color]这样如果有部分服务器不可用,副本所在的服务器就会接替上来,保证应用的持续性。
[img]http://dl2.iteye.com/upload/attachment/0124/6625/0986f57d-f7d1-3d73-a36f-63694646c7da.png[/img]
但是,为了保证较高的处理效率,消息的读写都是在固定的一个副本上完成。[size=medium][color=red][b]这个副本就是所谓的Leader,而其他副本则是Follower。[/b][/color][/size]而Follower则会定期地到Leader上同步数据。
[size=large][color=red][b]Leader选举[/b][/color][/size]
如果某个分区所在的服务器除了问题,不可用,kafka会从该分区的其他的副本中选择一个作为新的Leader。之后所有的读写就会转移到这个新的Leader上。现在的问题是应当选择哪个作为新的Leader。[color=blue][size=medium][b]显然,只有那些跟Leader保持同步的Follower才应该被选作新的Leader。[/b][/size][/color]
Kafka会在Zookeeper上针对每个Topic维护一个称为ISR(in-sync replica,已同步的副本)的集合,该集合中是一些分区的副本。只有当这些副本都跟Leader中的副本同步了之后,kafka才会认为消息已提交,并反馈给消息的生产者。如果这个集合有增减,kafka会更新zookeeper上的记录。
[color=red][b]如果某个分区的Leader不可用,Kafka就会从ISR集合中选择一个副本作为新的Leader。[/b][/color]
显然通过ISR,kafka需要的冗余度较低,可以容忍的失败数比较高。假设某个topic有f+1个副本,kafka可以容忍f个服务器不可用。
[size=large][color=red][b]为什么不用少数服从多数的方法[/b][/color][/size]
少数服从多数是一种比较常见的一致性算法和Leader选举法。它的含义是只有超过半数的副本同步了,系统才会认为数据已同步;选择Leader时也是从超过半数的同步的副本中选择。这种算法需要较高的冗余度。譬如只允许一台机器失败,需要有三个副本;而如果只容忍两台机器失败,则需要五个副本。[b]而kafka的ISR集合方法,分别只需要两个和三个副本。[/b]
[size=large][color=red][b]如果所有的ISR副本都失败了怎么办[/b][/color][/size]
此时有两种方法可选,一种是等待ISR集合中的副本复活,一种是选择任何一个立即可用的副本,而这个副本不一定是在ISR集合中。[b]这两种方法各有利弊,实际生产中按需选择。
如果要等待ISR副本复活,虽然可以保证一致性,但可能需要很长时间。而如果选择立即可用的副本,则很可能该副本并不一致。[/b]