一、副本集介绍

  搭建副本集是为了实现mongodb高可用。

  Mongodb(M)表示主节点,Mongodb(S)表示备节点,Mongodb(A)表示仲裁节点。主备节点存储数据,仲裁节点不存储数据。客户端同时连接主节点与备节点,不连接仲裁节点。

  仲裁节点是一种特殊的节点,它本身并不存储数据,主要的作用是决定哪一个备节点在主节点挂掉之后提升为主节点,所以客户端不需要连接此节点。

  在MongoDB副本集中,主节点负责处理客户端的读写请求,备份节点则负责映射主节点的数据。

  备份节点的工作原理过程可以大致描述为,备份节点定期轮询主节点上的数据操作,然后对自己的数据副本进行这些操作,从而保证跟主节点的数据同步。至于主节点上的所有 数据库状态改变 的操作,都会存放在一张特定的系统表中。备份节点则是根据这些数据进行自己的数据更新。

  上面提到的 数据库状态改变 的操作,称为oplog(operation log,主节点操作记录)。oplog存储在local数据库的"oplog.rs"表中。副本集中备份节点异步的从主节点同步oplog,然后重新执行它记录的操作,以此达到了数据同步的作用。

Oplog注意点:

  Oplog的大小是固定的,当集合被填满的时候,新的插入的文档会覆盖老的文档。

  Oplog同步数据

  初始化:这个过程发生在当副本集中创建一个新的数据库或其中某个节点刚从宕机中恢复,或者向副本集中添加新的成员的时候,默认的,副本集中的节点会从离它最近的节点复制oplog来同步数据,这个最近的节点可以是primary也可以是拥有最新oplog副本的secondary节点。

二、搭建有仲裁节点的副本集

1.进入到/usr/java中,新建mongodbRepliSet文件夹,然后在 mongodbRepliSet 文件夹中新建 3个节点,先 mkdir  node1。

2.进入到 node1中,新建 data 和 log文件夹,即 mkdir  data  log,然后进入到 data中,mkdir  db。

3.拷贝mongodb的配置文件到 node1中,

 cp /usr/java/mongoNode/mongodb.conf /usr/java/mongodbRepliSet/node1/mongodb.conf

4.修改配置文件,vim  mongodb.conf

dbpath=/usr/java/mongodbRepliSet/node1/data//db
logpath=/usr/java/mongodbRepliSet/node1/log/mongodb.log
logappend=true
fork=true
bind_ip=192.168.80.128
port=27017
replSet=JoeSet # 3个节点的这个配置要一样,表示在一个副本集中

5.拷贝 node1 整个文件夹,名为 node2 和 node3

cp -r node1 node2

cp -r node1 node3

6.修改 node2 和 node3 文件夹中的mongodb.conf,修改 dbpath、logpath 和 port(27018、27019)。

7.配置 临时的环境变量,export  PATH=/usr/java/mongodb/bin:$PATH

8.查看临时的环境变量是否配置成功:echo  $PATH

9.启动3个节点,分别进入 node1 node2和node3中,以配置文件方式启动:mongod --config mongodb.conf

10.客户端连接node1,mongo --host  192.168.80.128  --port  27017

11.上述配置 没有指定哪一个是master、slave、仲裁节点,所以需要执行下 副本集的初始化,执行:

rs.initiate({"_id":"JoeSet",members:[{"_id":1,"host":"192.168.80.128:27017",priority:3},{"_id":2,"host":"192.168.80.128:27018", priority:9},{"_id":3,"host":"192.168.80.128:27019",arbiterOnly:true}]})。

  1. "_id": 副本集的名称
  2. "members": 副本集的服务器列表
  3. "_id": 服务器的唯一ID
  4. "host": 服务器主机
  5. "priority": 是优先级,默认为1,优先级0为被动节点,不能成为活跃节点。优先级不位0则按照有大到小选出活跃节点。
  6. "arbiterOnly": 仲裁节点,只参与投票,不接收数据,也不能成为活跃节点。

 执行完 初始化命令后,会变为上图所示。

 注意,可能出现的错误:

> rs.initiate({"_id":"JoeSet",members:[{"_id":1,"host":"192.168.80.128:27017",priority:3},{"_id":2,"host":"192.168.80.128:27018", priority:9},{"_id":4,"host":"192.168.80.128:27019",arbiterOnly:true}]})
{
"ok" : 0,
"errmsg" : "This node, 192.168.80.128:27019, with _id 4 is not electable under the new configuration version 1 for replica set JoeSet",
"code" : 93
}

