ZooKeeper主流框架集成
了解ZooKeeper在主流框架中的集成方式。
Kafka与ZooKeeper集成
集成功能:
| 功能 | ZooKeeper作用 |
|---|---|
| Broker注册 | 存储Broker元数据 |
| Controller选举 | 选出Controller节点 |
| Topic元数据 | 存储Topic分区信息 |
| ISR列表 | 维护副本同步状态 |
| Consumer偏移量 | 存储消费组偏移量(旧版本) |
ZooKeeper存储结构:
properties
/brokers
/ids/[0,1,2] <- Broker列表
/topics
/[topic]/partitions/[0]/state <- 分区状态
/controller <- Controller节点
/controller_epoch <- Controller纪元
/consumers <- 消费组信息(旧版本)
Controller选举流程:
XML
1. 各Broker尝试创建/controller临时节点
2. 成功者成为Controller
3. Controller管理分区分配与副本迁移
4. Controller故障重新选举
配置方式:
Java
# Kafka server.properties
zookeeper.connect=zk1:2181,zk2:2181,zk3:2181
zookeeper.session.timeout.ms=6000
zookeeper.sync.time.ms=2000
Kafka 2.8+变化:
Java
KRaft模式:
- 内置元数据管理
- 不依赖ZooKeeper
- 更简单部署架构
注意:ZooKeeper依赖逐步移除
注意:Kafka 2.8+支持KRaft模式,逐步移除ZooKeeper依赖。
HBase与ZooKeeper集成
集成功能:
| 功能 | ZooKeeper作用 |
|---|---|
| Master选举 | 选出RegionServer Master |
| Region定位 | 存储Region地址映射 |
| 集群状态 | 维护集群健康状态 |
| 分布式锁 | 表操作锁 |
| Replication | 跨集群复制协调 |
ZooKeeper存储结构:
YAML
/hbase
/master <- Master地址
/rs/[regionserver] <- RegionServer列表
/table-lock/[table] <- 表锁
/region-in-transition <- Region迁移状态
/replication <- 复制状态
Region定位流程:
Java
1. 客户端访问ZooKeeper获取.meta. Region地址
2. 查询.meta.表获取目标Region地址
3. 直接访问目标RegionServer
4. 缓存Region地址,后续直接访问
配置方式:
YAML
<!-- hbase-site.xml -->
<property>
<name>hbase.zookeeper.quorum</name>
<value>zk1,zk2,zk3</value>
</property>
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>2181</value>
</property>
<property>
<name>hbase.zookeeper.session.timeout</name>
<value>180000</value>
</property>
提示:HBase强依赖ZooKeeper,集群故障影响HBase服务。
Dubbo服务发现集成
集成功能:
| 功能 | ZooKeeper作用 |
|---|---|
| 服务注册 | Provider注册地址 |
| 服务发现 | Consumer获取地址列表 |
| 配置管理 | 存储路由规则 |
| 动态调整 | 实时推送变更 |
ZooKeeper存储结构:
Java
/dubbo
/[service]
/providers/[url1,url2] <- Provider列表
/consumers/[url] <- Consumer列表
/routers/[rule] <- 路由规则
/configurators/[config] <- 配置覆盖
服务注册代码:
text
RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class)
.getAdaptiveExtension();
Registry registry = registryFactory.getRegistry(URL.valueOf("zookeeper://zk1:2181"));
registry.register(URL.valueOf("dubbo://service:20880/com.example.Service"));
服务发现订阅:
text
Registry registry = registryFactory.getRegistry(URL.valueOf("zookeeper://zk1:2181"));
registry.subscribe(URL.valueOf("consumer://app/com.example.Service"), new NotifyListener() {
public void notify(List<URL> urls) {
// 更新服务列表
}
});
注意:Dubbo支持多种注册中心,ZooKeeper是默认推荐。
Spring Cloud集成
集成功能:
| 功能 | 实现方式 |
|---|---|
| 服务发现 | Spring Cloud Zookeeper Discovery |
| 配置中心 | Spring Cloud Zookeeper Config |
服务发现配置:
text
# application.yml
spring:
cloud:
zookeeper:
connect-string: zk1:2181,zk2:2181,zk3:2181
discovery:
enabled: true
root: /services
session-timeout: 6000
服务注册:
text
@SpringBootApplication
@EnableDiscoveryClient
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
配置中心:
text
# application.yml
spring:
cloud:
zookeeper:
config:
enabled: true
root: /config
profile-separator: ','
配置读取:
text
@Value("${db.host}")
private String dbHost;
// 自动从/config/application,dev/db读取
提示:Spring Cloud Zookeeper是轻量级服务发现方案。
要点总结
- Kafka用ZooKeeper管理Broker和Controller选举
- Kafka 2.8+ KRaft模式逐步移除ZooKeeper依赖
- HBase用ZooKeeper做Master选举和Region定位
- HBase强依赖ZooKeeper,集群故障影响服务
- Dubbo用ZooKeeper做服务注册发现
- Spring Cloud Zookeeper实现服务发现和配置中心
- 各框架集成方式相似,都是注册发现模式
📝 发现内容有误?点击此处直接编辑