MongoDB基础之九 replication复制集
准备工作:创建目录
1 mkdir -p /home/m17 //home/m18 /home/m19 /home/mlog
1:启动3个实例,且声明实例属于某复制集
1 # ./bin/mongod --dbpath /home/m17 --logpath /home/mlog/m17.log --fork --port 27017 --replSet rs2 --smallfiles 2 # ./bin/mongod --dbpath /home/m18 --logpath /home/mlog/m18.log --fork --port 27018 --replSet rs2 --smallfiles 3 # ./bin/mongod --dbpath /home/m19 --logpath /home/mlog/m19.log --fork --port 27019 --replSet rs2 --smallfiles
注:--smallfiles 最小文件创建实例
2:配置复制级
1 var rsconf = { 2 _id:'rs2', 3 members: 4 [ 5 {_id:0, 6 host:'127.0.0.1:27017' 7 }, 8 {_id:1, 9 host:'127.0.0.1:27018' 10 }, 11 {_id:2, 12 host:'127.0.0.1:27019' 13 } 14 15 ] 16 }
1 > printjson(rsconf) 2 { 3 "_id" : "rs2", 4 "members" : [ 5 { 6 "_id" : 0, 7 "host" : "127.0.0.1:27017" 8 }, 9 { 10 "_id" : 1, 11 "host" : "127.0.0.1:27018" 12 }, 13 { 14 "_id" : 2, 15 "host" : "127.0.0.1:27019" 16 } 17 ] 18 }
3: 根据配置做初始化
1 > rs.initiate(rsconf) 2 ; 3 { 4 "info" : "Config now saved locally. Should come online in about a minute.", 5 "ok" : 1 6 } 7 rs2:SECONDARY> rs.status(); 8 { 9 "set" : "rs2", 10 "date" : ISODate("2016-05-26T00:43:57Z"), 11 "myState" : 2, 12 "members" : [ 13 { 14 "_id" : 0, 15 "name" : "127.0.0.1:27017", 16 "health" : 1, 17 "state" : 2, 18 "stateStr" : "SECONDARY", 19 "uptime" : 1183, 20 "optime" : Timestamp(1464223391, 1), 21 "optimeDate" : ISODate("2016-05-26T00:43:11Z"), 22 "self" : true 23 }, 24 { 25 "_id" : 1, 26 "name" : "127.0.0.1:27018", 27 "health" : 1, 28 "state" : 5, 29 "stateStr" : "STARTUP2", 30 "uptime" : 46, 31 "optime" : Timestamp(0, 0), 32 "optimeDate" : ISODate("1970-01-01T00:00:00Z"), 33 "lastHeartbeat" : ISODate("2016-05-26T00:43:54Z"), 34 "lastHeartbeatRecv" : ISODate("2016-05-26T00:43:52Z"), 35 "pingMs" : 189 36 }, 37 { 38 "_id" : 2, 39 "name" : "127.0.0.1:27019", 40 "health" : 1, 41 "state" : 5, 42 "stateStr" : "STARTUP2", 43 "uptime" : 46, 44 "optime" : Timestamp(0, 0), 45 "optimeDate" : ISODate("1970-01-01T00:00:00Z"), 46 "lastHeartbeat" : ISODate("2016-05-26T00:43:44Z"), 47 "lastHeartbeatRecv" : ISODate("2016-05-26T00:43:53Z"), 48 "pingMs" : 0 49 } 50 ], 51 "ok" : 1 52 }
4: 添加节点
1 rs2:PRIMARY> rs.add('127.0.0.1:27018') 2 { "down" : [ "127.0.0.1:27018" ], "ok" : 1 } 3 rs2:PRIMARY> rs.status 4 function () { return db._adminCommand("replSetGetStatus"); } 5 rs2:PRIMARY> rs.status() 6 { 7 "set" : "rs2", 8 "date" : ISODate("2016-05-26T00:51:01Z"), 9 "myState" : 1, 10 "members" : [ 11 { 12 "_id" : 0, 13 "name" : "127.0.0.1:27017", 14 "health" : 1, 15 "state" : 1, 16 "stateStr" : "PRIMARY", 17 "uptime" : 1607, 18 "optime" : Timestamp(1464223853, 1), 19 "optimeDate" : ISODate("2016-05-26T00:50:53Z"), 20 "self" : true 21 }, 22 { 23 "_id" : 2, 24 "name" : "127.0.0.1:27019", 25 "health" : 1, 26 "state" : 2, 27 "stateStr" : "SECONDARY", 28 "uptime" : 85, 29 "optime" : Timestamp(1464223853, 1), 30 "optimeDate" : ISODate("2016-05-26T00:50:53Z"), 31 "lastHeartbeat" : ISODate("2016-05-26T00:51:00Z"), 32 "lastHeartbeatRecv" : ISODate("2016-05-26T00:50:59Z"), 33 "pingMs" : 0, 34 "lastHeartbeatMessage" : "syncing to: 127.0.0.1:27017", 35 "syncingTo" : "127.0.0.1:27017" 36 }, 37 { 38 "_id" : 3, 39 "name" : "127.0.0.1:27018", 40 "health" : 1, 41 "state" : 2, 42 "stateStr" : "SECONDARY", 43 "uptime" : 8, 44 "optime" : Timestamp(1464223853, 1), 45 "optimeDate" : ISODate("2016-05-26T00:50:53Z"), 46 "lastHeartbeat" : ISODate("2016-05-26T00:50:59Z"), 47 "lastHeartbeatRecv" : ISODate("2016-05-26T00:51:00Z"), 48 "pingMs" : 0, 49 "lastHeartbeatMessage" : "syncing to: 127.0.0.1:27017", 50 "syncingTo" : "127.0.0.1:27017" 51 } 52 ], 53 "ok" : 1 54 }
5:查看状态
1 rs.status();
6:删除节点
1 rs2:PRIMARY> rs.remove('127.0.0.1:27018'); 2 Thu May 26 08:49:36.621 DBClientCursor::init call() failed 3 Thu May 26 08:49:36.621 Error: error doing query: failed at src/mongo/shell/query.js:78 4 Thu May 26 08:49:36.622 trying reconnect to 127.0.0.1:27017 5 Thu May 26 08:49:36.622 reconnect 127.0.0.1:27017 ok 6 rs2:PRIMARY> rs.status(); 7 { 8 "set" : "rs2", 9 "date" : ISODate("2016-05-26T00:49:38Z"), 10 "myState" : 1, 11 "members" : [ 12 { 13 "_id" : 0, 14 "name" : "127.0.0.1:27017", 15 "health" : 1, 16 "state" : 1, 17 "stateStr" : "PRIMARY", 18 "uptime" : 1524, 19 "optime" : Timestamp(1464223776, 1), 20 "optimeDate" : ISODate("2016-05-26T00:49:36Z"), 21 "self" : true 22 }, 23 { 24 "_id" : 2, 25 "name" : "127.0.0.1:27019", 26 "health" : 1, 27 "state" : 2, 28 "stateStr" : "SECONDARY", 29 "uptime" : 2, 30 "optime" : Timestamp(1464223776, 1), 31 "optimeDate" : ISODate("2016-05-26T00:49:36Z"), 32 "lastHeartbeat" : ISODate("2016-05-26T00:49:38Z"), 33 "lastHeartbeatRecv" : ISODate("2016-05-26T00:49:37Z"), 34 "pingMs" : 0, 35 "lastHeartbeatMessage" : "syncing to: 127.0.0.1:27017", 36 "syncingTo" : "127.0.0.1:27017" 37 } 38 ], 39 "ok" : 1 40 }
7:主节点插入数据
1 rs2:PRIMARY> show dbs 2 local 4.029296875GB 3 rs2:PRIMARY> 4 rs2:PRIMARY> 5 rs2:PRIMARY> use test 6 switched to db test 7 rs2:PRIMARY> 8 rs2:PRIMARY> db.stu.insert({title:'hello'}); 9 rs2:PRIMARY> 10 rs2:PRIMARY> 11 rs2:PRIMARY> show tables; 12 stu 13 system.indexes
8:连接secondary查询同步情况
1 # ./bin/mongo -port 27019 2 MongoDB shell version: 2.4.9 3 connecting to: 127.0.0.1:27019/test 4 rs2:SECONDARY> use test 5 switched to db test 6 rs2:SECONDARY> show tables 7 Thu May 26 08:59:57.272 error: { "$err" : "not master and slaveOk=false", "code" : 13435 } at src/mongo/shell/query.js:128
8.1 出现上述错误,是因为slave默认不许读写
1 rs2:SECONDARY> rs.slaveOk(); 2 rs2:SECONDARY> show tables 3 stu 4 system.indexes 5 rs2:SECONDARY> db.stu.find(); 6 { "_id" : ObjectId("57464a73c79dad862e06cd3b"), "title" : "hello" }
#看到与primary 一致的数据
9 主节点down机器 ,primary节点自动漂移
1 rs2:PRIMARY> use admin 2 switched to db admin 3 rs2:PRIMARY> db.shutdownServer(); 4 Thu May 26 09:19:33.316 DBClientCursor::init call() failed 5 6 7 rs2:SECONDARY> rs.status() 8 { 9 "set" : "rs2", 10 "date" : ISODate("2016-05-26T01:19:38Z"), 11 "myState" : 2, 12 "syncingTo" : "127.0.0.1:27018", 13 "members" : [ 14 { 15 "_id" : 0, 16 "name" : "127.0.0.1:27017", 17 "health" : 0, 18 "state" : 8, 19 "stateStr" : "(not reachable/healthy)", 20 "uptime" : 0, 21 "optime" : Timestamp(1464224372, 1), 22 "optimeDate" : ISODate("2016-05-26T00:59:32Z"), 23 "lastHeartbeat" : ISODate("2016-05-26T01:19:38Z"), 24 "lastHeartbeatRecv" : ISODate("2016-05-26T01:19:33Z"), 25 "pingMs" : 0 26 }, 27 { 28 "_id" : 2, 29 "name" : "127.0.0.1:27019", 30 "health" : 1, 31 "state" : 2, 32 "stateStr" : "SECONDARY", 33 "uptime" : 3195, 34 "optime" : Timestamp(1464224372, 1), 35 "optimeDate" : ISODate("2016-05-26T00:59:32Z"), 36 "errmsg" : "syncing to: 127.0.0.1:27018", 37 "self" : true 38 }, 39 { 40 "_id" : 3, 41 "name" : "127.0.0.1:27018", 42 "health" : 1, 43 "state" : 1, 44 "stateStr" : "PRIMARY", 45 "uptime" : 1725, 46 "optime" : Timestamp(1464224372, 1), 47 "optimeDate" : ISODate("2016-05-26T00:59:32Z"), 48 "lastHeartbeat" : ISODate("2016-05-26T01:19:38Z"), 49 "lastHeartbeatRecv" : ISODate("2016-05-26T01:19:36Z"), 50 "pingMs" : 0, 51 "syncingTo" : "127.0.0.1:27017" 52 } 53 ], 54 "ok" : 1 55 } 56 57