错误原因,是因为客户端连接了 27019,而27019 又是仲裁节点,所以出现了这个错误。解决方法,客户端连接 其他节点,不连接 设置为仲裁的节点。

12.执行:rs.status(),查看状态。

 JoeSet:OTHER> rs.status()
{
"set" : "JoeSet",
"date" : ISODate("2017-07-26T22:09:44.940Z"),
"myState" : 2,
"members" : [
{
"_id" : 1,
"name" : "192.168.80.128:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",        # SECONDARY 表示从节点
"uptime" : 38,
"optime" : Timestamp(1501106974, 1),
"optimeDate" : ISODate("2017-07-26T22:09:34Z"),
"configVersion" : 1,
"self" : true
},
{
"_id" : 2,
"name" : "192.168.80.128:27018",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",        # PRIMARY 表示主节点
"uptime" : 10,
"optime" : Timestamp(1501106974, 1),
"optimeDate" : ISODate("2017-07-26T22:09:34Z"),
"lastHeartbeat" : ISODate("2017-07-26T22:09:44.560Z"),
"lastHeartbeatRecv" : ISODate("2017-07-26T22:09:44.579Z"),
"pingMs" : 1,
"electionTime" : Timestamp(1501106981, 1),
"electionDate" : ISODate("2017-07-26T22:09:41Z"),
"configVersion" : 1
},
{
"_id" : 3,
"name" : "192.168.80.128:27019",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",        # ARBITER 表示仲裁节点
"uptime" : 10,
"lastHeartbeat" : ISODate("2017-07-26T22:09:44.559Z"),
"lastHeartbeatRecv" : ISODate("2017-07-26T22:09:44.585Z"),
"pingMs" : 0,
"configVersion" : 1
}
],
"ok" : 1
}

13.为了验证副本集搭建成功,我们 在node2(主节点) 中插入几条数据,然后在 node1 (从节点)中查看,因为 上面配置了 node2 为主节点, node1为从节点,node3为仲裁节点。

 1) 在node2中:

JoeSet:PRIMARY> show dbs
local 0.078GB
JoeSet:PRIMARY> use testdb
switched to db testdb
JoeSet:PRIMARY> db.createCollection("testCon")
{ "ok" : 1 }
JoeSet:PRIMARY> show collections
system.indexes
testCon
JoeSet:PRIMARY> for(var i=0; i<;i++) db.testCon.insert({name:"Joe",index:i})
WriteResult({ "nInserted" : 1 })
JoeSet:PRIMARY> db.testCon.find()
{ "_id" : ObjectId("597a553d7db09ad9f77f1353"), "name" : "Joe", "index" : 0 }
{ "_id" : ObjectId("597a553d7db09ad9f77f1354"), "name" : "Joe", "index" : 1 }
{ "_id" : ObjectId("597a553d7db09ad9f77f1355"), "name" : "Joe", "index" : 2 }

 2) 在node1中:

JoeSet:SECONDARY> show dbs
2017-07-27T14:06:14.672-0700 E QUERY Error: listDatabases failed:{ "note" : "from execCommand", "ok" : 0, "errmsg" : "not master" }
at Error (<anonymous>)
at Mongo.getDBs (src/mongo/shell/mongo.js:47:15)
at shellHelper.show (src/mongo/shell/utils.js:630:33)
at shellHelper (src/mongo/shell/utils.js:524:36)
at (shellhelp2):1:1 at src/mongo/shell/mongo.js:47
JoeSet:SECONDARY> rs.slaveOk()
JoeSet:SECONDARY> show dbs
local 0.078GB
testdb 0.078GB
JoeSet:SECONDARY> use testdb
switched to db testdb
JoeSet:SECONDARY> show collections
system.indexes
testCon
JoeSet:SECONDARY> db.testCon.find()
{ "_id" : ObjectId("597a553d7db09ad9f77f1353"), "name" : "Joe", "index" : 0 }
{ "_id" : ObjectId("597a553d7db09ad9f77f1354"), "name" : "Joe", "index" : 1 }
{ "_id" : ObjectId("597a553d7db09ad9f77f1355"), "name" : "Joe", "index" : 2 }

  在node1(从节点)中 可以查看到 node2(主节点)插入的数据,说明 副本集搭建成功。

  注意:从节点中是不允许执行写操作的。

