复制集配置与管理
复制集的基本概念
MongoDB复制集是一组维护相同数据集的mongod进程,提供数据冗余和高可用性。复制集通常由多个节点组成,其中包含一个主节点和多个从节点。主节点接收所有写操作,从节点通过复制主节点的操作日志来保持数据同步。当主节点不可用时,复制集会自动选举新的主节点,确保服务持续可用。
典型的复制集配置至少需要三个节点:
- 一个主节点(Primary)
- 两个从节点(Secondary)
- 可选的仲裁节点(Arbiter)
// 连接复制集的MongoDB客户端示例
const { MongoClient } = require('mongodb');
const uri = "mongodb://node1.example.com:27017,node2.example.com:27017,node3.example.com:27017/?replicaSet=myReplicaSet";
const client = new MongoClient(uri);
复制集的配置
初始化复制集
配置复制集首先需要在每个节点上启动mongod进程,并指定复制集名称。以下是启动三个节点的示例命令:
# 节点1
mongod --replSet myReplicaSet --dbpath /data/node1 --port 27017
# 节点2
mongod --replSet myReplicaSet --dbpath /data/node2 --port 27018
# 节点3
mongod --replSet myReplicaSet --dbpath /data/node3 --port 27019
初始化复制集需要通过mongo shell连接到其中一个节点并执行初始化命令:
// 在mongo shell中执行
rs.initiate({
_id: "myReplicaSet",
members: [
{ _id: 0, host: "node1.example.com:27017" },
{ _id: 1, host: "node2.example.com:27018" },
{ _id: 2, host: "node3.example.com:27019" }
]
})
复制集成员配置
复制集成员可以配置不同的角色和优先级:
// 配置优先级和隐藏节点
rs.reconfig({
_id: "myReplicaSet",
version: 2,
members: [
{ _id: 0, host: "node1.example.com:27017", priority: 2 },
{ _id: 1, host: "node2.example.com:27018", priority: 1 },
{
_id: 2,
host: "node3.example.com:27019",
priority: 0,
hidden: true,
slaveDelay: 3600 // 延迟1小时同步
}
]
})
复制集的管理
监控复制集状态
使用rs.status()命令可以查看复制集的详细状态信息:
// 获取复制集状态
rs.status()
// 检查复制集配置
rs.conf()
// 查看复制集操作日志状态
rs.printReplicationInfo()
// 查看成员同步状态
rs.printSlaveReplicationInfo()
添加和移除节点
动态添加新节点到复制集:
// 添加新节点
rs.add("node4.example.com:27020")
// 移除节点
rs.remove("node3.example.com:27019")
故障转移测试
手动触发主节点降级以测试故障转移:
// 强制主节点降级为从节点
rs.stepDown(300) // 300秒内不能重新成为主节点
// 查看当前主节点
rs.isMaster()
高级配置选项
读写关注设置
配置复制集的读写关注级别:
// 设置写关注为大多数节点确认
db.products.insertOne(
{ item: "envelope", qty: 100 },
{ writeConcern: { w: "majority", wtimeout: 5000 } }
)
// 设置读偏好为从节点
const collection = client.db("test").collection("products", {
readPreference: 'secondary'
})
数据同步控制
配置oplog大小和同步行为:
# 启动时指定oplog大小(MB)
mongod --replSet myReplicaSet --oplogSize 2048
在运行时调整oplog大小:
// 连接到主节点的local数据库
use local
// 调整oplog大小
db.adminCommand({replSetResizeOplog: 1, size: 2048})
安全配置
复制集认证
启用复制集内部成员认证:
# mongod.conf配置文件
security:
keyFile: /path/to/keyfile
replication:
replSetName: myReplicaSet
创建keyfile并设置权限:
openssl rand -base64 756 > /path/to/keyfile
chmod 400 /path/to/keyfile
TLS/SSL加密
配置复制集成员间的TLS加密:
# mongod.conf配置文件
net:
tls:
mode: requireTLS
certificateKeyFile: /path/to/server.pem
CAFile: /path/to/ca.pem
replication:
replSetName: myReplicaSet
性能优化
读写分离
利用从节点分担读负载:
// 设置读偏好为最近的节点
const collection = client.db("test").collection("products", {
readPreference: 'nearest'
})
// 设置读偏好为特定标签的节点
const collection = client.db("test").collection("products", {
readPreference: {
mode: 'secondary',
tags: [{ region: 'east' }]
}
})
索引管理
确保从节点也建有合适的索引:
// 在主节点创建索引
db.products.createIndex({ item: 1 })
// 在从节点查看索引状态
db.products.getIndexes()
常见问题处理
节点同步延迟
处理节点同步延迟问题:
// 查看延迟情况
db.printSlaveReplicationInfo()
// 可能的解决方案
// 1. 增加oplog大小
// 2. 优化网络连接
// 3. 升级硬件性能
选举问题
诊断选举失败问题:
// 查看选举统计
rs.status().electionMetrics
// 常见原因
// 1. 网络分区
// 2. 节点间时钟不同步
// 3. 配置错误
备份与恢复
复制集备份策略
使用mongodump进行热备份:
# 从从节点备份
mongodump --host node2.example.com --port 27018 --out /backup/path
# 带oplog的备份
mongodump --oplog --out /backup/path
时间点恢复
利用oplog进行时间点恢复:
# 恢复基础备份
mongorestore --host node1.example.com --port 27017 /backup/path
# 应用oplog到指定时间点
mongorestore --oplogReplay --oplogLimit "1631059200" /backup/path
本站部分内容来自互联网,一切版权均归源网站或源作者所有。
如果侵犯了你的权益请来信告知我们删除。邮箱:cc@cccx.cn
上一篇:读写分离与负载均衡
下一篇:复制集监控与故障排查