Kafka的高可用源于其多个副本(replication)。
拥有多个副本,那么带来的问题就是数据怎么同步。我们都知道数据是存放在partition物理目录下的文件里面。通过前面几节的介绍,我们也知道消息过来后直接跟partition leader交互,然后由leader进行数据同步。由于partition 的replication机制,在kafka看来partition不分leader 和 follower之分的,都是replica。
同一个partition可能会有多个replica,此时需要在这些replica之间选出一个leader,producer和Consumer只与leader交互,其它replica作为follower从leader中复制数据。
图片来源自网络
一个topic下可能会有多个partition,同一个partition又可能有多个replica,那它们是怎么分配的,不可能无秩序的。
为了更好的做负载均衡,Kafka尽量将所有的Partition均匀分配到整个集群上。Kafka分配Replica的算法如下:
· 将所有存活的N个Brokers和待分配的Partition排序
· 将第i个Partition分配到第(i mod n)个Broker上,这个Partition的第一个Replica存在于这个分配的Broker上,并且会作为partition的优先副本
· 将第i个Partition的第j个Replica分配