三、模拟主节点故障及恢复

 1) 模拟node2(主节点)挂了,kiil 掉node2(主节点)的进程

 2) 客户端连接 node1(从节点):mongo --host  192.168.80.128  --port  27017

JoeSet:PRIMARY> rs.status()
{
"set" : "JoeSet",
"date" : ISODate("2017-07-27T21:20:45.629Z"),
"myState" : 1,
"members" : [
{
"_id" : 1,
"name" : "192.168.80.128:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 4209,
"optime" : Timestamp(1501189437, 10),
"optimeDate" : ISODate("2017-07-27T21:03:57Z"),
"electionTime" : Timestamp(1501190187, 1),
"electionDate" : ISODate("2017-07-27T21:16:27Z"),
"configVersion" : 1,
"self" : true
},
{
"_id" : 2,
"name" : "192.168.80.128:27018",
"health" : 0,
"state" : 8,
"stateStr" : "(not reachable/healthy)",
"uptime" : 0,
"optime" : Timestamp(0, 0),
"optimeDate" : ISODate("1970-01-01T00:00:00Z"),
"lastHeartbeat" : ISODate("2017-07-27T21:20:43.773Z"),
"lastHeartbeatRecv" : ISODate("2017-07-27T21:16:24.292Z"),
"pingMs" : 1,
"lastHeartbeatMessage" : "Failed attempt to connect to 192.168.80.128:27018; couldn't connect to server 192.168.80.128:27018 (192.168.80.128), connection attempt failed",
"configVersion" : -1
},
{
"_id" : 3,
"name" : "192.168.80.128:27019",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 4191,
"lastHeartbeat" : ISODate("2017-07-27T21:20:45.475Z"),
"lastHeartbeatRecv" : ISODate("2017-07-27T21:20:44.876Z"),
"pingMs" : 0,
"configVersion" : 1
}
],
"ok" : 1

  发现原来的从节点(node1)变为了 主节点,而原来的主节点显示的状态是 不可达、不健康的。这对于整个副本集的使用是没有影响的。

 3) 重新启动node2,即 原来的主节点。如果启动node2失败,就删除掉 db文件夹下的mongod.lock文件。

 4) 客户端连接node1,mongo --host  192.168.80.128  --port  27017,发现node2 重新启动后,node1 又变为 从节点,而 node2又变为 原来的主节点,这是因为 仲裁节点 和 设置的优先级的原因。

JoeSet:SECONDARY> rs.status()
{
"set" : "JoeSet",
"date" : ISODate("2017-07-27T21:31:06.197Z"),
"myState" : 2,
"members" : [
{
"_id" : 1,
"name" : "192.168.80.128:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 4830,
"optime" : Timestamp(1501189437, 10),
"optimeDate" : ISODate("2017-07-27T21:03:57Z"),
"configVersion" : 1,
"self" : true
},
{
"_id" : 2,
"name" : "192.168.80.128:27018",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 87,
"optime" : Timestamp(1501189437, 10),
"optimeDate" : ISODate("2017-07-27T21:03:57Z"),
"lastHeartbeat" : ISODate("2017-07-27T21:31:05.209Z"),
"lastHeartbeatRecv" : ISODate("2017-07-27T21:31:05.506Z"),
"pingMs" : 0,
"electionTime" : Timestamp(1501190981, 1),
"electionDate" : ISODate("2017-07-27T21:29:41Z"),
"configVersion" : 1
},
{
"_id" : 3,
"name" : "192.168.80.128:27019",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 4811,
"lastHeartbeat" : ISODate("2017-07-27T21:31:06.085Z"),
"lastHeartbeatRecv" : ISODate("2017-07-27T21:31:05.633Z"),
"pingMs" : 0,
"configVersion" : 1
}
],
"ok" : 1
}

  当仲裁节点挂掉后,达不到高可用了,即当 主节点挂了后,从节点在没有仲裁节点的情况下,不会切换为 主节点了。所以,推荐使用没有仲裁节点的副本集,如下。

四、搭建没有仲裁节点的副本集,推荐使用

1.复制node1 为 node6、node7、node8:

 cp  -r  node1   node6

 cp  -r  node1   node7

 cp  -r  node1   node8

2.清空node6、node7、node8的db文件夹 和 log 文件夹

