MongoDB 副本集管理(不定時更新)


簡介:

      前面介紹完了副本集的搭建用戶的管理參數日常操作的說明,那副本集搭建好該如何管理呢?現在來說明下副本集的日常查看和管理。

說明:

1)查看命令行參數db.serverCmdLineOpts()

zjy:PRIMARY> db.serverCmdLineOpts()
{
    "argv" : [
        "mongod",
        "-f",
        "/etc/mongodb/mongodb_27017.conf"
    ],
    "parsed" : {
        "config" : "/etc/mongodb/mongodb_27017.conf",
        "diaglog" : 3,
        "net" : {
            "maxIncomingConnections" : 50,
            "port" : 27017,
            "unixDomainSocket" : {
                "pathPrefix" : "/tmp"
            }
        },
        "processManagement" : {
            "fork" : true,
            "pidFilePath" : "/var/run/mongo_27017.pid"
        },
        "replication" : {
            "replSet" : "zjy/127.0.0.1:27018"
        },
        "storage" : {
            "dbPath" : "/usr/local/mongo1/",
            "mmapv1" : {
                "nsSize" : 16
            }
        },
        "systemLog" : {
            "destination" : "file",
            "logAppend" : true,
            "path" : "/var/log/mongodb/mongodb1.log"
        }
    },
    "ok" : 1
}

2)查看副本集狀態rs.status()

zjy:PRIMARY> rs.status()
{
    "set" : "zjy",  #副本集名稱
    "date" : ISODate("2015-06-30T04:07:29.380Z"), #執行時間
    "myState" : 1, 
    "members" : [  #成員
        {
            "_id" : 1,
            "name" : "127.0.0.1:27017", #成員名稱
            "health" : 1,
            "state" : 1,   #成員狀態,1:Primary
            "stateStr" : "PRIMARY", #狀態描述
            "uptime" : 27104, #副本集運行時間,Primary為MongoDB運行時間,單位秒
            "optime" : Timestamp(1435301307, 10), #最近一次更改數據庫的時間:1435301307;每秒執行操作數據庫的次數:10 "optimeDate" : ISODate("2015-06-26T06:48:27Z"),#最后一個操作發生的時間
            "electionTime" : Timestamp(1435610150, 1),
            "electionDate" : ISODate("2015-06-29T20:35:50Z"),#最后選舉時間
            "configVersion" : 31300,
            "self" : true    #執行該命令函數的成員
        },
        {
            "_id" : 2,
            "name" : "127.0.0.1:27018",
            "health" : 1,
            "state" : 2, #成員狀態,2:Secondary
            "stateStr" : "SECONDARY",
            "uptime" : 27098,
            "optime" : Timestamp(1435301307, 10),
            "optimeDate" : ISODate("2015-06-26T06:48:27Z"),
            "lastHeartbeat" : ISODate("2015-06-30T04:07:28.589Z"), #最后一次收到其他成員心跳時間
            "lastHeartbeatRecv" : ISODate("2015-06-30T04:07:27.784Z"),
            "pingMs" : 0,  #心跳發送到達時間,根據其選擇從哪個成員進行同步
            "syncingTo" : "127.0.0.1:27017", #同步成員地址
            "configVersion" : 31300
        },
        {
            "_id" : 3,
            "name" : "127.0.0.1:27019",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 27094,
            "optime" : Timestamp(1435301307, 10),
            "optimeDate" : ISODate("2015-06-26T06:48:27Z"),
            "lastHeartbeat" : ISODate("2015-06-30T04:07:28.521Z"),
            "lastHeartbeatRecv" : ISODate("2015-06-30T04:07:28.521Z"),
            "pingMs" : 0,
            "syncingTo" : "127.0.0.1:27017",
            "configVersion" : 31300
        }
    ],
    "ok" : 1
}

mongod實例每隔兩秒就會向其他成員發送一個心跳包,並且通過rs.status()中返回的成員的health來判斷成員的狀態。如果primary節點不可用了,那么復制集中的所有secondary節點都會觸發一次選舉操作。選出新的primary節點。如果secondary節點有多個,則會選舉擁有最新oplog時間戳記錄的或者有較高權限的節點成為primary(注意:如果secondary停止時間過長,導致primary節點的oplog內容被循環寫覆蓋掉,則需要手動同步secondary節點)。

