Kafka集群搭建、控制器、复制、ISR(四)

集群搭建

Kafka使用Zookeeper来维护集群成员的信息。每个broker都有一个唯一标识符,每个节点把自己的标识符注册到zookeeper上就构成了集群。

1、zookeeper集群环境准备:

192.168.43.38 192.168.43.39 192.168.43.40
在这里插入图片描述
kafka三台:
192.168.43.38 192.168.43.39 192.168.43.40

192.168.43.38 的配置参数:

#brokerID
broker.id=0
#代理监听端口
listeners=PLAINTEXT://192.168.43.38:9092
host.name=192.168.43.38
port=9092
#zookeeper
zookeeper.connect=192.168.43.38:2181,192.168.43.39:2181,192.168.43.40:2181

192.168.43.39 的配置参数:

#brokerID
broker.id=1
#代理监听
listeners=PLAINTEXT://192.168.43.39:9092
host.name=192.168.43.39
port=9092
#zk
zookeeper.connect=192.168.43.38:2181,192.168.43.39:2181,192.168.43.40:2181

192.168.43.40 的配置参数:

#brokerID
broker.id=1
#监听
listeners=PLAINTEXT://192.168.43.40:9092
host.name=192.168.43.40
port=9092
#zk
zookeeper.connect=192.168.43.38:2181,192.168.43.39:2181,192.168.43.40:2181

启动3台kafka

登录zk查看ids根目录下有0 1 2 节点:
在这里插入图片描述

2、控制器

控制器其实就是一个broker ,只不过它除了具有一般 broker 的功能之外,还负责分区首领的选举。集群里第一个启动的 broker 通过Zookeeper 里创建 个临时节点/controller 「让自己成为控制器。其 broker 在启动时也会尝试创建这个节点,不过它们会收到 个“节点已存在”的异常,然后“意识”到控制器节点已存在,也就是说集群里已经有一个控制器了。其他 broker 在控制器节点上创建
Zookeeper watch 对象,这样它们就可以收到这个节点的变更通知。这种方式可以确保集群里一次只有一个控制器存在。
在这里插入图片描述

3、复制

复制功能是Kafka架构的核心,它可以在个别节点失效时仍能保证Kafka的可用性和持久性。Kafka使用主题来组织数据,每个主题被分为若干个分区,每个分区有多个副本,那些副本被保存在不同的broker上。

首领副本:
每个分区都有一个首领副本 。为了保证一致性,所有生产者请求和消费者请求都会经过这个副本。

跟随者副本:
首领以外的副本都是跟随者副本。跟随者副本不处理来自客户端的请求,它们唯一的任务就是从首领那里复制消息,保持与首领一致的状态。如果首领发生崩渍,其中的一个跟随者会被提升为新首领。

4、ISR

因为还没有被足够多副本复制的消息被认为是“不安全”的,如果首领发生崩横,另一 个副本成为新首领,那么这些消息就丢失了。大部分客户端只能读取已经被写入所有同步副本的消息。 分区首领知道每个消息会被复制到哪个副本上, 在消息还没有被写入所有同步副本之前, 是不会发送给消费者的,尝试获取这些消息的请求会得到空的响应而不是错误。
在这里插入图片描述

ISR,也即In-Sync Replica。每个Partition的Leader都会维护这样一个列表,该列表中,包含了所有与之同步的Replica(包含Leader自己)。每次数据写入时,只有ISR中的所有Replica都复制完,Leader才会将其置为Commit,它才能被Consumer所消费。

ISR相关配置说明:
replica.lag.time.max.ms:如果一个follower在这个时间内没有发送fetch请求,leader将从ISR重移除这个follower,并认为这个follower已经挂了
min.insync.replicas:min.insync.replicas指定replicas的最小数目(必须确认每一个repica的写数据都是成功的),如果这个数目没有达到,producer会产生异常。

示例:
在这里插入图片描述

在第一步中,Leader A总共收到3条消息,但由于ISR中的Follower只同步了第1条消息(m1),故只有m1被Commit,也即只有m1可被Consumer消费。此时Follower B与Leader A的差距是1,而Follower C与Leader A的差距是2,虽然有消息的差距,但是满足同步副本的要求保留在ISR中。
在第二步中,由于旧的Leader A宕机,新的Leader B在replica.lag.time.max.ms时间内未收到来自A的Fetch请求,故将A从ISR中移除,此时ISR={B,C}。同时,由于此时新的Leader B中只有2条消息,并未包含m3(m3从未被任何Leader所Commit),所以m3无法被Consumer消费。

发布了140 篇原创文章 · 获赞 47 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/qq_34125999/article/details/99687688