rm -rf data/db/*

 rm -rf log/*

3.修改node6、node7、node8 的datapath、logpath和port、replSet

 node6 的port 为 27021,node7 的port 为 27022,node8 的port 为 27023,replSet 为 XbqSet

4.启动三个节点,分别进入 对应的node文件夹中:

 mongod --config mongodb.conf

5.连接node6节点(27021):mongo --host  192.168.80.128  --port  27021

6.执行初始化命令:rs.initiate({"_id":"XbqSet",members:[{"_id":1,"host":"192.168.80.128:27021"},{"_id":2,"host":"192.168.80.128:27022"},{"_id":3,"host":"192.168.80.128:27023" }]})

7.查看状态,发现有一个主节点,两个从节点。

XbqSet:PRIMARY> rs.status()
{
"set" : "XbqSet",
"date" : ISODate("2017-07-27T22:02:28.188Z"),
"myState" : 1,
"members" : [
{
"_id" : 1,
"name" : "192.168.80.128:27021",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 483,
"optime" : Timestamp(1501192872, 1),
"optimeDate" : ISODate("2017-07-27T22:01:12Z"),
"electionTime" : Timestamp(1501192876, 1),
"electionDate" : ISODate("2017-07-27T22:01:16Z"),
"configVersion" : 1,
"self" : true
},
{
"_id" : 2,
"name" : "192.168.80.128:27022",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 75,
"optime" : Timestamp(1501192872, 1),
"optimeDate" : ISODate("2017-07-27T22:01:12Z"),
"lastHeartbeat" : ISODate("2017-07-27T22:02:26.973Z"),
"lastHeartbeatRecv" : ISODate("2017-07-27T22:02:26.973Z"),
"pingMs" : 0,
"configVersion" : 1
},
{
"_id" : 3,
"name" : "192.168.80.128:27023",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 75,
"optime" : Timestamp(1501192872, 1),
"optimeDate" : ISODate("2017-07-27T22:01:12Z"),
"lastHeartbeat" : ISODate("2017-07-27T22:02:26.973Z"),
"lastHeartbeatRecv" : ISODate("2017-07-27T22:02:26.973Z"),
"pingMs" : 0,
"configVersion" : 1
}
],
"ok" : 1
}

8.kill 掉node6,即端口 27021

9.然后连接到node7上:mongo --host  192.168.80.128  --port  27022,查看状态,发现node7为从节点,node8为主节点了,原来的node6 不可达、不健康的。

XbqSet:SECONDARY> rs.status()
{
"set" : "XbqSet",
"date" : ISODate("2017-07-27T22:08:24.894Z"),
"myState" : 2,
"members" : [
{
"_id" : 1,
"name" : "192.168.80.128:27021",
"health" : 0,
"state" : 8,
"stateStr" : "(not reachable/healthy)",
"uptime" : 0,
"optime" : Timestamp(0, 0),
"optimeDate" : ISODate("1970-01-01T00:00:00Z"),
"lastHeartbeat" : ISODate("2017-07-27T22:08:23.748Z"),
"lastHeartbeatRecv" : ISODate("2017-07-27T22:07:43.464Z"),
"pingMs" : 0,
"lastHeartbeatMessage" : "Failed attempt to connect to 192.168.80.128:27021; couldn't connect to server 192.168.80.128:27021 (192.168.80.128), connection attempt failed",
"configVersion" : -1
},
{
"_id" : 2,
"name" : "192.168.80.128:27022",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 833,
"optime" : Timestamp(1501192872, 1),
"optimeDate" : ISODate("2017-07-27T22:01:12Z"),
"configVersion" : 1,
"self" : true
},
{
"_id" : 3,
"name" : "192.168.80.128:27023",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 431,
"optime" : Timestamp(1501192872, 1),
"optimeDate" : ISODate("2017-07-27T22:01:12Z"),
"lastHeartbeat" : ISODate("2017-07-27T22:08:23.409Z"),
"lastHeartbeatRecv" : ISODate("2017-07-27T22:08:23.521Z"),
"pingMs" : 0,
"electionTime" : Timestamp(1501193266, 1),
"electionDate" : ISODate("2017-07-27T22:07:46Z"),
"configVersion" : 1
}
],
"ok" : 1
}

10.重新启动node6:mongod --config mongodb.conf

11.继续连接node7:mongo --host  192.168.80.128  --port  27022,查看状态,原来的node6 变为了 从节点。

XbqSet:SECONDARY> rs.status()
{
"set" : "XbqSet",
"date" : ISODate("2017-07-27T22:12:41.275Z"),
"myState" : 2,
"members" : [
{
"_id" : 1,
"name" : "192.168.80.128:27021",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 54,
"optime" : Timestamp(1501192872, 1),
"optimeDate" : ISODate("2017-07-27T22:01:12Z"),
"lastHeartbeat" : ISODate("2017-07-27T22:12:40.382Z"),
"lastHeartbeatRecv" : ISODate("2017-07-27T22:12:41.213Z"),
"pingMs" : 0,
"configVersion" : 1
},
{
"_id" : 2,
"name" : "192.168.80.128:27022",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 1090,
"optime" : Timestamp(1501192872, 1),
"optimeDate" : ISODate("2017-07-27T22:01:12Z"),
"configVersion" : 1,
"self" : true
},
{
"_id" : 3,
"name" : "192.168.80.128:27023",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 688,
"optime" : Timestamp(1501192872, 1),
"optimeDate" : ISODate("2017-07-27T22:01:12Z"),
"lastHeartbeat" : ISODate("2017-07-27T22:12:39.673Z"),
"lastHeartbeatRecv" : ISODate("2017-07-27T22:12:39.820Z"),
"pingMs" : 0,
"electionTime" : Timestamp(1501193266, 1),
"electionDate" : ISODate("2017-07-27T22:07:46Z"),
"configVersion" : 1
}
],
"ok" : 1
}

五、增加、删除节点

1.cp -r  node8  node10,修改node10的datapath、logpath的port,并将port 改为 27024,启动 node10。

2.进入到主节点中,mongo --host  192.168.80.128  --port  27023,一定要在主节点中进行操作。

3.增加节点:rs.add(“192.168.80.128:27024”)

XbqSet:PRIMARY> rs.add("192.168.80.128:27024")
{ "ok" : 1 }

4.查看状态,rs.status(),发现新增加的节点 为从节点,即 SECONDARY。

XbqSet:PRIMARY> rs.status()
{
"set" : "XbqSet",
"date" : ISODate("2017-07-29T14:31:44.872Z"),
"myState" : 1,
"members" : [
{
"_id" : 1,
"name" : "192.168.80.128:27021",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 630,
"optime" : Timestamp(1501338697, 1),
"optimeDate" : ISODate("2017-07-29T14:31:37Z"),
"lastHeartbeat" : ISODate("2017-07-29T14:31:43.555Z"),
"lastHeartbeatRecv" : ISODate("2017-07-29T14:31:43.457Z"),
"pingMs" : 0,
"configVersion" : 2
},
{
"_id" : 2,
"name" : "192.168.80.128:27022",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 1854,
"optime" : Timestamp(1501338697, 1),
"optimeDate" : ISODate("2017-07-29T14:31:37Z"),
"lastHeartbeat" : ISODate("2017-07-29T14:31:43.555Z"),
"lastHeartbeatRecv" : ISODate("2017-07-29T14:31:43.186Z"),
"pingMs" : 0,
"configVersion" : 2
},
{
"_id" : 3,
"name" : "192.168.80.128:27023",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 1953,
"optime" : Timestamp(1501338697, 1),
"optimeDate" : ISODate("2017-07-29T14:31:37Z"),
"electionTime" : Timestamp(1501338022, 1),
"electionDate" : ISODate("2017-07-29T14:20:22Z"),
"configVersion" : 2,
"self" : true
},
{
"_id" : 4,
"name" : "192.168.80.128:27024",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 7,
"optime" : Timestamp(1501338697, 1),
"optimeDate" : ISODate("2017-07-29T14:31:37Z"),
"lastHeartbeat" : ISODate("2017-07-29T14:31:43.566Z"),
"lastHeartbeatRecv" : ISODate("2017-07-29T14:31:43.579Z"),
"pingMs" : 6,
"configVersion" : 2
}
],
"ok" : 1
}

5.删除节点:rs.remove(hostportstr)

XbqSet:PRIMARY> rs.remove("192.168.80.128:27024")
{ "ok" : 1 }

查看状态,发现 端口为27024的节点 没有了。

MongoDB(五)-- 副本集(replica Set)的更多相关文章

  1. Mongodb主从复制/ 副本集/分片集群介绍

    前面的文章介绍了Mongodb的安装使用,在 MongoDB 中,有两种数据冗余方式,一种 是 Master-Slave 模式(主从复制),一种是 Replica Sets 模式(副本集). Mong ...

  2. [DataBase] MongoDB (8) 副本集

    MongoDB  创建副本集 MongoDB复制是将数据同步在多个服务器的过程. 复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性. 复制还允许您从 ...

  3. mongodb创建副本集命令

    mongodb创建副本集命令 ./mongod --replSet spock --dbpath ../data --smallfiles > config ={... "_id&qu ...

  4. MongoDB之副本集

    MongoDB之副本集 一.简介 MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库 ...

  5. MongoDB 复制(副本集)

    MongoDB复制是将数据同步在多个服务器的过程. 复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性. 复制还允许您从硬件故障和服务中断中恢复数据. ...

  6. MongoDB副本集replica set (二)--副本集环境搭建

    (一)主机信息 操作系统版本:centos7 64-bit 数据库版本   :MongoDB 4.2 社区版 ip hostname 192.168.10.41 mongoserver1 192.16 ...

  7. MongoDB副本集replica set(三)--添加删除成员

    在上一篇文章中,我们搭建了3个节点的副本集,集群信息如下: rstest:PRIMARY> rs.config() { "_id" : "rstest", ...

  8. mongodb配置副本集(多台服务器间的副本集搭建) replica[ˈrɛplɪkə]

    副本集具有多个副本保证了容错性,就算一个副本挂掉了还有很多副本存在,并且解决了“主节点挂掉了,整个集群内会自动切换”的问题.我们来看看mongoDB副本集的架构图: 由图可以看到客户端连接到整个副本集 ...

  9. MongoDB 搭建副本集

    副本集(Replica Set)是一组MongoDB实例组成的集群,由一个主(Primary)服务器和多个备份(Secondary)服务器构成.通过Replication,将数据的更新由Primary ...

  10. [原创]在Docker上部署mongodb分片副本集群。

    一.安装docker. 请参考:http://www.cnblogs.com/hehexiaoxia/p/6150584.html 二.编写dockerfile. 1.在根目录下创建mongod的do ...

随机推荐

  1. Enums and Lookup Tables with EF Code First

    With EntityFramework’s support for enums, there is no longer any need to include lookup tables in th ...

  2. 关于使用QTcpSocket的一些总结

    QTcpSocket类的方法connectToHost会泄露内存,即使把调用这个方法的QTcpSocket实例delete掉,内存也不会释放!反复connectToHost会导致段错误,十分危险.必须 ...

  3. 关于Unity中Time.deltaTime的使用

    例子 void Update () { this.transform.Rotate(Vector3.up, Time.deltaTime * 50, Space.World); //绕世界的y轴旋转, ...

  4. Python之collections.defaultdict

    转自:http://www.jb51.net/article/88147.htm

  5. tornado 的 define 和options方法解读

    一.源码解读 tornado是facebook开源的非阻塞web容器,类似java的netty,tornado.options是负责解析tornado容器的全局参数的,同时也能够解析命令行传递的参数和 ...

  6. ubuntu 安装 SVN 后的错误:Subversion Native Library Not Available & Incompatible JavaHL library loaded

    问题一 安装了SVN的eclipse插件,使用的时候就会弹出一个错误的提示框:  Subversion Native Library Not Available,加载不到JavaHL.   解决方法 ...

  7. Docker镜像相关

    一.中间镜像 通过持续集成工具Jenkins构建Docker镜像并运行容器,采用的是Docker Compose来进行编排构建运行的.但是每次构建完毕以后通过docker images命令查询,可以发 ...

  8. IOS_多线程

    苹果的Cocoa框架支持的多线程机制有三中NSThread.GCD.NSOperation. NSThread:是官方推荐的也是最主要的线程创建方式,可是须要开发这自己去管理线程的生命周期比如线程同步 ...

  9. eclipse常用插件介绍

    1. 测试覆盖率工具:EclEmma https://www.cnblogs.com/Ming8006/p/5811425.html 2. 单元测试系列:如何使用JUnit+JaCoCo+EclEmm ...

  10. datepicker clone 控件错误

    删除id,并删除hasDatepicker //+ -  function changeRows(sender,desc){ var tr = $(sender).closest("tr&q ...