# MongoDB副本集简洁
* * * * *
--: 作者:Mick
时间:2018年8月20日
* * * * *
### 生成认证秘钥Key
```
openssl rand -base64 745 > /data/mongodb/KeyFile.file
chmod 600 /data/mongodb/KeyFile.file
// 该key的权限必须是600,然后将其放到每一台服务器上
```
### 副本集配置
```
replication:
replSetName: 副本集合的名称自定义
security:
keyFile: /data/mongodb/KeyFile.file
```
#### 主节点初始化
> rs.initiate() //初始化方法
{
"info2" : "no configuration specified. Using a default configuration for the set", //代表成功
"me" : "192.168.154.128:27717",
"ok" : 1,
"operationTime" : Timestamp(1532137496, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1532137496, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
magic:OTHER> //magic表示副本集合名称
#### 主节点上添加从节点
magic:OTHER> rs.add("192.168.154.129:27717") // Ip : Port
{
"ok" : 1, // 代表成功
"operationTime" : Timestamp(1532138221, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1532138221, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
#### 主节点查看从节点状态
magic:PRIMARY> rs.status() // "health" : 1 表示全部正常
#### 从节点启动副本集合
> rs.slaveOk() //备份节点默认是不对外提供读写功能的,如果想在备份节点提供读操作的话,需要执行rs.slaveOk()
magic:SECONDARY> // magic表示副本集名称 SECONDARY表示从节点
magic:PRIMARY> db.oplog.rs.findOne({})
### 副本集深入
#### oplog大小以及意义
副本集大小:oplogSize是磁盘空闲空间的5%,最大不超过50G
复制时间窗口:按照记录条数封顶, 按照文件体积封顶
#### oplog格式详解
magic:PRIMARY> db.oplog.rs.findOne({})
{
"ts" : Timestamp(1532137496, 1),
"h" : NumberLong("4089369247341483049"),
"v" : 2,
"op" : "n",
"ns" : "",
"wall" : ISODate("2018-07-21T01:44:56.101Z"),
"o" : {
"msg" : "initiating set"
}
}
ts 操作发生的时间戳
h 操作唯一标识符ID
v oplog的版本
op 操作类型 insert, delete, update, db cmd, null
ns 操作发生的命名空间 database_name.collection_name
o 操作对应的文档
o2 仅对update操作,更新操作的变更台条件
### 副本集常用命令
#### 主节点查看从节点状态
magic:PRIMARY> db.isMaster()
"ismaster" : true //表示是主节点, 从节点显示 "secondary" : true
#### 查看oplog信息
magic:PRIMARY> rs.printReplicationInfo()
configured oplog size: 990MB //表示副本集容量
log length start to end: 1462secs (0.41hrs)
oplog first event time: Sat Jul 21 2018 09:44:56 GMT+0800 (CST)
oplog last event time: Sat Jul 21 2018 10:09:18 GMT+0800 (CST)
now: Sat Jul 21 2018 10:09:23 GMT+0800 (CST)
#### 查看从节点信息
magic:PRIMARY> db.printSlaveReplicationInfo()
source: 192.168.154.130:27717 // 表示从节点 Ip:Port信息
syncedTo: Sat Jul 21 2018 10:14:38 GMT+0800 (CST)
0 secs (0 hrs) behind the primary // 表示延迟时间
source: 192.168.154.129:27717
syncedTo: Sat Jul 21 2018 10:14:38 GMT+0800 (CST)
0 secs (0 hrs) behind the primary
#### 在主节点上删除从节点
magic:PRIMARY> rs.remove("192.168.154.129:27717")
{
"ok" : 1,
"operationTime" : Timestamp(1532139128, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1532139128, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
#### 主节点主动降级(在重选的过程中有可能还被选举成主节点)
magic:PRIMARY> rs.stepDown(2) // 2S后执行
{
"operationTime" : Timestamp(1532165884, 17),
"ok" : 0,
"errmsg" : "stepdown period must be longer than secondaryCatchUpPeriodSecs",
"code" : 2,
"codeName" : "BadValue",
"$clusterTime" : {
"clusterTime" : Timestamp(1532165884, 17),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
#### 冻结某个节点使其在此期间不能成为主节点在rs.stepDown()使用
magic:PRIMARY> rs.freeze(100) // 冻结100S
{
"operationTime" : Timestamp(1532165884, 38),
"ok" : 0,
"errmsg" : "cannot freeze node when primary or running for election. state: Primary",
"code" : 95,
"codeName" : "NotSecondary",
"$clusterTime" : {
"clusterTime" : Timestamp(1532165884, 38),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
#### 修改配置文件
con = rs.conf() // 获取原始的配置文件
con.members[0].host = "192.168.1.105:27717" //使用点操作修改
rs.reconfig(con) // 更改配置文件