1. 程式人生 > >[Database] MongoDB 副本集配置

[Database] MongoDB 副本集配置

存儲 8.0 toc utm all 多個服務器 and ecs 數據

MongoDB 副本集配置

MongoDB復制是將數據同步在多個服務器的過程。
復制提供了數據的冗余備份,並在多個服務器上存儲數據副本,提高了數據的可用性, 並可以保證數據的安全性。
復制還允許您從硬件故障和服務中斷中恢復數據。

創建副本集時註意

  1. 版本: 各副本集服務器的MongoDB版本一致或支持同樣的replSet功能
  2. 網絡: 副本集內的每個成員都必須能夠連接到其他成員(包括自身),啟動時註意bind_ip --bind_ip_all.

配置副本集

  • 1 建立配置文件
mongodb.conf

  1 # Start MongoDB as a daemon on port 27017                                                                                                                   
  2 
  3 port = 27017
  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 = 27017
  4 fork = true
  5 replSet = test_replica_set
  6 dbpath = /datatest/db
  7 logpath = /datatest/db/test.log
  8 logappend = true
  9 

mongodb3.conf

  2 
  3 port = 27017
  4 fork = true
  5 replSet = test_replica_set
  6 dbpath = /datatest/db
  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": "192.168.0.10:27017"}, 
        {"_id": 1, "host": "192.168.0.20:27017"}, 
        {"_id": 2, "host": "192.168.0.30:27017"}]}

{
    "_id" : "test_replica_set",
    "members" : [
        {
            "_id" : 0,
            "host" : "192.168.0.10:27017"
        },
        {
            "_id" : 1,
            "host" : "192.168.0.20:27017"
        },
        {
            "_id" : 2,
            "host" : "192.168.0.30:27017"
        }
    ]
}
> db = (new Mongo("192.168.0.10:27017")).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" : "192.168.0.10:27017",
            "arbiterOnly" : false,
            "buildIndexes" : true,
            "hidden" : false,
            "priority" : 1,
            "tags" : {
                
            },
            "slaveDelay" : NumberLong(0),
            "votes" : 1
        },
        {
            "_id" : 1,
            "host" : "192.168.0.20:27017",
            "arbiterOnly" : false,
            "buildIndexes" : true,
            "hidden" : false,
            "priority" : 1,
            "tags" : {
                
            },
            "slaveDelay" : NumberLong(0),
            "votes" : 1
        },
        {
            "_id" : 2,
            "host" : "192.168.0.30:27017",
            "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 }
  • 5 查看副本集是否有數據
mac-abeen:bin abeen$ ./mongo --port 27017 --host 192.168.0.20
MongoDB shell version: 3.2.8
connecting to: 192.168.0.20:27017/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 }

修改副本集

rs.add("server-4:27017")    //添加
rs.addArb("server-4:27017") //添加選舉仲裁者
rs.add({"_id": 4, "host": "server-4:27017", "arbiterOnly": true) //添加選舉仲裁者
rs.add({"_id": 5, "host": "server-5:27017", "priority": 0, "hidden": true) //添加隱藏成員
rs.remove("server-4:27017") //移除

修改副本集,通過rs.reconfig

rs.reconfig修改副本集成員時限制

  • 不能修改成員的_id 字段
  • 不能將接收rs.reconfig命令的成員(通常是主節點)的優先級設為0
  • 不能仲裁者成員變為非仲裁者成員,反之亦然.
  • 不能將buildIndexes: false的成員修改為buildIndexes: true
    可以修改其他,比如host
var config = rs.config()
config.members[1].host = "newsserver:27017" //修改host
rs.reconfig(config)

[Database] MongoDB 副本集配置