[DataBase] MongoDB (8) 副本集
MongoDB 创建副本集
MongoDB复制是将数据同步在多个服务器的过程。
复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性。
复制还允许您从硬件故障和服务中断中恢复数据。
1. 建立配置文件
mongodb.conf 1 # Start MongoDB as a daemon on port 5568 2 3 port = 5568 4 fork = true 5 replSet = test_replica_set 6 dbpath = /datatest/db 7 logpath = /datatest/db/test.log 8 logappend = true 9 mongodb2.conf 2 3 port = 5569 4 fork = true 5 replSet = test_replica_set 6 dbpath = /datatest/db2 7 logpath = /datatest/db/test2.log 8 logappend = true 9 mongodb3.conf 2 3 port = 5570 4 fork = true 5 replSet = test_replica_set 6 dbpath = /datatest/db3 7 logpath = /datatest/db/test.log 8 logappend = true 9
2. 启动数据库
mac-abeen:bin abeen$ sudo ./mongod -f mongodb.conf about to fork child process, waiting until server is ready for connections. forked process: 37181 child process started successfully, parent exiting mac-abeen:bin abeen$ sudo ./mongod -f mongodb2.conf about to fork child process, waiting until server is ready for connections. forked process: 37185 child process started successfully, parent exiting mac-abeen:bin abeen$ sudo ./mongod -f mongodb3.conf about to fork child process, waiting until server is ready for connections. forked process: 37189 child process started successfully, parent exiting
3. 初始化副本集
mac-abeen:bin abeen$ ./mongo --nodb MongoDB shell version: 3.2.8 > config = {} { } > config = {"_id": "test_replica_set", "members": [ ... {"_id": 0, "host": "localhost:5568"}, {"_id": 1, "host": "localhost:5569"}, {"_id": 2, "host": "localhost:5570"}]} { "_id" : "test_replica_set", "members" : [ { "_id" : 0, "host" : "localhost:5568" }, { "_id" : 1, "host" : "localhost:5569" }, { "_id" : 2, "host" : "localhost:5570" } ] } > db = (new Mongo("localhost:5568")).getDB("test") test > rs.initiate(config) { "ok" : 1 } test_replica_set:OTHER> test_replica_set:PRIMARY> rs.config() { "_id" : "test_replica_set", "version" : 1, "protocolVersion" : NumberLong(1), "members" : [ { "_id" : 0, "host" : "localhost:5568", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : NumberLong(0), "votes" : 1 }, { "_id" : 1, "host" : "localhost:5569", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : NumberLong(0), "votes" : 1 }, { "_id" : 2, "host" : "localhost:5570", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : NumberLong(0), "votes" : 1 } ], "settings" : { "chainingAllowed" : true, "heartbeatIntervalMillis" : 2000, "heartbeatTimeoutSecs" : 10, "electionTimeoutMillis" : 10000, "getLastErrorModes" : { }, "getLastErrorDefaults" : { "w" : 1, "wtimeout" : 0 }, "replicaSetId" : ObjectId("5850f445c8cacd70496883b0") } }
4. 写入数据并查看副本集数据
test_replica_set:PRIMARY> test_replica_set:PRIMARY> for (i=0; i < 100; i++){db.coll.insert({"count": i})} WriteResult({ "nInserted" : 1 }) test_replica_set:PRIMARY> db.coll.count() 100 test_replica_set:PRIMARY> db.coll.find().limit(5) { "_id" : ObjectId("5850f5f35f1a7d82c0b45b51"), "count" : 0 } { "_id" : ObjectId("5850f5f35f1a7d82c0b45b52"), "count" : 1 } { "_id" : ObjectId("5850f5f35f1a7d82c0b45b53"), "count" : 2 } { "_id" : ObjectId("5850f5f35f1a7d82c0b45b54"), "count" : 3 } { "_id" : ObjectId("5850f5f35f1a7d82c0b45b55"), "count" : 4 } 查看副本集是否有数据 mac-abeen:bin abeen$ ./mongo --port 5569 --host localhost MongoDB shell version: 3.2.8 connecting to: localhost:5569/test test_replica_set:SECONDARY> db.coll.find().limit(5) Error: error: { "ok" : 0, "errmsg" : "not master and slaveOk=false", "code" : 13435 } 设置连接可读取数据 test_replica_set:SECONDARY> db.setSlaveOk() 副本中已有数据 test_replica_set:SECONDARY> db.coll.find().limit(5) { "_id" : ObjectId("5850f5f35f1a7d82c0b45b53"), "count" : 2 } { "_id" : ObjectId("5850f5f35f1a7d82c0b45b55"), "count" : 4 } { "_id" : ObjectId("5850f5f35f1a7d82c0b45b52"), "count" : 1 } { "_id" : ObjectId("5850f5f35f1a7d82c0b45b54"), "count" : 3 } { "_id" : ObjectId("5850f5f35f1a7d82c0b45b51"), "count" : 0 }