kafka 与zk

Kafka与Zookeeper的使用及关系
博客主要探讨了Kafka与Zookeeper的相关问题。一是Kafka自带Zookeeper,若另外安装也不会冲突,可自行决定使用哪个及启动方式;二是介绍了Kafka使用Zookeeper的作用,包括管理协调代理、实现动态集群扩展、保证负载均衡等,还说明了Zookeeper与Broker、Consumer的关系。

(1)kafka中自带有一个zk,但是我又另外安装了一个zk怎么办呢

 首先,他是不会冲突的,因为在使用kafka时,你可以自己决定使用哪个zookeeper。

自带的在kafa/bin下有个zookeeper-server-start.sh启动脚本

而另外安装的在zookeeper/bin/zkServer.sh start 即可启动

(2)Kafka 使用 Zookeeper 做什么?

kafka使用ZooKeeper用于管理、协调代理,每个Kafka代理通过Zookeeper协调其他Kafka代理。

当Kafka系统中新增了代理或某个代理失效时,Zookeeper服务将通知生产者和消费者。生产者与消费者据此开始与其他代理协调工作。Kafka将元数据信息保存在Zookeeper中,但是发送给Topic本身的数据是不会发到Zk上的

  1. kafka使用zookeeper来实现动态的集群扩展,不需要更改客户端(producer和consumer)的配置。broker会在zookeeper注册并保持相关的元数据(topic,partition信息等)更新。
  2. 而客户端会在zookeeper上注册相关的watcher。一旦zookeeper发生变化,客户端能及时感知并作出相应调整。这样就保证了添加或去除broker时,各broker间仍能自动实现负载均衡。这里的客户端指的是Kafka的消息生产端(Producer)和消息消费端(Consumer)
  3. Broker端使用zookeeper来注册broker信息,以及监测partitionleader存活性.
  4. Consumer端使用zookeeper用来注册consumer信息,其中包括consumer消费的partition列表等,同时也用来发现broker列表,并和partitionleader建立socket连接,并获取消息.
  5.  Zookeer和Producer没有建立关系,只和Brokers、Consumers建立关系以实现负载均衡,即同一个ConsumerGroup中的Consumers可以实现负载均衡(因为Producer是瞬态的,可以发送后关闭,无需直接等待)

     

 

 

 

### Kafka 去掉 ZooKeeper 的替代方案 为了使 Kafka 不再依赖于 ZooKeeper,社区引入了一种名为 **KRaft (Kafka Raft)** 的新模式。这种模式通过移除对外部 ZooKeeper 服务的依赖,将元数据管理和控制器功能集成到了 Kafka 自身内部。 #### 新架构概述 在 KRaft 模式下,所有的元数据管理功能都由 Kafka 集群中的一个特殊组件——**Quorum 控制器**负责[^1]。这些 Quorum 控制器基于 Raft 协议实现分布式一致性,从而取代了传统的 ZooKeeper 功能。具体来说: - 元数据存储:原本存放在 ZooKeeper 中的元数据现在被迁移到 Kafka 内部的一个特殊的日志文件中[^3]。 - Controller 角色:之前动态选举产生的单个 Controller 被一组多个 Controller 替代,它们共同维护集群状态并提供高可用性。 #### 实现方式 以下是 KRaft 架构的一些关键技术点及其工作原理: 1. **去中心化的设计** - 在传统架构中,ZooKeeper 是外部独立的服务,用于协调和存储配置信息;而在 KRaft 下,则完全消除了这一层抽象[^4]。 2. **Raft 协议的应用** - 使用 Raft 算法来同步不同节点之间的元数据副本,确保即使部分机器宕机也能保持系统的正常运转。 3. **专用硬件支持** - 如果性能成为瓶颈或者希望进一步隔离资源消耗,可以考虑把某些特定职责分配给专门优化过的物理设备上去执行。 4. **简化运维流程** - 减少了对额外中间件(ZooKeeper)的需求意味着降低了整体复杂度以及潜在失败点的数量, 同时也减少了监控范围内的对象数目. ```bash # 开启 Kraft 模式的命令示例 bin/kafka-server-start.sh config/server.properties --override process.roles=broker,controller \ --override node.id=<node_id> --override controller.quorum.voters=<voter_list> ``` 上述脚本展示了如何启动具备双重角色(既是 broker 又是 controller) 的服务器实例,并指定了参投票过程的具体成员列表[^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值