1 概述
Kakfa起初是由LinkedIn公司开拓的一个漫衍式的动静系统,后成为Apache的一部门,它利用Scala编写,以可程度扩展和高吞吐率而被遍及利用。今朝越来越多的开源漫衍式处理惩罚系统如Cloudera、Apache Storm、Spark等都支持与Kafka集成。
Kafka凭借着自身的优势,越来越受到互联网企业的青睐,唯品会也回收Kafka作为其内部焦点动静引擎之一。Kafka作为一个贸易级动静中间件,图纸加密,动静靠得住性的重要性可想而知。如何确保动静的准确传输?如何确保动静的精确存储?如何确保动静的正确消费?这些都是需要思量的问题。本文首先从Kafka的架构着手,先相识下Kafka的根基道理,然后通过对kakfa的存储机制、复制道理、同步道理、靠得住性和耐久性担保等等一步步对其靠得住性举办阐明,最后通过benchmark来加强对Kafka高靠得住性的认知。
2 Kafka体系架构
如上图所示,一个典范的Kafka体系架构包罗若干Producer(可以是处事器日志,业务数据,页眼前端发生的page view等等),若干broker(Kafka支持程度扩展,一般broker数量越多,集群吞吐率越高),若干Consumer (Group),以及一个Zookeeper集群。Kafka通过Zookeeper打点集群设置,选举leader,以及在consumer group产生变革时举办rebalance。Producer利用push(推)模式将动静宣布到broker,Consumer利用pull(拉)模式从broker订阅并消费动静。
名词表明:
2.1 Topic & Partition
一个topic可以认为一个一类动静,每个topic将被分成多个partition,每个partition在存储层面是append log文件。任何宣布到此partition的动静城市被追加到log文件的尾部,每条动静在文件中的位置称为offset(偏移量),offset为一个long型的数字,它独一标志一条动静。每条动静都被append到partition中,是顺序写磁盘,因此效率很是高(履历证,顺序写磁盘效率比随机写内存还要高,这是Kafka高吞吐率的一个很重要的担保)。
每一条动静被发送到broker中,会按照partition法则选择被存储到哪一个partition。假如partition法则配置的公道,所有动静可以匀称漫衍到差异的partition里,这样就实现了程度扩展。(假如一个topic对应一个文件,那这个文件地址的呆板I/O将会成为这个topic的机能瓶颈,而partition办理了这个问题)。在建设topic时可以在$KAFKA_HOME/config/server.properties中指定这个partition的数量(如下所示),虽然可以在topic建设之后去修改partition的数量。
# The default number of log partitions per topic. More partitions allow greater # parallelism for consumption, but this will also result in more files across # the brokers. num.partitions=3
在发送一条动静时,可以指定这个动静的key,producer按照这个key和partition机制来判定这个动静发送到哪个partition。partition机制可以通过指定producer的partition.class这一参数来指定,该class必需实现kafka.producer.Partitioner接口。
有关Topic与Partition的更多细节,可以参考下面的“Kafka文件存储机制”这一节。
3 高靠得住性存储阐明
Kafka的高靠得住性的保障来历于其结实的副本(replication)计策。通过调理其副内情关参数,可以使得Kafka在机能和靠得住性之间运转的游刃有余。Kafka从0.8.x版本开始提供partition级此外复制,replication的数量可以在$KAFKA_HOME/config/server.properties中设置(default.replication.refactor)。
这里先从Kafka文件存储机制入手,从最底层相识Kafka的存储细节,进而对其的存储有个微观的认知。之后通过Kafka复制道理和同步方法来叙述宏观层面的观念。最后从ISR,HW,leader选举以及数据靠得住性和耐久性担保等等各个维度来富厚对Kafka相关常识点的认知。
3.1 Kafka文件存储机制
Kafka中动静是以topic举办分类的,出产者通过topic向Kafka broker发送动静,消费者通过topic读取数据。然而topic在物理层面又能以partition为分组,一个topic可以分成若干个partition,那么topic以及partition又是怎么存储的呢?partition还可以细分为segment,一个partition物理上由多个segment构成,那么这些segment又是什么呢?下面我们来一一发表。
为了便于说明问题,假设这里只有一个Kafka集群,且这个集群只有一个Kafka broker,即只有一台物理机。在这个Kafka broker中设置($KAFKA_HOME/config/server.properties中)log.dirs=/tmp/kafka-logs,以此来配置Kafka动静文件存储目次,与此同时建设一个topic:topic_zzh_test,partition的数量为4($KAFKA_HOME/bin/kafka-topics.sh –create –zookeeper localhost:2181 –partitions 4 –topic topic_vms_test –replication-factor 4)。那么我们此时可以在/tmp/kafka-logs目次中可以看到生成了4个目次:
drwxr-xr-x 2 root root 4096 Apr 10 16:10 topic_zzh_test-0 drwxr-xr-x 2 root root 4096 Apr 10 16:10 topic_zzh_test-1 drwxr-xr-x 2 root root 4096 Apr 10 16:10 topic_zzh_test-2 drwxr-xr-x 2 root root 4096 Apr 10 16:10 topic_zzh_test-3