https://docs.mongodb.com/manual/replication/html
mongo副本集和mongo主從複製不是一回事mongodb
沒幾條命令 篇幅之因此比較長 是有不少查看的信息顯示 不要恐懼 哦 說給我這種膽小鬼聽得 嘻嘻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 查看副本集狀況