【MongoDB学习笔记十一】Mongo副本集基本的增删查
MongoDB  /  houtizong 发布于 3年前   242
假设mongod,mongo已经配置在系统路径变量上,启动三个命令行窗口,分别执行如下命令:
mongod --port 27017 --dbpath data1 --replSet rs0mongod --port 27018 --dbpath data2 --replSet rs0mongod --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 rs0mongod --port 27018 --dbpath data2 --replSet rs0mongod --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();
另外,直接往从数据库中插入数据也是不允许的
添加从服务器成功后,新增加的从服务器会跟复本集中的其它服务器保持数据同步,为了达到数据同步,有两种做法:
启动新服务器
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
rs.remove("hostname:27020");
rs0:PRIMARY> rs.remove("tom-Inspiron-3521:27020")Wed Nov 19 22:58:44.551 DBClientCursor::init call() failedWed Nov 19 22:58:44.577 Error: error doing query: failed at src/mongo/shell/query.js:78Wed Nov 19 22:58:44.578 trying reconnect to 127.0.0.1:27017Wed Nov 19 22:58:44.579 reconnect 127.0.0.1:27017 ok
2. 说明:
3. 重新添加
首先在服务器中添加几条数据,然后执行如下命令重新将它加入到复本集中,通过观察可知,新加入的数据同步到了新加的从数据中
rs.add("hostname:27020")
a
请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!
技术博客集 - 网站简介:
前后端技术:
后端基于Hyperf2.1框架开发,前端使用Bootstrap可视化布局系统生成
网站主要作用:
1.编程技术分享及讨论交流,内置聊天系统;
2.测试交流框架问题,比如:Hyperf、Laravel、TP、beego;
3.本站数据是基于大数据采集等爬虫技术为基础助力分享知识,如有侵权请发邮件到站长邮箱,站长会尽快处理;
4.站长邮箱:[email protected];
文章归档
文章标签
友情链接