實戰mongo副本集

什麼是mongo副本集

https://docs.mongodb.com/manual/replication/html

mongo副本集和mongo主從複製不是一回事mongodb

centos7搭建mongo副本集

沒幾條命令 篇幅之因此比較長  是有不少查看的信息顯示  不要恐懼  哦 說給我這種膽小鬼聽得 嘻嘻shell

PRIMARY 主 ===》 1.1.2.155centos

SECONDARY 副本1 ===》  1.1.2.134服務器

SECONDARY 副本2 仲裁 ===》 1.1.2.129app

1. 搭建三個mongo測試

根據以下鏈接分別在三臺機器上安裝三個mongoui

http://www.cnblogs.com/lazyball/p/8962359.htmlcentos7

2. 建立keyspa

副本和主之間的通訊也是須要認證的,經過key文件認證

建立一個keyfile,而且拷貝到其餘從節點

openssl rand -base64 756 > /data/mongos_m/key
chmod 400 /data/mongos_m/key

三個節點都要有這個key文件,將這個key文件cp搭配每個節點

3. 配置配置文件 mongodb.conf

port = 27111          #端口  
pidfilepath = /data/mongos_m/logs/mongo3717.pid  #pid目錄
dbpath = /data/mongos_m/data/           #數據文件存放目錄  
logpath = /data/mongos_m/logs/mongodb.log      #日誌文件存放目錄
fork = true    #以守護程序的方式啓用,即在後臺運行
auth=true
#如下兩條 每一個mongo的配置文件裏都有  
replSet
=shard1 #副本集的名字 keyFile = /data/mongos_m/key/autokey #其餘mongo根據自身路徑添加配置

重啓mongo

4. 配置複製集

在你打算作主的服務器上執行如下操做

登陸mongo

配置主:

> config = {_id:"shard1", members:[{_id:0,host:"1.1.2.155:27111", priority : 3}]}
{
    "_id" : "shard1",
    "members" : [
        {
            "_id" : 0,
            "host" : "1.1.2.155:27111",
            "priority" : 3
        }
    ]
}

初始化

> rs.initiate(config); 
{ "ok" : 1 }

查看複製集狀態

rs.status();  
{
    "set" : "shard1",  ###副本集名稱
    "date" : ISODate("2018-05-02T03:27:38.036Z"),
    "myState" : 1,
    "term" : NumberLong(1),
    "heartbeatIntervalMillis" : NumberLong(2000),
    "optimes" : {
        "lastCommittedOpTime" : {
            "ts" : Timestamp(1525231650, 1),
            "t" : NumberLong(1)
        },
        "appliedOpTime" : {
            "ts" : Timestamp(1525231650, 1),
            "t" : NumberLong(1)
        },
        "durableOpTime" : {
            "ts" : Timestamp(1525231650, 1),
            "t" : NumberLong(1)
        }
    },
    "members" : [
        {
            "_id" : 0,
            "name" : "1.1.2.155:27111", #主的ip和端口信息
            "health" : 1,
            "state" : 1,
            "stateStr" : "PRIMARY",  #主
            "uptime" : 184,
            "optime" : {
                "ts" : Timestamp(1525231650, 1),
                "t" : NumberLong(1)
            },
            "optimeDate" : ISODate("2018-05-02T03:27:30Z"),
            "infoMessage" : "could not find member to sync from",
            "electionTime" : Timestamp(1525231648, 2),
            "electionDate" : ISODate("2018-05-02T03:27:28Z"),
            "configVersion" : 1,
            "self" : true
        }
    ],
    "ok" : 1
}

添加複製集成員

#以下  添加了兩個成員  觀察敲命令的位置已經變成了shard1:PRIMARY>
shard1:PRIMARY> rs.add("1.1.2.134:27111") { "ok" : 1 } shard1:PRIMARY> rs.add("1.1.2.129:27111") { "ok" : 1 }

查看複製集狀態

