当前位置:首页 > 开发 > 数据库 > 正文

【MongoDB学习笔记十一】Mongo副本集基本的增删查

发表于: 2014-11-19   作者:bit1129   来源:转载   浏览:
摘要: 一、创建复本集   假设mongod,mongo已经配置在系统路径变量上,启动三个命令行窗口,分别执行如下命令:   mongod --port 27017 --dbpath data1 --replSet rs0 mongod --port 27018 --dbpath data2 --replSet rs0 mongod --port 27019 -

一、创建复本集

 

假设mongod,mongo已经配置在系统路径变量上,启动三个命令行窗口,分别执行如下命令:

 

mongod --port 27017 --dbpath  data1 --replSet rs0

mongod --port 27018 --dbpath  data2 --replSet rs0

mongod --port 27019 --dbpath  data3 --replSet rs0

 

以上命令可以逐个执行,直到出现replSet没有初始化配置的时候,执行下一个。执行完上面的命令后,新开一个命令行窗口,执行如下命令连接到端口为27017的mongoDB服务器上

 

mongo

 

执行上面的命令,默认连接到test数据库,需要先切换到admin数据库,通过执行如下命令

 

use admin

 

然后依次执行如下命令:

rs.initiate();

rs.add("yourhostname:27018");

rs.add("yourhostname:27019");

 

执行完每条指令时,会显示执行结果

{ "ok" : 1 }

 

执行rs.status()可以查看副本集的状态

 

rs0:PRIMARY> rs.status();
{
	"set" : "rs0",
	"date" : ISODate("2014-11-19T13:48:58Z"),
	"myState" : 1,
	"members" : [
		{
			"_id" : 0,
			"name" : "tom-Inspiron-3521:27017",
			"health" : 1,
			"state" : 1,
			"stateStr" : "PRIMARY",  //主服务器
			"uptime" : 941, //运行时间
			"optime" : Timestamp(1416404394, 1),
			"optimeDate" : ISODate("2014-11-19T13:39:54Z"),
			"self" : true
		},
		{
			"_id" : 1,
			"name" : "tom-Inspiron-3521:27018",
			"health" : 1,
			"state" : 2,
			"stateStr" : "SECONDARY",//从服务器
			"uptime" : 548,
			"optime" : Timestamp(1416404394, 1),
			"optimeDate" : ISODate("2014-11-19T13:39:54Z"),
			"lastHeartbeat" : ISODate("2014-11-19T13:48:56Z"),
			"lastHeartbeatRecv" : ISODate("2014-11-19T13:48:56Z"),
			"pingMs" : 0,
			"syncingTo" : "tom-Inspiron-3521:27017" //与同服务器同步
		},
		{
			"_id" : 2,
			"name" : "tom-Inspiron-3521:27019",
			"health" : 1,
			"state" : 2,
			"stateStr" : "SECONDARY",
			"uptime" : 544,
			"optime" : Timestamp(1416404394, 1),
			"optimeDate" : ISODate("2014-11-19T13:39:54Z"),
			"lastHeartbeat" : ISODate("2014-11-19T13:48:56Z"),
			"lastHeartbeatRecv" : ISODate("2014-11-19T13:48:57Z"),
			"pingMs" : 0,
			"syncingTo" : "tom-Inspiron-3521:27017"
		}
	],
	"ok" : 1
}

 

二、 创建副本集的第二种方式

上面的方式通过调用rs.add方法向复本集中添加服务器,也可以一步到位,集中所有的服务器,然后完成复本集的初始化,下面是执行的步骤:

mongod --port 27017 --dbpath  data1 --replSet rs0

mongod --port 27018 --dbpath  data2 --replSet rs0

mongod --port 27019 --dbpath  data3 --replSet rs0

以上命令逐个执行完成后,通过mongo连接到27017服务器,在mongo shell中执行如下的命令:

 

config = {_id: "rs0", members: []}

 

 

config.members.push({_id: 0, host: "hostname:2701"})
config.members.push({_id: 1, host: "hostname:27018"})
config.members.push({_id: 2, host: "hostnmae:27019", arbiterOnly: true}) //作为arbiter服务器加入到复本集

 

  

rs.initiate(config) //初始化复本集

 

   初始化完成后,就可以像一种那样查看复本集的状态了

 

 

三、设置复本集中从服务器可读

 

默认情况下,从服务器是不可的,比如执行db.bar.find()报如下的错误

 

