在企业应用中,肯定不希望数据库做单点部署,如果碰到服务器宕机或者硬件毁灭性故障,将有不可挽回的损失。
主从数据库的架构优势:
<1>数据备份
<2>数据恢复
<3>读写分离
主从数据库搭建过程:
<1>mongodb --dbpath='XXX' --master【主数据库】
<2>mongod --dbpath=xxxx --port=8888 --slave --source=127.0.0.1:27017【从数据库】
当主数据库更新数据的时候,从数据库也相应的更新。
如果还想增加一台从数据库,而且希望是后期指定而不是启动时指定:
主数据库或者从数据库中都有一个叫做local的集合,主要用于存放内部复制信息。
读写分离:
mongoDB默认情况下不支持数据的读取,但是在驱动中提供了一个叫做"slaveokay"来让我们可以经过从数据库读取数据来减轻主数据库的压力。
副本集【重要内容】
副本集特性:
<1>改集群没有特定主数据库
<2>如果哪个主数据库down掉了,集群会马上推选一个服务器作为主数据库。这就是传说中的自动修复功能。
副本集建立步骤:
<1>首先,需要建立一个集群名称--liumengyang,然后通过--replSet属性让服务器知道liumengyang这个集群下面还有其他的服务器。具体命令如下:
mongod --dbpath:***** --port 端口号 ---replSet clusterName/ipaddress:portnum
当把几个服务器全部开启的时候,仍然不好用,需要做以下初始化操作:
> db.runCommand({"replSetInitiate":{
... "_id":"liumengyang",
... "members":[
... {
... "_id":1,
... "host":"127.0.0.1:2222"
... },
... {
... "_id":2,
... "host":"127.0.0.1:3333"
... }
... ]}})
仲裁服务器和状态查看命令:
liumengyang:PRIMARY> rs.addArb("127.0.0.1:4444")
{ "ok" : 1 }
liumengyang:PRIMARY>
liumengyang:PRIMARY>
liumengyang:PRIMARY>
liumengyang:PRIMARY>
liumengyang:PRIMARY> rs.status();
{
"set" : "liumengyang",
"date" : ISODate("2015-09-10T02:42:12.901Z"),
"myState" : 1,
"members" : [
{
"_id" : 1,
"name" : "127.0.0.1:2222",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 1729,
"optime" : Timestamp(1441852921, 1),
"optimeDate" : ISODate("2015-09-10T02:42:01Z"),
"electionTime" : Timestamp(1441852277, 1),
"electionDate" : ISODate("2015-09-10T02:31:17Z"),
"configVersion" : 2,
"self" : true
},
{
"_id" : 2,
"name" : "127.0.0.1:3333",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 747,
"optime" : Timestamp(1441852921, 1),
"optimeDate" : ISODate("2015-09-10T02:42:01Z"),
"lastHeartbeat" : ISODate("2015-09-10T02:42:11.712Z"),
"lastHeartbeatRecv" : ISODate("2015-09-10T02:42:11.337Z"
),
"pingMs" : 0,
"syncingTo" : "127.0.0.1:2222",
"configVersion" : 2
},
{
"_id" : 3,
"name" : "127.0.0.1:4444",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 11,
"lastHeartbeat" : ISODate("2015-09-10T02:42:11.713Z"),
"lastHeartbeatRecv" : ISODate("2015-09-10T02:42:11.364Z"
),
"pingMs" : 0,
"configVersion" : 2
}
],
"ok" : 1
}
liumengyang:PRIMARY> rs.status;
function () { return db._adminCommand("replSetGetStatus"); }
liumengyang:PRIMARY> rs.status();
{
"set" : "liumengyang",
"date" : ISODate("2015-09-10T02:54:20.273Z"),
"myState" : 1,
"members" : [
{
"_id" : 1,
"name" : "127.0.0.1:2222",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 2457,
"optime" : Timestamp(1441852921, 1),
"optimeDate" : ISODate("2015-09-10T02:42:01Z"),
"electionTime" : Timestamp(1441852277, 1),
"electionDate" : ISODate("2015-09-10T02:31:17Z"),
"configVersion" : 2,
"self" : true
},
{
"_id" : 2,
"name" : "127.0.0.1:3333",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 1475,
"optime" : Timestamp(1441852921, 1),
"optimeDate" : ISODate("2015-09-10T02:42:01Z"),
"lastHeartbeat" : ISODate("2015-09-10T02:54:19.834Z"),
"lastHeartbeatRecv" : ISODate("2015-09-10T02:54:19.467Z"
),
"pingMs" : 0,
"syncingTo" : "127.0.0.1:2222",
"configVersion" : 2
},
{
"_id" : 3,
"name" : "127.0.0.1:4444",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 738,
"lastHeartbeat" : ISODate("2015-09-10T02:54:19.849Z"),
"lastHeartbeatRecv" : ISODate("2015-09-10T02:54:19.468Z"
),
"pingMs" : 0,
"configVersion" : 2
}
],
"ok" : 1
}