shard1:PRIMARY> rs.status();
{
    "set" : "shard1",
    "date" : ISODate("2018-05-02T05:46:24.523Z"),
    "myState" : 1,
    "term" : NumberLong(2),
    "heartbeatIntervalMillis" : NumberLong(2000),
    "optimes" : {
        "lastCommittedOpTime" : {
            "ts" : Timestamp(1525239984, 1),
            "t" : NumberLong(2)
        },
        "appliedOpTime" : {
            "ts" : Timestamp(1525239984, 1),
            "t" : NumberLong(2)
        },
        "durableOpTime" : {
            "ts" : Timestamp(1525239984, 1),
            "t" : NumberLong(2)
        }
    },
    "members" : [
        {
            "_id" : 0,
            "name" : "1.1.2.155:27111",##########
            "health" : 1,
            "state" : 1,
            "stateStr" : "PRIMARY",#########
            "uptime" : 233,
            "optime" : {
                "ts" : Timestamp(1525239984, 1),
                "t" : NumberLong(2)
            },
            "optimeDate" : ISODate("2018-05-02T05:46:24Z"),
            "electionTime" : Timestamp(1525239752, 1),
            "electionDate" : ISODate("2018-05-02T05:42:32Z"),
            "configVersion" : 3,
            "self" : true
        },
        {
            "_id" : 1,
            "name" : "1.1.2.134:27111",#####
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY", #########
            "uptime" : 57,
            "optime" : {
                "ts" : Timestamp(1525239974, 1),
                "t" : NumberLong(2)
            },
            "optimeDurable" : {
                "ts" : Timestamp(1525239974, 1),
                "t" : NumberLong(2)
            },
            "optimeDate" : ISODate("2018-05-02T05:46:14Z"),
            "optimeDurableDate" : ISODate("2018-05-02T05:46:14Z"),
            "lastHeartbeat" : ISODate("2018-05-02T05:46:24.363Z"),
            "lastHeartbeatRecv" : ISODate("2018-05-02T05:46:23.410Z"),
            "pingMs" : NumberLong(1),
            "syncingTo" : "10.10.20.155:27111",
            "configVersion" : 3
        },
        {
            "_id" : 2,
            "name" : "1.1.2.129:27111", #####
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY", #####
            "uptime" : 52,
            "optime" : {
                "ts" : Timestamp(1525239974, 1),
                "t" : NumberLong(2)
            },
            "optimeDurable" : {
                "ts" : Timestamp(1525239974, 1),
                "t" : NumberLong(2)
            },
            "optimeDate" : ISODate("2018-05-02T05:46:14Z"),
            "optimeDurableDate" : ISODate("2018-05-02T05:46:14Z"),
            "lastHeartbeat" : ISODate("2018-05-02T05:46:22.557Z"),
            "lastHeartbeatRecv" : ISODate("2018-05-02T05:46:23.001Z"),
            "pingMs" : NumberLong(0),
            "syncingTo" : "1.1.2.134:27111",
            "configVersion" : 3
        }
    ],
    "ok" : 1
}

查看副本集成員及其優先級(看好成員的順序,優先級從1-100,越大的優先級越高)

shard1:PRIMARY> rs.conf();
{
    "_id" : "shard1",
    "version" : 3,
    "protocolVersion" : NumberLong(1),
    "members" : [
        {
            "_id" : 0,
            "host" : "10.10.20.155:27111",
            "arbiterOnly" : false,
            "buildIndexes" : true,
            "hidden" : false,
            "priority" : 3,
            "tags" : {
                
            },
            "slaveDelay" : NumberLong(0),
            "votes" : 1
        },
        {
            "_id" : 1,
            "host" : "10.10.20.134:27111",
            "arbiterOnly" : false,
            "buildIndexes" : true,
            "hidden" : false,
            "priority" : 1,
            "tags" : {
                
            },
            "slaveDelay" : NumberLong(0),
            "votes" : 1
        },
        {
            "_id" : 2,
            "host" : "10.10.20.129:27111",
            "arbiterOnly" : false,
            "buildIndexes" : true,
            "hidden" : false,
            "priority" : 1,
            "tags" : {
                
            },
            "slaveDelay" : NumberLong(0),
            "votes" : 1
        }
    ],
    "settings" : {
        "chainingAllowed" : true,
        "heartbeatIntervalMillis" : 2000,
        "heartbeatTimeoutSecs" : 10,
        "electionTimeoutMillis" : 10000,
        "catchUpTimeoutMillis" : 2000,
        "getLastErrorModes" : {
            
        },
        "getLastErrorDefaults" : {
            "w" : 1,
            "wtimeout" : 0
        },
        "replicaSetId" : ObjectId("5ae93020e22979d68675c342")
    }
}

進行優先級設置,以便爲了當主死了,能夠由本身指定的服務器做爲主

shard1:PRIMARY> config=rs.conf()  
shard1:PRIMARY> config.members[0].priority = 3; ##根據id修改優先級  主
3
shard1:PRIMARY> config.members[1].priority = 2; ## 從
2
shard1:PRIMARY> config.members[2].priority = 1 ; ##仲裁的
1