3)添加、刪除副本集成員rs.add,rs.addArb(),rs.remove(),rs.reconfig()

1,添加成員
rs.add('127.0.0.1:27020')
在添加成員之前,需要在目標成員里加上repset參數。

2,添加復雜的成員:
rs.add({"_id":4,"host":"192.168.200.252:27017","priority":0,"hidden":true,"slaveDelay":60})
不會成為主節點(被動節點),隱藏節點、延遲60s同步數據。適用於當作備份;
rs.add({"_id":4,"host":"192.168.200.252:27017","votes":0})
沒有選舉權限的節點,即使只剩下單個服務器的副本集,也不會成為Secondary
rs.add({"_id":4,"host":"192.168.200.252:27017","buildIndexes":false})
不會同步索引的創建
rs.add({"_id":4,"host":"192.168.200.252:27017","arbiterOnly":true}) rs.addArb()
只選舉,不會同步數據

以上都可以通過rs.reconfig()來實現。
3,刪除成員 rs.remove('127.0.0.1:27020')

4)查看副本集的配置rs.config()

zjy:PRIMARY> rs.config()
{
    "_id" : "zjy",      #副本集名稱
    "version" : 31300,
    "members" : [       #各成員的配置選項
        {
            "_id" : 1,
            "host" : "127.0.0.1:27017",
            "arbiterOnly" : false,
            "buildIndexes" : true,
            "hidden" : false,
            "priority" : 3,
            "tags" : {
                
            },
            "slaveDelay" : 0,
            "votes" : 1
        },
...
...
... ],
"settings" : { "chainingAllowed" : false, "heartbeatTimeoutSecs" : 10, "getLastErrorModes" : { }, "getLastErrorDefaults" : { "w" : 1, "wtimeout" : 0 } } }

5)修改任一Secondary的同步源replSetSyncFrom(rs.syncFrom()),需要在Secondary上執行。

查看其中的一個Secondary的同步源
zjy:SECONDARY> db.adminCommand({"replSetGetStatus":1}).syncingTo 127.0.0.1:27017
# 本機是27019實例,暫時需要把這個實例從27018上同步:
zjy:SECONDARY
> db.adminCommand({"replSetSyncFrom":"127.0.0.1:27018"}) <==> rs.syncFrom("127.0.0.1:27018") { "syncFromRequested" : "127.0.0.1:27018", "prevSyncTarget" : "127.0.0.1:27017", "ok" : 1 } zjy:SECONDARY> db.adminCommand({"replSetGetStatus":1}).syncingTo 127.0.0.1:27018
也可以通過rs.status()來查看其同步源 zjy:SECONDARY> rs.status().syncingTo 127.0.0.1:27018

6)讓任一Secondary進入維護模式replSetMaintenance,必須在Secondary里的admin下運行,之后會進入RECOVERING狀態。

在副本集上執行某個耗時的操作,會讓成員進入recovering模式,不會有讀請求發送給他,如何一個成員遠落后主,可以強制讓其進入維護模式。

zjy:SECONDARY> rs.status().members
[
...
... {
"_id" : 3, "name" : "127.0.0.1:27019", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 39275, "optime" : Timestamp(1435301307, 10), "optimeDate" : ISODate("2015-06-26T06:48:27Z"), "syncingTo" : "127.0.0.1:27018", "configVersion" : 31300, "self" : true } ] zjy:SECONDARY> db.adminCommand({"replSetMaintenance":true}) { "ok" : 1 } zjy:RECOVERING> rs.status().members [ ...
...
{ "_id" : 3, "name" : "127.0.0.1:27019", "health" : 1, "state" : 3, "stateStr" : "RECOVERING", "uptime" : 39313, "optime" : Timestamp(1435301307, 10), "optimeDate" : ISODate("2015-06-26T06:48:27Z"), "syncingTo" : "127.0.0.1:27018", "maintenanceMode" : 1, "configVersion" : 31300, "self" : true } ] 看到127.0.0.1:27019 進入了RECOVERING

當進入維護模式之后,該節點的數據就不能讀取了:

