276 lines
5.9 KiB
Markdown
276 lines
5.9 KiB
Markdown
**不需要手动同步数据**。MongoDB副本集会**自动同步**数据。但是,根据你10上已有数据的大小,初始化同步的方式会有所不同。
|
||
|
||
## 1. 两种同步方式
|
||
|
||
### A. 初始同步(Initial Sync)- **自动进行**
|
||
如果11是全新的(没有数据),MongoDB会自动执行初始同步:
|
||
- 11会从10复制所有数据
|
||
- 自动创建所有数据库和集合
|
||
- 自动复制所有索引
|
||
- 整个过程自动完成,无需人工干预
|
||
|
||
### B. 增量同步
|
||
如果11已经有部分数据,MongoDB会使用增量同步:
|
||
- 从oplog中复制自上次同步以来的变化
|
||
- 自动补全缺失的数据
|
||
|
||
## 2. 正确搭建步骤(10已有数据)
|
||
|
||
### 步骤1:配置10(已有数据的主节点)
|
||
|
||
确保10的配置文件正确:
|
||
```yaml
|
||
# /usr/local/mongodb/conf/mongo.conf
|
||
net:
|
||
port: 37017
|
||
bindIp: 0.0.0.0
|
||
|
||
storage:
|
||
dbPath: /usr/local/mongodb/data # 这里已经有数据
|
||
|
||
systemLog:
|
||
destination: file
|
||
path: /usr/local/mongodb/logs/mongodb.log
|
||
logAppend: true
|
||
|
||
processManagement:
|
||
fork: true
|
||
|
||
replication:
|
||
replSetName: rs0
|
||
```
|
||
|
||
启动10:
|
||
```bash
|
||
/usr/local/mongodb/bin/mongod --config /usr/local/mongodb/conf/mongo.conf
|
||
```
|
||
|
||
### 步骤2:准备11(从节点)
|
||
|
||
**重要**:确保11的数据目录是空的或不存在:
|
||
```bash
|
||
# 在11上执行
|
||
# 停止MongoDB(如果正在运行)
|
||
pkill mongod
|
||
|
||
# 清空数据目录(如果已有数据)
|
||
rm -rf /usr/local/mongodb/data/*
|
||
# 或者备份后删除
|
||
|
||
# 确保目录存在
|
||
mkdir -p /usr/local/mongodb/data
|
||
```
|
||
|
||
11的配置文件与10相同,启动11:
|
||
```bash
|
||
/usr/local/mongodb/bin/mongod --config /usr/local/mongodb/conf/mongo.conf
|
||
```
|
||
|
||
### 步骤3:初始化副本集(在10上)
|
||
|
||
连接到10:
|
||
```bash
|
||
/usr/local/mongodb/bin/mongo --host 192.168.124.10 --port 37017
|
||
```
|
||
|
||
初始化副本集,**只添加10自己**:
|
||
```javascript
|
||
// 先只添加10自己
|
||
rs.initiate({
|
||
_id: "rs0",
|
||
members: [
|
||
{ _id: 0, host: "10.101.2.197:37017", priority: 10 }
|
||
]
|
||
})
|
||
```
|
||
|
||
等待几秒,确认10已成为主节点:
|
||
```javascript
|
||
rs.status()
|
||
```
|
||
|
||
### 步骤4:添加从节点11
|
||
|
||
```javascript
|
||
// 添加11作为从节点
|
||
rs.add({ host: "10.101.3.43:37017", priority: 1 })
|
||
|
||
// 或者更详细的配置
|
||
rs.add({
|
||
host: "192.168.124.11:37017",
|
||
priority: 1,
|
||
votes: 1,
|
||
hidden: false,
|
||
slaveDelay: 0
|
||
})
|
||
```
|
||
|
||
可重新配置权重
|
||
|
||
```javascript
|
||
// 获取当前配置
|
||
var cfg = rs.conf();
|
||
|
||
// 修改对应ID 权重
|
||
cfg.members[0].priority = 10; // _id: 0
|
||
cfg.members[1].priority = 1; // _id: 1
|
||
|
||
//应用新配置
|
||
rs.reconfig(cfg);
|
||
```
|
||
|
||
## 3. 监控同步进度
|
||
|
||
### 查看同步状态:
|
||
```javascript
|
||
// 在10上查看
|
||
rs.status()
|
||
|
||
// 重点关注11的状态
|
||
rs.status().members[1]
|
||
```
|
||
|
||
### 查看同步进度:
|
||
```javascript
|
||
// 在11上执行
|
||
rs.slaveOk() // 3.6版本用这个
|
||
use local
|
||
db.oplog.rs.find().sort({$natural: -1}).limit(1)
|
||
|
||
// 查看正在同步的数据库
|
||
db.currentOp().inprog.forEach(function(op) {
|
||
if (op.msg && op.msg.indexOf("initial sync") !== -1) {
|
||
printjson(op);
|
||
}
|
||
})
|
||
```
|
||
|
||
### 查看数据同步详情:
|
||
```javascript
|
||
// 在11上查看各数据库同步状态
|
||
show dbs
|
||
|
||
// 查看具体集合的数据量
|
||
use your_database_name
|
||
db.collection_name.count()
|
||
```
|
||
|
||
## 4. 同步过程的注意事项
|
||
|
||
### 数据量大时的建议:
|
||
1. **网络带宽**:确保10和11之间的网络畅通
|
||
2. **oplog大小**:检查10的oplog是否足够大
|
||
```javascript
|
||
use local
|
||
db.oplog.rs.stats()
|
||
```
|
||
3. **磁盘空间**:确保11有足够的磁盘空间
|
||
|
||
### 如果同步中断:
|
||
```javascript
|
||
// 查看同步错误
|
||
rs.status().members[1].lastHeartbeatMessage
|
||
|
||
// 重启同步
|
||
rs.syncFrom("192.168.124.10:37017")
|
||
```
|
||
|
||
## 5. 验证同步完成
|
||
|
||
### 检查点:
|
||
1. **状态检查**:
|
||
```javascript
|
||
rs.status().members[1].stateStr === "SECONDARY"
|
||
rs.status().members[1].health === 1
|
||
```
|
||
|
||
2. **数据一致性检查**:
|
||
```javascript
|
||
// 在10上
|
||
use your_database
|
||
db.stats()
|
||
|
||
// 在11上(启用读取后)
|
||
rs.slaveOk()
|
||
use your_database
|
||
db.stats() // 应该与10相同
|
||
```
|
||
|
||
3. **索引检查**:
|
||
```javascript
|
||
// 在10上
|
||
db.collection.getIndexes()
|
||
|
||
// 在11上
|
||
db.collection.getIndexes() // 应该相同
|
||
```
|
||
|
||
## 6. 设置10始终为主节点
|
||
|
||
```javascript
|
||
// 确保10优先级更高
|
||
var cfg = rs.conf();
|
||
cfg.members[0].priority = 10; // 10的优先级很高
|
||
cfg.members[1].priority = 1; // 11的优先级较低
|
||
rs.reconfig(cfg);
|
||
```
|
||
|
||
## 7. 特殊情况的处理
|
||
|
||
### 情况1:数据量非常大(TB级)
|
||
如果数据量非常大,初始同步可能很慢,可以考虑:
|
||
1. 使用物理备份恢复:
|
||
```bash
|
||
# 在10上创建备份
|
||
mongodump --host 192.168.124.10 --port 37017 --out /backup/
|
||
|
||
# 在11上恢复
|
||
mongorestore --host 192.168.124.11 --port 37017 /backup/
|
||
```
|
||
|
||
2. 然后添加到副本集
|
||
|
||
### 情况2:需要保证业务连续性
|
||
可以在业务低峰期执行:
|
||
```javascript
|
||
// 设置11的优先级为0,暂时不参与选举
|
||
rs.add({ host: "192.168.124.11:37017", priority: 0 })
|
||
|
||
// 等待同步完成
|
||
// 然后修改优先级
|
||
var cfg = rs.conf();
|
||
cfg.members[1].priority = 1;
|
||
rs.reconfig(cfg);
|
||
```
|
||
|
||
## 8. 最佳实践建议
|
||
|
||
1. **顺序很重要**:
|
||
- 先启动并配置主节点(10)
|
||
- 再启动从节点(11)**数据目录为空**
|
||
- 最后添加从节点到副本集
|
||
|
||
2. **监控同步**:
|
||
```javascript
|
||
// 定期检查同步状态
|
||
while (true) {
|
||
printjson(rs.status().members[1]);
|
||
sleep(5000); // 每5秒检查一次
|
||
}
|
||
```
|
||
|
||
3. **性能考虑**:
|
||
- 初始同步期间,10的负载会增加
|
||
- 考虑在业务低峰期操作
|
||
- 监控网络流量和磁盘IO
|
||
|
||
## 总结
|
||
|
||
**你不需要手动同步数据**,MongoDB会自动完成。你需要做的:
|
||
1. ✅ 确保10已有数据并正确配置
|
||
2. ✅ 确保11的数据目录是空的
|
||
3. ✅ 先初始化10为单成员副本集
|
||
4. ✅ 然后添加11,自动同步开始
|
||
5. ✅ 设置优先级确保10始终为主
|
||
|
||
整个过程是自动化的,MongoDB会处理所有的数据复制和同步工作。 |