# 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) // 更改配置文件