zjy:RECOVERING> db.aoe.find()
Error: error: {
    "$err" : "not master or secondary; cannot currently read from this replSet member",
    "code" : 13436
}

退出維護模式:

zjy:RECOVERING> db.adminCommand({"replSetMaintenance":false})
{ "ok" : 1 }
zjy:SECONDARY> rs.status().members
[
...
... {
"_id" : 3, "name" : "127.0.0.1:27019", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 39425, "optime" : Timestamp(1435301307, 10), "optimeDate" : ISODate("2015-06-26T06:48:27Z"), "syncingTo" : "127.0.0.1:27017", "configVersion" : 31300, "self" : true } ]

 7)限制副本集自動尋找數據源的功能chainingAllowed

由於配置好的副本集都是自動的對同步源進行分配,根據pingMS來尋找最新的數據源,可能某個Secondary是另一個Secondary的同步源。下面就可以關閉自動分配,同步源指到Primary上:

zjy:PRIMARY> rs.config().settings
{
    "chainingAllowed" : true,
    "heartbeatTimeoutSecs" : 10,
    "getLastErrorModes" : {
        
    },
    "getLastErrorDefaults" : {
        "w" : 1,
        "wtimeout" : 0
    }
}
zjy:PRIMARY> var cfg=rs.config()
zjy:PRIMARY> cfg.settings.chainingAllowed
true
zjy:PRIMARY> cfg.settings.chainingAllowed=false
false
zjy:PRIMARY> cfg.settings.chainingAllowed
false
zjy:PRIMARY> rs.reconfig(cfg)
{ "ok" : 1 }
zjy:PRIMARY> rs.config().settings
{
    "chainingAllowed" : false,
    "heartbeatTimeoutSecs" : 10,
    "getLastErrorModes" : {
        
    },
    "getLastErrorDefaults" : {
        "w" : 1,
        "wtimeout" : 0
    }
}

取消自動數據源分配的功能,可以有效的防止復制鏈的出現。但在一定的程度上會加大對Primary的壓力。

8)主節點變成備份節點:rs.stepDown(time),rs.freeze(time) 

rs.stepDown(time) 可以讓主節點退成備份節點,timie單位是秒,默認60s。60s內主被副本集的其他成員獲得,時間到后,會重新進行選舉,一般都會重新成為主(優先級)。

rs.freeze(time):阻止選舉,始終出於備份節點狀態。比如主節點需要做一些維護,不希望其他成員選舉為主節點,可以在每個備份節點上執行。強制他們出於備份節點狀態。

zjy:PRIMARY> rs.stepDown()    #退位60秒,60秒內成為備份節點。
...
...
2015-06-30T12:04:01.670-0400 I NETWORK  trying reconnect to 127.0.0.1:27017 (127.0.0.1) failed
2015-06-30T12:04:01.671-0400 I NETWORK  reconnect 127.0.0.1:27017 (127.0.0.1) ok
zjy:SECONDARY> 

zjy:SECONDARY> rs.freeze(10)    #10秒內保持備份節點狀態。
{ "ok" : 1 }

9)復制延遲狀態查看

zjy:PRIMARY> db.printReplicationInfo()  #主上執行,
configured oplog size:   2823.249984741211MB   #oplog大小
log length start to end: 4086845secs (1135.23hrs) #oplog使用的時間長度
oplog first event time:  Thu May 14 2015 03:13:36 GMT-0400 (EDT) #最先一次操作時間
oplog last event time:   Tue Jun 30 2015 10:27:41 GMT-0400 (EDT) #最后一次操作時間
now:                     Tue Jun 30 2015 13:31:30 GMT-0400 (EDT) #當前時間

zjy:SECONDARY> db.printSlaveReplicationInfo() #從上執行,各個從的落后時間
source: 127.0.0.1:27018
    syncedTo: Tue Jun 30 2015 10:27:41 GMT-0400 (EDT)
    0 secs (0 hrs) behind the primary    #落后時間
source: 127.0.0.1:27019
    syncedTo: Tue Jun 30 2015 10:27:41 GMT-0400 (EDT)
    0 secs (0 hrs) behind the primary 

10)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM