kafka中有三个特别重要的概念:主题(topic)、分区(partition)和副本(replication)。
我们先来看kafka在创建时候的命令
bin/kafka-topics.sh --zookeeper node01:2181 --create --topic t_cdr --partitions 3 --replication-factor 3
从中可以看出创建需要指定四个参数:–zookeeper、 --topic、–partitions、–replication-factor。第一个为kafka所依赖的集群的管理者的地址,第二个为主题名称,第三个为主题分区的数量,第四个为分区的副本数,下面我主要谈一下后三者的相关知识点。
kafka的消息是以主题为单位进行分类的,生产者负责将消息发送到指定的主题(topic),而消费者则订阅主题消费数据。一个主题可以分为多个分区(partition),一个分区只属于一个主题。同一个主题下不同分区的消息是不一样的,分区在存储方面来讲可以看做成一个可追加的日志文件,消息分别被追加在日志文件的末尾,并却还会维护一个偏移量(offset)。偏移量在分区内是唯一的,kafka通过它来保证同一个分区内消息的顺序性。也就是说,kafka会保证同一个分区内的消息有序,但是不保证主题内的消息有序。
生产者生产的每一条消息,在被发送到broker之前,会先根据分区规则选择存储在那个分区。如果分区规则设置的合理,那么该主题下的所有消息都会被均匀的分布在各个分区中。如果该topic只有一个分区,那么就能保证这个topic所有消息的顺序性,但是这个文件所在的机器的I/O将会是这个主题的性能瓶颈。 而分区则解决了这个问题,但是却不能保证整个topic的顺序性。主题在创建的时候,可以通过指定 --partitions
参数来控制分区数量,当然,也可以在创建完后去修改分区的数量。
补充kafka的一个分区规则:kafka对每一条消息的key做一个hashcode运算,然后将得到的数值对分区数量进行模运算就得到了这条消息所在分区的数字。
kafka为了提升分区的容错性,加入了副本机制,通过--replication-factor
来指定每一个分区的副本数量。同一分区的几个副本之间保存的是相同的数据(同一时刻,副本之间可能因为没来得及复制,可能不一定完全相同),副本之间的关系是“一主多从”,其中的主(leader)则负责对外提供读写操作的服务,而从(follower)则负责与主节点同步数据,当主节点宕机,从节点之间能重新选举leader进行对外服务。