保存配置 生效

shard1:PRIMARY> rs.reconfig(config)
{ "ok" : 1 }

到此位置 副本集建立完畢  步驟仍是很清晰明瞭的呢  忽然好喜歡mongo  興趣來了

5. 建立認證用戶

shard1:PRIMARY> db.createUser(
...  {
...      user: "dba",
...      pwd: "dba@2017",
...      roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
...    }
...  )
Successfully added user: {
    "user" : "dba",
    "roles" : [
        {
            "role" : "userAdminAnyDatabase",
            "db" : "admin"
        }
    ]
}
 

6. 測試主從同步

在主上

use test
db.t1.insert({x:1})

而後在兩個從上查看是否有新建立的庫和數據

use test;
show dbs;
db.test.find()

####在從上查看的時候可能有報錯 解決方法以下:

報錯以下:

2018-05-02T13:56:01.550+0800 E QUERY    [thread1] Error: listDatabases failed:{
    "ok" : 0,
    "errmsg" : "not master and slaveOk=false",
    "code" : 13435,
    "codeName" : "NotMasterNoSlaveOk"
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:62:1
shellHelper.show@src/mongo/shell/utils.js:769:19
shellHelper@src/mongo/shell/utils.js:659:15
@(shellhelp2):1:1

解決方法以下:

## 注意觀察  輸入命令的地方 shard1:SECONDARY> 變成了這樣  已是從的狀態了
shard1:SECONDARY> rs.slaveOk(); ## 先執行這個再看 shard1:SECONDARY> show dbs; admin 0.000GB local 0.000GB runoob 0.000GB testtt 0.000GB user 0.000GB shard1:SECONDARY> use testtt; switched to db testtt shard1:SECONDARY> shard1:SECONDARY> db.testtt.find() { "_id" : ObjectId("5ae952dd81d821af964649f7"), "x" : 1 } shard1:SECONDARY> exit

7.測試主從故障切換

在主上  將主停了

use admin
db.shutdownServer()

去從上看 

shard1:SECONDARY> 
shard1:PRIMARY> 
shard1:PRIMARY> 
前綴已經改變 能夠再用命令rs.status();查看一下主從狀態

在新的主上,插入新的數據

shard1:PRIMARY> use test
switched to db test
shard1:PRIMARY> db.t1.insert({x:2})
WriteResult({ "nInserted" : 1 })

而後去另外一個從上查看數據是否同步

shard1:PRIMARY> use test
switched to db test

shard1:PRIMARY> db.t1.find()
{ "_id" : ObjectId("58be61ade717794f6b66b557"), "x" : 1 }
{ "_id" : ObjectId("58be6408d03d16a5c98fbb57"), "x" : 2 }

將主從新啓動  觀察新的數據是否同步  觀察新的主是否又成爲了從

 

這幾天又陸陸續續搭建了幾個副本集,發現主掛了後,從是頂上去了,可是另外的從上去查數據,等了好一會也查不到 一直報錯以下

018-05-03T11:27:13.147+0800 E QUERY    [thread1] Error: listDatabases failed:{
    "ok" : 0,
    "errmsg" : "not master and slaveOk=false",
    "code" : 13435,
    "codeName" : "NotMasterNoSlaveOk"
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:62:1
shellHelper.show@src/mongo/shell/utils.js:769:19
shellHelper@src/mongo/shell/utils.js:659:15
@(shellhelp2):1:1

而後我手動執行

rs.slaveOk();

就能夠了  這讓我疑惑了  難道之後線上主掛了  從還得有上去手動恢復的可能性

知道的人告訴我一下白

這樣一個需求

如今有這樣一個需求

一個有數據的單點mongo作遷移,再以此mongo爲主,配置兩個從

1. mongo的遷移

個人mongo是用二進制包安裝的,遷移的時候將mongo的程序目錄,數據目錄完整複製到新的機器上

修改一下 bind ip就能夠了   路徑啥的的最好不要變了

2. 爲mongo配置主從

每一個mongo的配置文件裏都添加

 

replSet=shard1 #副本集的名字  全部的mongo一致

 

而後主的mongo啓動的時候 或許能夠不用指定 --replSet shard1

/usr/local/mongodb-3.2.16/bin/mongod -f /data/mongodb/conf/mongod.conf  --replSet shard1 &

而後依次啓動 其餘mongo 查看副本集狀況

相關文章
相關標籤/搜索