Kafka是Apache基金会(官网http://kafka.apache.org/)管理的一个开源流处理平台,但是国内大部分人都知道它是消息队列。那么我们先来了解一下什么是消息队列。MessageQueue顾名思义,消息队列就是用来存储消息的队列。消息生产者(producer)将消息放入消息队列,消费者(consumer)读取消息队列中的内容。消息队列中的每条消息都会有一个位置,就像数组中的下标(index)一样,我们在kafka中称之为offset。对于生产者来说,有一个特殊的偏移量——LEO(logendoffset),它指向消息队列中下一个将存储消息的位置。在这里,我们关注消费者。一个消息队列当然可以被多个消费者读取。每个消费者都有一个唯一的group-id来区分它。Kafka也会记录每个消费者(consumer)读到哪里(offset)。Q:为什么Kafka记录的是consumer消费的offset,而不是consumer自己?主题(Topic)上面我们以一段数据为例,讲了什么是消息队列。如果数据有多个副本(多个队列)怎么办?这也很简单。在kafka中,我们可以通过不同的主题(Topic)来区分不同的数据。不同的生产者(producers)可以将数据存储在不同的topic中,不同的consumer(消费者)也可以从不同的topic中读取数据。分区(partition)一条数据很大怎么办?当然,也算是分裂了。在kafka中,可以设置一个主题(Topic)拆分成多个不同的分区(partition),然后在分区(partition)的维度上管理、生产和消费数据。拆分最明显的好处是提高吞吐性能,多个分区并行,互不干扰。至于如何拆分,kafka提供了几种默认的分区策略polling、random、hash,当然你也可以实现自己的分区策略,这里不多展开。消费组主题(Topic)分区后,消费者如何消费?这里不得不提到consumer-group这个概念。在kafka中,为了保证数据的一致性,同一个partition在同一时间只能被一个consumer实例消费。为了提高消费,一般会设置多个消费者实例来消费不同的分区。这些实例共同组成一个消费组(Consumer-group),它们共享一个Group-id。注意:由于同一个分区(partition)只能同时被一个消费者(consumer)实例消费,所以超过分区(partition)个数的消费者(consumer)实例数是没有意义的。也会闲着。如果consumergroup中的某个实例发生变化(下线),或者partition数量发生变化,都会触发consumergrouprebalance。ReplicationKafka如何解决数据高可用问题?在分布式环境中,尽可能保证数据不丢失的唯一方法就是多复制几份,放在不同的机器上。复制的数据称为副本(Replication)。这里有几个关键词。HW:high-water,一个特殊的offset,只有低于这个offset的消息才能被消费者读取到。高水位的具体取值取决于主从副本之间的数据同步情况,这里不再展开。ISR:in-sync-replica,处于同步状态的副本的集合,是指在一定的回报(时间范围或数量范围)内,数据与主副本不同的副本。当然,主副本必须始终在ISR中。当主副本挂掉时,会从ISR中选出一个新的主副本来接管它的工作。OSR:对应IRS,out-sync-replica其实是指那些不在ISR中的副本。副本主从同步一份数据复制多份时,必然涉及到主从副本的同步,从副本会周期性的从主副本中拉取最新的数据。另外需要注意的是,在Kafka中,只有主副本会提供对外读写(高版本的Kafka只提供有限的从副本读取的功能),而从副本的唯一作用就是作为备份主副本。说到主从同步,顺便提一下kafka的ack设置。Kafka中的生产者(producer)可以通过request.required.acks参数设置数据的可靠性等级:0:生产者(producer)不等待master副本的确认,等到就认为传输成功发送。在这种情况下,效率最高但可能有数据丢失的风险。1:(默认)生产者(producer)发送数据后,会等待mastercopy确认接收,才认为消息发送成功。在这种情况下,消息可能会在主副本宕机时丢失。-1:(orall):生产者(producer)等待ISR中的所有replicas确认收到数据后,任务消息才发送成功。可靠性最高,但由于需要等待副本拉取确认,效率最低。BrokerKafka在副本(Replica)维度管理数据。管理这些数据必须需要一个管理者,这个管理者就是Broker。Broker会将相同数据的不同副本(Replication)调度到不同的机器上,当副本(Replication)数量不足时产生新的副本,以保证即使部分Broker宕机后数据也不会丢失。AllBrokers也会做一些元数据的相互同步,比如某个master数据谁应该拉取replica上的数据...结语第一次尝试手绘风格讲解入门知识卡夫卡。很肤浅,确实很多细节没有展开,见谅。
