Add CTDB architecture analysis document
Some checks failed
Test / build (push) Has been cancelled
Test / test (push) Has been cancelled

This commit is contained in:
Warren
2026-06-22 05:36:23 +08:00
parent 63b765f68e
commit 060f43f0c4

View File

@@ -0,0 +1,342 @@
# CTDB (Cluster Trivial Database) 架构分析
## 概述
**CTDB** 是 Samba 的集群数据库系统用于在高可用性HA集群环境中管理共享状态和数据库记录。
**核心功能**
- 集群节点间状态同步
- 分布式数据库存储
- 故障检测和自动恢复
- 公共 IP 地址管理(浮动 IP
---
## 1. CTDB 核心组件
### 1.1 分布式数据库引擎
**功能**
- 字储 TDB (Trivial Database) 记录
- 在多个节点间复制数据
- 提供原子性和一致性保证
**TDB 格式**
```
┌─────────────────────────────────────┐
│ TDB Header │
│ ├── Magic number: 0x1BADFACE │
│ ├── Version: 1 │
│ ├── Hash size: 1024 │
│ └── Record count: N │
├─────────────────────────────────────┤
│ Hash Table │
│ ├── Bucket 0: offset to record │
│ ├── Bucket 1: offset to record │
│ └── ... │
├─────────────────────────────────────┤
│ Free List │
│ ├── Offset to next free block │
│ └── Free block size │
├─────────────────────────────────────┤
│ Records │
│ ├── Key (variable length) │
│ ├── Data (variable length) │
│ └── Hash next pointer │
└─────────────────────────────────────┘
```
---
### 1.2 集群节点管理
**功能**
- 节点状态监控UP/DOWN/UNHEALTHY
- 心跳检测heartbeat
- 自动故障转移failover
**节点状态定义**
| 状态 | 说明 | 处理 |
|------|------|------|
| **UP** | 节点正常运行 | 参与集群操作 |
| **DOWN** | 节点离线 | 等待恢复 |
| **UNHEALTHY** | 节点不健康 | 停止服务 |
| **BANNED** | 节点被禁止 | 重新加入需手动操作 |
---
### 1.3 公共 IP 管理
**功能**
- 动态分配浮动 IPpublic IP
- 节点故障时自动迁移 IP
- 客户端透明重连
**公共 IP 分配逻辑**
```
┌─────────────────────────────────────┐
│ Public IP Pool │
│ ├── 192.168.1.100 (node 0) │
│ ├── 192.168.1.101 (node 1) │
│ ├── 192.168.1.102 (node 2) │
│ └── ... │
├─────────────────────────────────────┤
│ IP Assignment │
│ ├── Node 0 UP → owns .100 │
│ ├── Node 1 DOWN → .101 moves to N0 │
│ └── Node 2 UP → owns .102 │
└─────────────────────────────────────┘
```
---
### 1.4 事件脚本系统
**功能**
- 监控脚本(健康检查)
- 启动/停止脚本(服务管理)
- IP 分配脚本(网络配置)
**事件类型**
| 事件 | 说明 | 脚本 |
|------|------|------|
| `startup` | 节点启动 | 01.startup.sh |
| `shutdown` | 节点停止 | 50.shutdown.sh |
| `takeip` | 分配 IP | 11.takeip.sh |
| `releaseip` | 释放 IP | 10.releaseip.sh |
| `monitor` | 健康检查 | 00.monitor.sh |
---
## 2. CTDB 协议架构
### 2.1 控制协议
**CTDB 控制消息**(基于 TCP
```
┌─────────────────────────────────────┐
│ CTDB Header │
│ ├── Magic: 0xCtdb │
│ ├── Version: 1 │
│ ├── Command: CTDB_CMD_* │
│ ├── Status: SUCCESS/ERROR │
│ ├── Length: payload size │
├─────────────────────────────────────┤
│ Payload │
│ ├── Command-specific data │
│ └── Optional response data │
└─────────────────────────────────────┘
```
**CTDB_CMD 类型**
| Command | 说明 | 用途 |
|---------|------|------|
| `CTDB_CMD_CONNECT` | 连接请求 | 初始化连接 |
| `CTDB_CMD_GETDB` | 获取数据库 | 访问 TDB |
| `CTDB_CMD_FETCH` | 读取记录 | 查询数据 |
| `CTDB_CMD_STORE` | 存储记录 | 写入数据 |
| `CTDB_CMD_DELETE` | 删除记录 | 清除数据 |
| `CTDB_CMD_PING` | 心跳检测 | 节点监控 |
| `CTDB_CMD_SETNODEMASK` | 设置节点掩码 | 集群配置 |
---
### 2.2 数据库复制协议
**复制策略**
- **主从复制**Master-Slave一个节点为主其他为副本
- **多主复制**Multi-Master所有节点可写入需要冲突解决
**复制流程**
```
Node A Node B
| |
|── STORE(key, value) ────>| (write request)
| |── Validate
| |── Write to local TDB
| |── Replicate to other nodes
|<── ACK (success) ────────|
| |
|── FETCH(key) ───────────>| (read request)
|<── value ────────────────| (return data)
```
---
### 2.3 故障恢复协议
**故障检测**
```
┌─────────────────────────────────────┐
│ Health Monitor Loop │
│ ├── Ping all nodes (every 1s) │
│ ├── Check response timeout (5s) │
│ ├── Mark DOWN if timeout │
│ └── Trigger recovery process │
└─────────────────────────────────────┘
```
**恢复流程**
```
Node A (DOWN) Cluster
| |
|── Mark as DOWN ─────────>| (detected)
| |── Reassign public IPs
| |── Notify other nodes
| |── Update node mask
| |
|── Recovery attempt ─────>| (after 30s)
|── Rejoin cluster ───────>| (if successful)
| |── Restore IPs
```
---
## 3. CTDB 与 SMB 集成
### 3.1 Samba 集成点
**共享数据库**
| TDB 文件 | 说明 | 集群支持 |
|---------|------|---------|
| `secrets.tdb` | 认证密钥 | ✅ CTDB 复制 |
| `brlock.tdb` | 字节锁 | ✅ CTDB 复制 |
| `locking.tdb` | 文件锁 | ✅ CTDB 复制 |
| `connections.tdb` | 连接状态 | ✅ CTDB 复制 |
| `session_info.tdb` | 会话信息 | ✅ CTDB 复制 |
| `share_info.tdb` | 共享配置 | ✅ CTDB 复制 |
**关键特性**
- 所有节点访问相同的数据库
- 实时同步锁定状态
- 故障后自动恢复连接
---
### 3.2 实施架构
**高可用性架构**
```
┌─────────────────────────────────────────────┐
│ Client Layer │
│ ├── SMB clients (Windows/macOS/Linux) │
│ └── Connect via floating IP │
├─────────────────────────────────────────────┤
│ CTDB Cluster (3+ nodes) │
│ ├── Node 0: 192.168.1.100 (SMB + CTDB) │
│ ├── Node 1: 192.168.1.101 (SMB + CTDB) │
│ ├── Node 2: 192.168.1.102 (SMB + CTDB) │
│ └── Public IPs: .100, .101, .102 │
├─────────────────────────────────────────────┤
│ Shared Storage │
│ ├── GlusterFS / Ceph / NFS │
│ └── All nodes access same filesystem │
└─────────────────────────────────────────────┘
```
---
## 4. 实施评估
### 4.1 核心功能需求
| 功能 | 优先级 | 工作量 | 风险 |
|------|--------|--------|------|
| **分布式 TDB** | P0 | 500 行 | 中 ⚠️⚠️⚠️ |
| **节点管理** | P0 | 300 行 | 中 ⚠️⚠️⚠️ |
| **公共 IP 管理** | P1 | 200 行 | 低 ⚠️⚠️ |
| **事件脚本系统** | P1 | 200 行 | 低 ⚠️⚠️ |
| **控制协议** | P0 | 400 行 | 高 ⚠️⚠️⚠️⚠️ |
| **故障恢复** | P0 | 300 行 | 高 ⚠️⚠️⚠️⚠️⚠️ |
| **总计** | | **1900 行** | **高 ⚠️⚠️⚠️⚠️⚠️** |
---
### 4.2 技术挑战
**挑战 1分布式一致性**
- **问题**:多节点写入冲突
- **解决方案**
- 使用 Raft/Paxos 算法(需要实现 consensus
- 或使用主从模式(简化但牺牲可用性)
**挑战 2故障检测准确性**
- **问题**:网络分区导致误判
- **解决方案**
- 使用多路径心跳(多个检测点)
- 设置合理的超时阈值(避免误判)
**挑战 3浮动 IP 管理**
- **问题**IP 迁移需要内核支持
- **解决方案**
- 使用 Linux network namespace
- macOS 需要 ifconfig + route 管理
---
### 4.3 Rust 实施建议
**推荐方案**
1. **Phase 1**:实现基础 TDB 存储引擎500 行)
2. **Phase 2**实现节点管理和心跳300 行)
3. **Phase 3**实现控制协议400 行)
4. **Phase 4**:实现公共 IP 管理200 行)
5. **Phase 5**实现故障恢复逻辑300 行)
**总计**:约 1700 行代码(不包括测试)
**预计时间**:约 5-7 天(高复杂度)
---
### 4.4 替代方案
**方案 1使用现有 Rust crate**
- `raft-rs`:分布式共识算法
- `tikv`:分布式 KV 存储
- 优点:减少实现工作量
- 缺点:需要集成适配
**方案 2简化 CTDB 实现**
- 仅实现单主模式(避免分布式共识)
- 使用 SQLite 作为共享数据库(简化存储)
- 优点:降低实施风险
- 缺点:牺牲可用性(主节点故障无法写入)
**方案 3不实施 CTDB**
- 使用外部高可用方案HAProxy + Keepalived
- MarkBase SMB 保持单节点部署
- 优点:最小工作量
- 缺点:无法实现真正的集群
---
## 5. 决策建议
### 5.1 推荐策略 ⭐⭐⭐⭐
**短期P3 不建议实施)**
- ✅ 保持单节点部署Phase 1-6 已完成)
- ✅ 使用外部 HAProxy + Keepalived 实现高可用
- ❌ 不实施 CTDB复杂度高收益有限
**长期(企业需求)**
- ⭐⭐⭐⭐ 实施简化 CTDB单主模式
- ⭐⭐⭐ 使用 Raft-rs 实现分布式共识
- ⭐⭐⭐⭐⭐ 完整 CTDB 实现(需要 5-7 天)
---
### 5.2 最终建议
| 场景 | 推荐方案 | 工作量 |
|------|---------|--------|
| **个人/小团队** | 单节点 + 外部 HA | 0 行 |
| **中小企业** | 简化 CTDB单主 | ~800 行 |
| **大型企业** | 完整 CTDB + Raft | ~2000 行 |
**结论**Phase 7 (CTDB 集群) 复杂度高(⚠️⚠️⚠️⚠️⚠️),建议根据实际需求决定是否实施。
---
**最后更新**2026-06-22