rs0:SECONDARY> db.bar.find();
error: { "$err" : "not master and slaveOk=false", "code" : 13435 

 

执行如下命令,将数据库设置为可读(这个操作不是将当前数据库设置为可读,而是将所有的数据库设置为可读,因为设置的作用域是db所在的mongoDB实例)

 

db.getMongo().setSlaveOk()或者rs.slaveOk();

 

另外,直接往从数据库中插入数据也是不允许的

 

 四、向复本集中添加从服务器

 

添加从服务器成功后,新增加的从服务器会跟复本集中的其它服务器保持数据同步,为了达到数据同步,有两种做法:

  • 数据目录为空,新服务器添加成功后,通过复本集本身的数据同步策略完成数据同步
  • 数据目录为空,首先将复本集中的数据目录copy至新服务器数据目录下,然后再做添加到复本集的操作

 

 启动新服务器

 

mongod --port 27020 --dbpath  data4 --replSet rs0

 

启动客户端,连接到复本集的Master,执行如下命令(此处没有切换到admin,直接在test上做的)

 

rs.add("yourhostname:27020");

 

执行完成后,复本集中包含了1主3从。rs.status操作可以针对从服务器执行

 

rs0:SECONDARY> rs.status();
{
	"set" : "rs0",
	"date" : ISODate("2014-11-19T14:50:30Z"),
	"myState" : 2,
	"syncingTo" : "tom-Inspiron-3521:27017",
	"members" : [
		{
			"_id" : 0,
			"name" : "tom-Inspiron-3521:27017",
			"health" : 1,
			"state" : 1,
			"stateStr" : "PRIMARY",
			"uptime" : 236,
			"optime" : Timestamp(1416408389, 1),
			"optimeDate" : ISODate("2014-11-19T14:46:29Z"),
			"lastHeartbeat" : ISODate("2014-11-19T14:50:28Z"),
			"lastHeartbeatRecv" : ISODate("2014-11-19T14:50:29Z"),
			"pingMs" : 0
		},
		{
			"_id" : 1,
			"name" : "tom-Inspiron-3521:27018",
			"health" : 1,
			"state" : 2,
			"stateStr" : "SECONDARY",
			"uptime" : 236,
			"optime" : Timestamp(1416408389, 1),
			"optimeDate" : ISODate("2014-11-19T14:46:29Z"),
			"lastHeartbeat" : ISODate("2014-11-19T14:50:28Z"),
			"lastHeartbeatRecv" : ISODate("2014-11-19T14:50:28Z"),
			"pingMs" : 0,
			"syncingTo" : "tom-Inspiron-3521:27017"
		},
		{
			"_id" : 2,
			"name" : "tom-Inspiron-3521:27019",
			"health" : 1,
			"state" : 2,
			"stateStr" : "SECONDARY",
			"uptime" : 236,
			"optime" : Timestamp(1416408389, 1),
			"optimeDate" : ISODate("2014-11-19T14:46:29Z"),
			"lastHeartbeat" : ISODate("2014-11-19T14:50:28Z"),
			"lastHeartbeatRecv" : ISODate("2014-11-19T14:50:29Z"),
			"pingMs" : 0,
			"syncingTo" : "tom-Inspiron-3521:27017"
		},
		{
			"_id" : 3,
			"name" : "tom-Inspiron-3521:27020",
			"health" : 1,
			"state" : 2,
			"stateStr" : "SECONDARY",
			"uptime" : 379,
			"optime" : Timestamp(1416408389, 1),
			"optimeDate" : ISODate("2014-11-19T14:46:29Z"),
			"self" : true //没有同步信息??这是因为,当前连接的是本台服务器,如果连接到主服务器上执行rs.status(),则会显示同步信息
		}
	],
	"ok" : 1

 

 

五、从复本集中删除从服务器

  1. 删除步骤:
  • 关闭要删除的从服务器27020
  • mongo连接到主服务器,执行、
    rs.remove("hostname:27020");
  • 删除后,执行结果如下,虽然有错误提示,但是这是正常的,如MongoDB disconnects the shell briefly as the replica set elects a new primary. The shell then automatically reconnects. The shell displays a DBClientCursor::init call() failed error even though the command succeeds所说。也就是说,主服务器也是可以删除的,所以,mongo可以不用连接到主服务器上执行删除命令
rs0:PRIMARY> rs.remove("tom-Inspiron-3521:27020")
Wed Nov 19 22:58:44.551 DBClientCursor::init call() failed
Wed Nov 19 22:58:44.577 Error: error doing query: failed at src/mongo/shell/query.js:78
Wed Nov 19 22:58:44.578 trying reconnect to 127.0.0.1:27017
Wed Nov 19 22:58:44.579 reconnect 127.0.0.1:27017 ok

 

  2. 说明:

  • 虽然mongoDB的官方文档说,删除前需要首先关闭待删除的服务器,实际测试时,可以不用先停止。
  • rs.remove操作可以在从服务器上执行以删除主服务器,主服务器删除后,复本集马上执行Lead选举,选举新的主服务器

 3. 重新添加

    首先在服务器中添加几条数据,然后执行如下命令重新将它加入到复本集中,通过观察可知,新加入的数据同步到了新加的从数据中

 

rs.add("hostname:27020")

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

a

 

 

 

 

 

 

 

【MongoDB学习笔记十一】Mongo副本集基本的增删查

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
MongoDB多台服务器上保存着数据备份,确保数据安全,其中一台服务器挂掉后应用程序数据能正常提供服
简单副本集测试 这一节主要对上一节搭建的副本集做一些简单的测试。 我们首先进入primary节点(3701
简单副本集测试 这一节主要对上一节搭建的副本集做一些简单的测试。 我们首先进入primary节点(3701
保证主节点挂掉了,备节点能继续提供数据服务。Primary表示主节点,Secondary表示备节点。备节点可
既要有副本集的热备功能,又要充分利用多台服务器性能 <code style="font-size: 12px !important
环境 操作系统:win7 64位 MongoDB version: 2.6.5 配置mongodb实例 配置了三个实例,用的都是同一
Mongodb副本集配置好以后,少不了维护,维护内容也不是很多,主要是现在状态和增删节点等。 在说维
既然使用Mongodb,就不得不用他的安全备份机制:副本集。 Mongodb副本集是什么东西? 通俗的讲就是
转载自 http://www.cnblogs.com/spnt/ 既然使用Mongodb,就不得不用他的安全备份机制:副本集。 Mon
在使用MongoDB的时候,为了保证数据的安全,就要考虑数据备份和故障恢复了;同时出于性能的考虑,能
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号