ZooKeeper Observer与分层架构
Observer扩展和分层架构设计。
Observer扩展架构
Observer特点:
| 特性 | 说明 |
|---|---|
| 不参与投票 | 不影响选举和写性能 |
| 只同步数据 | 接收Leader提议 |
| 处理读请求 | 扩展读能力 |
| 可跨地域 | 不增加投票延迟 |
Observer配置:
properties
# observer节点zoo.cfg
peerType=observer
server.1=host1:2888:3888
server.2=host2:2888:3888
server.3=host3:2888:3888
server.4=host4:2888:3888:observer # Observer节点
跨地域架构:
Java
主数据中心(3节点集群)
Leader + Follower + Follower
↓ 数据同步
远程数据中心
Observer × N → 本地客户端就近访问
Observer优势:
| 优势 | 说明 |
|---|---|
| 扩展读能力 | 可部署多个Observer |
| 降低延迟 | 跨地域就近访问 |
| 不影响写性能 | 不参与投票 |
| 成本低 | 不需要高性能硬件 |
Observer限制:
| 限制 | 说明 |
|---|---|
| 不能Leader | 不参与选举 |
| 写请求延迟 | 写请求仍需访问主集群 |
| 数据同步延迟 | 跨地域存在网络延迟 |
Observer适用场景:
| 场景 | 说明 |
|---|---|
| 跨地域部署 | 远程数据中心 |
| 读请求密集 | 读多写少场景 |
| 成本控制 | 低硬件成本扩展 |
提示:Observer适合读密集和跨地域场景。
集群分层架构
分层设计:
Java
/系统层
/admin <- 系统配置(运维管理)
/monitor <- 监控数据
/业务层
/service-a <- 业务A服务
/service-b <- 业务B服务
/租户层
/tenant-1 <- 租户1数据
/tenant-2 <- 租户2数据
权限边界设计:
| 层级 | 管理者 | 权限范围 |
|---|---|---|
| 系统层 | 运维团队 | 全部权限cdrwa |
| 业务层 | 业务团队 | 本业务范围crwa |
| 租户层 | 租户用户 | 本租户范围rw |
ACL配置示例:
Java
// 系统层ACL
ACL systemACL = new ACL(Perms.ALL, new Id("digest", "admin:pwd"));
zk.create("/admin", null, Collections.singletonList(systemACL), ...);
// 业务层ACL
ACL businessACL = new ACL(Perms.ALL, new Id("digest", "team-a:pwd"));
zk.create("/service-a", null, Collections.singletonList(businessACL), ...);
// 租户层ACL
ACL tenantACL = new ACL(Perms.READ | Perms.WRITE, new Id("digest", "tenant1:pwd"));
zk.create("/tenant-1", null, Collections.singletonList(tenantACL), ...);
分层隔离效果:
| 效果 | 说明 |
|---|---|
| 数据隔离 | 各租户数据独立 |
| 权限隔离 | 不同角色不同权限 |
| 误操作隔离 | 操作不跨层影响 |
命名空间规划:
Java
命名规范:
/层级/业务/类型/节点
示例:
/config/db/connection <- 配置层数据库连接
/services/order/v1 <- 服务层订单服务
/tenant/app1/data <- 租户层应用数据
提示:分层+ACL实现租户级数据隔离和权限控制。
读写分离策略
读写分离架构:
text
写请求 → Leader(集中处理)
读请求 → Follower/Observer(分散处理)
客户端路由策略:
text
// 根据请求类型选择节点
if (request.isWrite()) {
// 写请求发给Leader
String leaderAddr = getLeaderAddress();
zk = connect(leaderAddr);
} else {
// 读请求就近访问
String nearestAddr = getNearestNode();
zk = connect(nearestAddr);
}
负载均衡策略:
| 策略 | 说明 |
|---|---|
| 随机 | 随机选择Follower |
| 轮询 | 依次访问各Follower |
| 最小延迟 | 选延迟最低节点 |
| 权重 | 根据节点能力分配 |
就近访问配置:
text
// 客户端配置连接多个节点
CuratorFrameworkFactory.builder()
.connectString("leader:2181,follower1:2181,follower2:2181")
.build();
// Curator自动选择就近节点读
读写分离效果:
| 效果 | 说明 |
|---|---|
| 写集中 | Leader处理所有写请求 |
| 读分散 | Follower/Observer处理读请求 |
| 延迟降低 | 读请求就近访问 |
- 吞吐提升 | 读请求分散提升整体吞吐 |
强一致读:
text
// 需要强一致读访问Leader
zk.sync("/path"); // 同步后读取
// 或直接访问Leader节点
注意:强一致读需求仍需访问Leader。
要点总结
- Observer不参与投票,无限扩展读能力
- Observer配置peerType=observer和:observer后缀
- 分层架构:系统层、业务层、租户层隔离
- ACL实现层级权限边界控制
- 读写分离:写Leader、读Follower/Observer -就近访问降低读延迟
- 强一致读需访问Leader或sync同步
📝 发现内容有误?点击此处直接编辑