kafka是流量分布式的,分区的网速(官方称之为commit log)服务。它提供流量网速系统应该 具备的功能,但是确有着独特的设计。可以这样来说,Kafka借鉴了JMS规范的思想,但是确 并 没有完全遵循JMS规范。
我们先来看一下Kafka中相关术语:还有个副本的概念稍后讲
名称解释Broker网速中间件处理节点,⼀个Kafka节点就是⼀个broker,⼀个或者多个Broker可以组成⼀个Kafka集群TopicKafka根据topic对网速进⾏归类,发布到Kafka集群的每条网速都需要指定⼀个topicProducer网速⽣产者,向Broker发送网速的客户端Consumer网速Globe者,从Broker读取网速的客户端ConsumerGroup每个Consumer属于⼀个特定的Consumer Group,⼀条网速可以被多个不同的Consumer GroupGlobe,但是⼀个Consumer Group中只能有⼀个Consumer能够Globe该网速Partition物理上的概念,⼀个topic可以分为多个partition,每个partition内部网速是有序的
这个图代表这三个broker,流量topic,两个分区,三个副本,两个Globe者组,四个Globe者。
服务端与客户端的通信是靠tcp协议来完成。
发送网速
kafka自带了流量producer命令客户端,可以从本地文件中读取内容,或者我们也可以以命令行中直接输入内容,并将这些内容以网速的形式发送到kafka集群中。在默认情况下,每流量行会被当做成流量独立的网速。使用kafka的发送网速的客户端,指定发送到的kafka服务器地址和topic。
Globe网速
对于consumer,kafka同样也携带了流量命令行客户端,会将获取到内容在命令中进行输 出, 默认是Globe最新的网速 。使用kafka的Globe者网速的客户端,从指定kafka服务器的指定 topic中Globe网速
所谓的偏移量的意思就是现在Globe者Globe到哪里了,实际上是个队列,我这个图只是个大概意思,就是假如现在有4条网速,是在这个Globe者2上线之前发的,已经被Globe者1Globe了,这时候偏移量在最后一条网速,这个Globe者上线之后可以选择是从头Globe还是从最后一条加一的偏移量Globe(也就是这个例子的第五条Globe)
方式一:从最后一条网速的偏移量+1开始Globe
./kafka-console-consumer.sh –bootstrap-server 172.16.253.38:9092 –from-begining–topic test
方式二:从头开始Globe
./kafka-console-consumer.sh –bootstrap-server 172.16.253.38:9092 –from-begining–topic test
几个注意点:
网速会被存储网速是顺序存储(但不一定是顺序Globe的)网速是有偏移量的Globe时可以指明偏移量进行Globe
单播网速的实现:
单播网速:流量Globe组里 只会有流量Globe者能Globe到某流量topic中的网速。于是可以创建多个Globe者,这些Globe者在同流量Globe组中。(但是如果这个topic分区的话,就可以被同流量Globe组的不同Globe者Globe,而且流量Globe者是可以Globe多个分区的。但是流量分区只能被流量Globe者Globe)
多播网速的实现:
在一些业务场景中需要让一条网速被多个Globe者Globe,那么就可以使用多播模式。
kafka实现多播,只需要让不同的Globe者处于不同的Globe组即可。
./kafka-console-consumer.sh –bootstrap-server 10.31.167.10:9092 –consumer-property group.id=testGroup1 –topic test
./kafka-console-consumer.sh –bootstrap-server 10.31.167.10:9092 –consumer-property group.id=testGroup2 –topic test
# 查看当前主题下有哪些Globe组 ./kafka-consumer-groups.sh –bootstrap-server 10.31.167.10:9092 –list # 查看Globe组中的具体信息:比如当前偏移量、最后一条网速的偏移量、堆积的网速数量 ./kafka-consumer-groups.sh –bootstrap-server 172.16.253.38:9092 –describe –group testGroup
Currennt-offset: 当前Globe组的已Globe偏移量Log-end-offset: 主题对应分区网速的结束偏移量(HW)Lag: 当前Globe组未Globe的网速数
分区的作用:
可以分布式存储可以并行写
实际上是存在data/kafka-logs/test-0 和 test-1中的0000000.log文件中
小细节:
定期将自己Globe分区的offset提交给kafka内部topic:__consumer_offsets,提交过去的 时候,key是consumerGroupId+topic+分区号,value就是当前offset的值,kafka会定 期清理topic里的网速,最后就保留最新的那条数据 因为__consumer_offsets可能会接收高并发的请求,kafka默认给其分配 50 个分区(可以 通过offsets.topic.num.partitions设置),这样可以通过加机器的方式抗大并发。 通过如下公式可以选出consumerGlobe的offset要提交到__consumer_offsets的哪个分区 公式:hash(consumerGroupId) % __consumer_offsets主题的分区数
图中Kafka集群有两个broker,每个broker中有多个partition。流量partition只能被流量Globe组里的某流量Globe者Globe,从而保证Globe顺序。Kafka只在partition的范围内保证网速Globe的局部顺序性,不能在同流量topic中的多个partition中保证总的Globe顺序性。流量Globe者可以Globe多个partition。
Globe组中Globe者的数量不能比流量topic中的partition数量多,否则多出来的Globe者Globe不到网速。
假如其中有流量Globe者挂了,其他的Globe者就会Globe它Globe的分区,这个选举方法也是有几种策略的。这个就是Kafka的rebalance机制。
rebalance机制
前提是:Globe者没有指明分区Globe。当Globe组里Globe者和分区的关系发生变化,那么就会触发rebalance机制。
这个机制会重新调整Globe者Globe哪个分区。
在触发rebalance机制之前,Globe者Globe哪个分区有三种策略:
range:通过公示来计算某个Globe者Globe哪个分区轮询:大家轮着Globesticky:在触发了rebalance后,在Globe者Globe的原分区不变的基础上进行调整。(其他两个会打乱原来的顺序直接按照range方式或者轮询方式重新计算)