设为首页 收藏本站
查看: 1148|回复: 0

[经验分享] 【MongoDB学习笔记十一】Mongo副本集基本的增删查

[复制链接]

尚未签到

发表于 2016-12-2 10:00:37 | 显示全部楼层 |阅读模式
一、创建复本集
  假设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

   

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


  • 删除步骤:


  • 关闭要删除的从服务器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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-308569-1-1.html 上篇帖子: R语言操作mongdb各方法集合 下篇帖子: Mongo的ORM框架的学习Morphia(九) morphia简单使用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表