Mongodb復制集配置


環境:

192.168.99.129 master
192.168.99.130 slave1

1、配置復制集

在兩台服務器上分別執行

mongod --replSet "rs0"

執行mongo命令,先添加一台

rs.initiate( {
   _id : "rs0",
   members: [ { _id : 0, host : "master:27017" } ]
})

再添加另外一台

rs.add("slave1")

執行rs.status()查看復制集節點的狀態

rs0:PRIMARY> rs.status()
{
    "set" : "rs0",
    "date" : ISODate("2017-01-01T05:08:29.623Z"),
    "myState" : 1,
    "term" : NumberLong(3),
    "heartbeatIntervalMillis" : NumberLong(2000),
    "optimes" : {
        "lastCommittedOpTime" : {
            "ts" : Timestamp(1483247303, 1),
            "t" : NumberLong(3)
        },
        "appliedOpTime" : {
            "ts" : Timestamp(1483247303, 1),
            "t" : NumberLong(3)
        },
        "durableOpTime" : {
            "ts" : Timestamp(1483247303, 1),
            "t" : NumberLong(3)
        }
    },
    "members" : [
        {
            "_id" : 0,
            "name" : "master:27017",
            "health" : 1,
            "state" : 1,
            "stateStr" : "PRIMARY",
            "uptime" : 38,
            "optime" : {
                "ts" : Timestamp(1483247303, 1),
                "t" : NumberLong(3)
            },
            "optimeDate" : ISODate("2017-01-01T05:08:23Z"),
            "infoMessage" : "could not find member to sync from",
            "electionTime" : Timestamp(1483247282, 1),
            "electionDate" : ISODate("2017-01-01T05:08:02Z"),
            "configVersion" : 2,
            "self" : true
        },
        {
            "_id" : 1,
            "name" : "slave1:27017",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 33,
            "optime" : {
                "ts" : Timestamp(1483247303, 1),
                "t" : NumberLong(3)
            },
            "optimeDurable" : {
                "ts" : Timestamp(1483247303, 1),
                "t" : NumberLong(3)
            },
            "optimeDate" : ISODate("2017-01-01T05:08:23Z"),
            "optimeDurableDate" : ISODate("2017-01-01T05:08:23Z"),
            "lastHeartbeat" : ISODate("2017-01-01T05:08:29.007Z"),
            "lastHeartbeatRecv" : ISODate("2017-01-01T05:08:27.902Z"),
            "pingMs" : NumberLong(0),
            "syncingTo" : "master:27017",
            "configVersion" : 2
        }
    ],
    "ok" : 1
}

2、驗證復制集數據同步

在主節點插入數據后,看從節點是否存在同樣的數據,但在從節點執行查詢數據庫指令時拋錯

rs0:SECONDARY> show dbs
2016-12-31T20:49:59.362-0800 E QUERY    [main] Error: listDatabases failed:{
    "ok" : 0,
    "errmsg" : "not master and slaveOk=false",
    "code" : 13435,
    "codeName" : "NotMasterNoSlaveOk"
} :

因為從節點默認是不允許讀寫的,解決這個問題,有兩種方式

  1. 在從節點上執行rs.slaveOk()
  2. 或者在主節點上執行db.getMongo().setSlaveOk()

下面開始驗證

首先在主節點上插入數據

rs0:PRIMARY> db.student.insert({"name":"xiaoming"})
WriteResult({ "nInserted" : 1 })
rs0:PRIMARY> db.student.find()
{ "_id" : ObjectId("58688fa863a36c070316cd69"), "name" : "xiaoming" }

然后在從節點上可以查詢到這條數據

rs0:SECONDARY> db.student.find()
{ "_id" : ObjectId("58688fa863a36c070316cd69"), "name" : "xiaoming" }

 3、驗證復制集故障遷移

mongodb的復制集至少有3個節點才會自動故障遷移,當只有兩個節點時,主節點掛掉,從節點的日志顯示

Not starting an election, since we are not electable due to: Not standing for election because I cannot see a majority (mask 0x1)

所以要再添加一個節點,才能驗證,執行如下命令啟動第三個節點

mongod --replSet "rs0" --port 27018 --dbpath /data/db2 &

在主節點上執行如下命令,將第三個節點添加到集群中

rs.add("slave1:27018")

此時將主節點的進程殺掉,在其他從節點上執行rs.status()查看結果如下:

"members" : [
        {
            "_id" : 0,
            "name" : "master:27017",
            "health" : 0,
            "state" : 8,
            "stateStr" : "(not reachable/healthy)",
            "uptime" : 0,
            "optime" : {
                "ts" : Timestamp(0, 0),
                "t" : NumberLong(-1)
            },
            "optimeDurable" : {
                "ts" : Timestamp(0, 0),
                "t" : NumberLong(-1)
            },
            "optimeDate" : ISODate("1970-01-01T00:00:00Z"),
            "optimeDurableDate" : ISODate("1970-01-01T00:00:00Z"),
            "lastHeartbeat" : ISODate("2017-01-01T14:41:23.260Z"),
            "lastHeartbeatRecv" : ISODate("2017-01-01T14:41:03.671Z"),
            "pingMs" : NumberLong(0),
            "lastHeartbeatMessage" : "Connection refused",
            "configVersion" : -1
        },
        {
            "_id" : 1,
            "name" : "slave1:27017",
            "health" : 1,
            "state" : 1,
            "stateStr" : "PRIMARY",
            "uptime" : 317,
            "optime" : {
                "ts" : Timestamp(1483281677, 2),
                "t" : NumberLong(8)
            },
            "optimeDate" : ISODate("2017-01-01T14:41:17Z"),
            "infoMessage" : "could not find member to sync from",
            "electionTime" : Timestamp(1483281677, 1),
            "electionDate" : ISODate("2017-01-01T14:41:17Z"),
            "configVersion" : 3,
            "self" : true
        },
        {
            "_id" : 2,
            "name" : "slave1:27018",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 75,
            "optime" : {
                "ts" : Timestamp(1483281677, 2),
                "t" : NumberLong(8)
            },
            "optimeDurable" : {
                "ts" : Timestamp(1483281677, 2),
                "t" : NumberLong(8)
            },
            "optimeDate" : ISODate("2017-01-01T14:41:17Z"),
            "optimeDurableDate" : ISODate("2017-01-01T14:41:17Z"),
            "lastHeartbeat" : ISODate("2017-01-01T14:41:23.252Z"),
            "lastHeartbeatRecv" : ISODate("2017-01-01T14:41:22.253Z"),
            "pingMs" : NumberLong(0),
            "syncingTo" : "slave1:27017",
            "configVersion" : 3
        }
    ],
    "ok" : 1
}

 


免責聲明!

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



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