|
| 1 | +# v1.0.9 变更日志 |
| 2 | + |
| 3 | +> **发布日期**: 2026-01-17 |
| 4 | +> **版本类型**: 🎉 新功能 - Change Stream 数据同步 |
| 5 | +
|
| 6 | +--- |
| 7 | + |
| 8 | +## 🎉 新功能 |
| 9 | + |
| 10 | +### Change Stream 数据同步 |
| 11 | + |
| 12 | +**实时同步数据到备份库,基于 MongoDB Change Stream 原生机制** |
| 13 | + |
| 14 | +#### 核心特性 |
| 15 | + |
| 16 | +- ✅ **实时同步**:延迟 10-500ms,基于 MongoDB Change Stream |
| 17 | +- ✅ **断点续传**:Resume Token 自动保存,重启后继续 |
| 18 | +- ✅ **多目标支持**:同时同步到多个备份库 |
| 19 | +- ✅ **数据过滤**:自定义过滤逻辑 |
| 20 | +- ✅ **数据转换**:支持脱敏、字段转换 |
| 21 | +- ✅ **自动重连**:网络中断自动恢复(最多5次) |
| 22 | +- ✅ **健康检查**:复用 ConnectionPoolManager |
| 23 | +- ✅ **主库影响小**:<2%,异步处理 |
| 24 | + |
| 25 | +#### 使用示例 |
| 26 | + |
| 27 | +```javascript |
| 28 | +const MonSQLize = require('monsqlize'); |
| 29 | + |
| 30 | +const msq = new MonSQLize({ |
| 31 | + type: 'mongodb', |
| 32 | + config: { |
| 33 | + uri: 'mongodb://localhost:27017/main', |
| 34 | + replicaSet: 'rs0' // 🔴 必须 |
| 35 | + }, |
| 36 | + |
| 37 | + // 🆕 同步配置 |
| 38 | + sync: { |
| 39 | + enabled: true, |
| 40 | + targets: [ |
| 41 | + { |
| 42 | + name: 'backup-main', |
| 43 | + uri: 'mongodb://backup:27017/backup', |
| 44 | + collections: ['users', 'orders'] |
| 45 | + } |
| 46 | + ], |
| 47 | + resumeToken: { |
| 48 | + storage: 'file', // 'file' | 'redis' |
| 49 | + path: './.sync-resume-token' |
| 50 | + } |
| 51 | + } |
| 52 | +}); |
| 53 | + |
| 54 | +await msq.connect(); |
| 55 | + |
| 56 | +// 正常使用,自动同步 |
| 57 | +await msq.collection('users').insertOne({ name: 'Alice' }); |
| 58 | +// ✅ 自动同步到 backup-main |
| 59 | +``` |
| 60 | + |
| 61 | +#### 新增文件 |
| 62 | + |
| 63 | +| 文件 | 行数 | 说明 | |
| 64 | +|------|------|------| |
| 65 | +| `lib/sync/ChangeStreamSyncManager.js` | 280 | Change Stream 管理器(核心) | |
| 66 | +| `lib/sync/SyncTarget.js` | 120 | 备份目标(复用连接池) | |
| 67 | +| `lib/sync/ResumeTokenStore.js` | 80 | Resume Token 持久化 | |
| 68 | +| `lib/sync/SyncConfig.js` | 50 | 配置验证 | |
| 69 | +| `lib/sync/index.js` | 10 | 模块导出 | |
| 70 | + |
| 71 | +#### 修改文件 |
| 72 | + |
| 73 | +| 文件 | 变更 | 说明 | |
| 74 | +|------|------|------| |
| 75 | +| `lib/index.js` | +80行 | 集成 ChangeStreamSyncManager | |
| 76 | + |
| 77 | +#### 新增文档 |
| 78 | + |
| 79 | +- `docs/sync-backup.md`: 完整使用指南 |
| 80 | +- `examples/sync-backup.examples.js`: 6个示例 |
| 81 | + |
| 82 | +--- |
| 83 | + |
| 84 | +## ⚠️ 前提条件 |
| 85 | + |
| 86 | +使用 Change Stream 同步需要满足: |
| 87 | + |
| 88 | +1. **MongoDB Replica Set** 🔴 |
| 89 | + ```bash |
| 90 | + rs.status() # 检查 |
| 91 | + rs.initiate() # 初始化(单节点转 Replica Set) |
| 92 | + ``` |
| 93 | + |
| 94 | +2. **MongoDB 版本 >= 4.0** 🔴 |
| 95 | + |
| 96 | +3. **用户权限** 🔴 |
| 97 | + - 需要 `changeStream` 权限 |
| 98 | + |
| 99 | +--- |
| 100 | + |
| 101 | +## 📊 性能影响 |
| 102 | + |
| 103 | +| 写入 QPS | 主库 CPU | 主库内存 | 同步延迟 | |
| 104 | +|---------|---------|---------|---------| |
| 105 | +| 100 | +0.5% | +10MB | 10-50ms | |
| 106 | +| 1000 | +1% | +20MB | 50-200ms | |
| 107 | +| 5000 | +2% | +50MB | 200-500ms | |
| 108 | + |
| 109 | +--- |
| 110 | + |
| 111 | +## 🔧 API |
| 112 | + |
| 113 | +### 构造函数选项 |
| 114 | + |
| 115 | +```javascript |
| 116 | +{ |
| 117 | + sync: { |
| 118 | + enabled: boolean, // 是否启用 |
| 119 | + targets: Array, // 备份目标 |
| 120 | + resumeToken: Object, // Resume Token 配置 |
| 121 | + filter: Function, // 过滤函数(可选) |
| 122 | + transform: Function // 转换函数(可选) |
| 123 | + } |
| 124 | +} |
| 125 | +``` |
| 126 | + |
| 127 | +### 实例方法 |
| 128 | + |
| 129 | +```javascript |
| 130 | +// 获取统计 |
| 131 | +msq._syncManager.getStats() |
| 132 | + |
| 133 | +// 手动停止 |
| 134 | +await msq._syncManager.stop() |
| 135 | + |
| 136 | +// 手动启动 |
| 137 | +await msq._syncManager.start() |
| 138 | +``` |
| 139 | + |
| 140 | +--- |
| 141 | + |
| 142 | +## 📚 完整文档 |
| 143 | + |
| 144 | +- [使用指南](../docs/sync-backup.md) |
| 145 | +- [示例代码](../examples/sync-backup.examples.js) |
| 146 | +- [方案设计](../plans/requirements/req-sync-changestream-final-v1.0.9.md) |
| 147 | +- [验证报告](../reports/monSQLize/verification/sync-changestream-verification-v1.0.9.md) |
| 148 | + |
| 149 | +--- |
| 150 | + |
| 151 | +## 🎯 应用场景 |
| 152 | + |
| 153 | +1. **多地容灾**: 同步到多个地域的备份库 |
| 154 | +2. **数据备份**: 实时备份到专用备份库 |
| 155 | +3. **数据仓库**: 同步到分析库(ETL) |
| 156 | +4. **跨集群同步**: 同步到其他 MongoDB 集群 |
| 157 | + |
| 158 | +--- |
| 159 | + |
| 160 | +## ⚡ 性能优化建议 |
| 161 | + |
| 162 | +1. **过滤不必要的集合** |
| 163 | + ```javascript |
| 164 | + collections: ['users', 'orders'] // 不要用 ['*'] |
| 165 | + ``` |
| 166 | + |
| 167 | +2. **使用 Redis 存储 Resume Token** |
| 168 | + ```javascript |
| 169 | + resumeToken: { storage: 'redis', redis: redisInstance } |
| 170 | + ``` |
| 171 | + |
| 172 | +3. **数据转换尽量轻量** |
| 173 | + ```javascript |
| 174 | + transform: (doc) => { |
| 175 | + delete doc.heavyField; // 删除大字段 |
| 176 | + return doc; |
| 177 | + } |
| 178 | + ``` |
| 179 | + |
| 180 | +--- |
| 181 | + |
| 182 | +## 🐛 已知限制 |
| 183 | + |
| 184 | +1. **必须是 Replica Set**: 单节点不支持 Change Stream |
| 185 | +2. **初次启动无历史数据**: 只同步启动后的变更 |
| 186 | +3. **Resume Token 丢失**: 重启后从当前时间开始 |
| 187 | + |
| 188 | +--- |
| 189 | + |
| 190 | +_发布时间: 2026-01-17_ |
| 191 | +_版本: v1.0.9_ |
| 192 | + |
0 commit comments