Kafka入门 、高可用集群

Kafka

开发语言:Scala
单机吞吐量:十万级
时效性:ms以内
可用性:非常高(分布式架构),一个数据多个副本,少数机器宕机,不会丢失数据,不会导致不可用
特性:只支持主要的MQ功能,不支持消息查询和消息回溯,但是提供超高的吞吐量,在大数据领域的实时计算和日志收集应用广;唯一的劣势是可能消息重复消费,对数据准确性造成轻微影响。
消息丢失:理论上不会
消息推拉模式:Push-Pull

生产者将消息push到broker(Kafka集群中一个实例称为一个broker),消费者主动pull


(一)Kafka的特点

  • 端口号:9092
  • 消息持久化:一旦接收到消息,会立即写到文件系统,即使消费者读取消息后也不会删除,默认存储时间7天,默认最多允许1G数据存储。

    适合消息持久化存储的场景,比如日志;

  • 不适合消息的高频率发送和读取*

(二)Kafka高可用集群-基础概念

Kafka-ha

  1. Producer:消息生产者

  2. Consumer:消息消费者

    Consumer Group:消费者组。记住:同一个组的消费者不能消费同一个Partition的数据

  3. BrokerKafka集群中一个实例称为一个Broker

  4. Leader:每个Broker内会有LeaderFollower(但是要注意往往不是隶属于同一个Partition),Follower只用于 备份LeaderConsumer只消费Leader,但是要注意的是同一个PartitionLeaderFollower往往会分布在不同的Broker,主要是为了容灾备份

  5. FollowerFollower用于同步Leader,每次同步数据时会维护一个Isr的指标,表示的是Leader之间数据相进的程度,Leader宕机后数据最相近的Follower会立即晋升为Leader,不存在选举

  6. ZooKeeperKafka高可用集群依赖于ZK进行服务注册与发现

  7. Topic:消息主题,Kafka发送消息时会根据主题对消息进行分类


(三)消息层次

主题Topic

  • 生产者发布MessageTopic
  • 消费者订阅一个或多个Topic

分区Partition

  • 每个主题可以划分多个分区,同一个Topic的不同PartitionLeader节点应该要位于不同的Broker上,主要是用于负载均衡
  • 每个消息默认2个分区
  • 同一个Consumer Group不能消费同一个Partition

分区的原则

  1. 指定了Partition:直接使用该Partition
  2. 没有指定Partition,指定了Message Key:根据KeyValue进行哈希,得到一个Partition
  3. 没有指定Partition,也没有指定Message Key:通过轮询选出一个Partition

分区的原理

  1. 每个Partition维护一个分区日志write-ahead-log
  2. 生产者将发布的Message追加到这些日志后面,消费者订阅这些Message

消息Message

  • 每一个Message都是一个K/V对,Key用来分配消息到Partition日志分区,Value用来存储记录数据

(四)消息推拉模式:push/pull

  • 生产者将消息pushbroker
  • 消费者主动pull

(五)消息读取方式(offset)

消息读取方式:消费者需要将自己的位置指针offset记录下来,可以记录在ZK目录下,也可以直接记录在一个特殊的Leader主题分区

位置指针offset的存储方式

1. ZK目录(已过时)

如果通过参数zookeeper.connect来消费消息,offset会更新到服务注册中心ZooKeeperconsumers/{group}/offsets/{topic}/{partition}目录下

在最新版本的Kafka中,这种方式已经被标记为@Deprecated

2. Kafka topic

如果通过参数bootstrap.servers来消费消息,offset会更新到Leader自带的__consumer_offsets主题分区下

最新版本的Kafka往往都是这么做的。

不再使用ZK存储offset的原因

  • ConsumerLeader通信后获取offset,然后Consumer再与ZK通信,将offset存储在ZK中,效率不高
  • 所以新版Kafka直接将offset存储在Leader的特定主题分区,免去了ConsumerZK的通信开销

(六)数据写入:ack应答机制

  1. ack = 0Producer将数据发送后,不管Partition Leader是否写入,都直接返回成功。效率高,但是安全性低
  2. ack = 1Producer将数据发送后,等Partition Leader写入成功,则返回成功
  3. ack = allProducer将数据发送后,Partition Leader写入成功后,会等待所有的Partition Follower同步成功才返回成功。效率低,但是安全性高

    使用ack = all可以保证数据绝对不丢失

-------------本文结束感谢您的阅读-------------

本文标题:Kafka入门 、高可用集群

文章作者:DragonBaby308

发布时间:2019年07月31日 - 22:55

最后更新:2019年11月19日 - 00:32

原始链接:http://www.dragonbaby308.com/kafka/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

急事可以使用右下角的DaoVoice,我绑定了微信会立即回复,否则还是推荐Valine留言喔( ఠൠఠ )ノ
0%