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

[经验分享] 【Mongodb】如何创建mongodb的replica set

[复制链接]

尚未签到

发表于 2018-10-25 12:52:04 | 显示全部楼层 |阅读模式
  Replica sets 在主从复制上做的扩展,增加了故障自动切换和自动修复成员节点。下面从技术上介绍如何搭建mongodb的replica set (个人觉得,搭建mongodb本身没有多少干货,重要是如何灾难规划)
  1 建立复制集群节点的数据存放目录
  mkdir -p /opt/mongodata/r1
  mkdir -p /opt/mongodata/r2
  mkdir -p /opt/mongodata/r3
  2 在三个窗口分别执行如下命令:
  ./mongod --dbpath /opt/mongodata/r1 --port 27018  --rest --replSet myset
  ./mongod --dbpath /opt/mongodata/r2 --port 27019  --rest --replSet myset
  ./mongod --dbpath /opt/mongodata/r3 --port 27020  --rest --replSet myset
  3 在第四个窗口执行如下命令:
  [mongodb@rac4 bin]$./mongo 127.0.0.1:27018 init.js
  MongoDB shell version: 2.0.1
  connecting to: 127.0.0.1:27018/test
  init.js 内容如下:
  [mongodb@rac4 bin]$ cat init.js
  rs.initiate({
  _id : "myset",
  members : [
  {_id : 0, host : "10.250.7.220:27018"},
  {_id : 1, host : "10.250.7.220:27019"},
  {_id : 2, host : "10.250.7.220:27020"}
  ]
  })
  启动3个服务节点,从log日志可以看到,三个节点相互协商,选择端口为27018的一个节点作为Primary,另外两个自动作为Secondary节点。
  Mon Oct 31 20:27:53 [conn2] replSet info saving a newer config version to local.system.replset
  Mon Oct 31 20:27:53 [conn2] replSet saveConfigLocally done
  Mon Oct 31 20:27:53 [conn2] replSet replSetInitiate config now saved locally.  Should come online in about a minute.
  Mon Oct 31 20:27:53 [conn2] command admin.$cmd command: { replSetInitiate: { _id: "myset", members: [ { _id: 0.0, host: "10.250.7.220:27018" }, { _id: 1.0, host: "10.250.7.220:27019" }, { _id: 2.0, host: "10.250.7.220:27020" } ] } } ntoreturn:1 reslen:112 12095ms
  Mon Oct 31 20:27:53 [conn2] end connection 127.0.0.1:15252
  Mon Oct 31 20:27:53 [rsStart] replSet STARTUP2
  Mon Oct 31 20:27:53 [rsHealthPoll] replSet info 10.250.7.220:27019 is down (or slow to respond): still initializing
  Mon Oct 31 20:27:53 [rsHealthPoll] replSet member 10.250.7.220:27019 is now in state DOWN
  Mon Oct 31 20:27:53 [rsHealthPoll] replSet info 10.250.7.220:27020 is down (or slow to respond): still initializing
  Mon Oct 31 20:27:53 [rsHealthPoll] replSet member 10.250.7.220:27020 is now in state DOWN
  Mon Oct 31 20:27:53 [rsSync] replSet SECONDARY
  Mon Oct 31 20:27:55 [initandlisten] connection accepted from 10.250.7.220:44134 #3
  Mon Oct 31 20:27:59 [rsHealthPoll] replSet info member 10.250.7.220:27019 is up
  Mon Oct 31 20:27:59 [rsHealthPoll] replSet member 10.250.7.220:27019 is now in state STARTUP2
  Mon Oct 31 20:27:59 [rsMgr] not electing self, 10.250.7.220:27019 would veto
  Mon Oct 31 20:28:01 [initandlisten] connection accepted from 10.250.7.220:44137 #4
  Mon Oct 31 20:28:05 [rsMgr] replSet info electSelf 0
  Mon Oct 31 20:28:05 [rsMgr] replSet PRIMARY
  Mon Oct 31 20:28:07 [rsHealthPoll] replSet member 10.250.7.220:27019 is now in state RECOVERING
  Mon Oct 31 20:28:10 [initandlisten] connection accepted from 10.250.7.220:44141 #5
  Mon Oct 31 20:28:10 [initandlisten] connection accepted from 10.250.7.220:44142 #6
  Mon Oct 31 20:28:11 [slaveTracking] build index local.slaves { _id: 1 }
  Mon Oct 31 20:28:11 [slaveTracking] build index done 0 records 0.001 secs
  Mon Oct 31 20:28:13 [rsHealthPoll] replSet info member 10.250.7.220:27020 is up
  Mon Oct 31 20:28:13 [rsHealthPoll] replSet member 10.250.7.220:27020 is now in state STARTUP2
  Mon Oct 31 20:28:14 [conn6] end connection 10.250.7.220:44142
  Mon Oct 31 20:28:14 [conn5] end connection 10.250.7.220:44141
  Mon Oct 31 20:28:15 [initandlisten] connection accepted from 10.250.7.220:44144 #7
  Mon Oct 31 20:28:15 [rsHealthPoll] replSet member 10.250.7.220:27019 is now in state SECONDARY
  Mon Oct 31 20:28:15 [rsHealthPoll] replSet member 10.250.7.220:27020 is now in state RECOVERING
  Mon Oct 31 20:28:28 [initandlisten] connection accepted from 127.0.0.1:59232 #8
  从客户端进入数据库:
  [mongodb@rac4 bin]$ ./mongo 127.0.0.1:27018
  MongoDB shell version: 2.0.1
  connecting to: 127.0.0.1:27018/test
  PRIMARY> rs.status()  --查看replica set状态的命令
  {
  "set" : "myset",
  "date" : ISODate("2011-10-31T12:29:17Z"),
  "myState" : 1,
  "members" : [
  {
  "_id" : 0,
  "name" : "10.250.7.220:27018",
  "health" : 1,
  "state" : 1,
  "stateStr" : "PRIMARY",
  "optime" : {
  "t" : 1320064073000,
  "i" : 1
  },
  "optimeDate" : ISODate("2011-10-31T12:27:53Z"),
  "self" : true
  },
  {
  "_id" : 1,
  "name" : "10.250.7.220:27019",
  "health" : 1,
  "state" : 2,
  "stateStr" : "SECONDARY",
  "uptime" : 78,
  "optime" : {
  "t" : 1320064073000,
  "i" : 1
  },
  "optimeDate" : ISODate("2011-10-31T12:27:53Z"),
  "lastHeartbeat" : ISODate("2011-10-31T12:29:16Z"),
  "pingMs" : 0
  },
  {
  "_id" : 2,
  "name" : "10.250.7.220:27020",
  "health" : 1,
  "state" : 2,
  "stateStr" : "SECONDARY",
  "uptime" : 64,
  "optime" : {
  "t" : 1320064073000,
  "i" : 1
  },
  "optimeDate" : ISODate("2011-10-31T12:27:53Z"),
  "lastHeartbeat" : ISODate("2011-10-31T12:29:16Z"),
  "pingMs" : 1
  }
  ],
  "ok" : 1
  }
  状态中关键数据位
  state:1表示该host是当前可以进行读写,2:不能读写
  health:1表示该host目前是正常的,0:异常
  下面会进行从库的读测试,会出现error: { "$err" : "not master and slaveok=false", "code" : 13435 }
  PRIMARY>rs.conf() --查看replica set配置的命令
  {
  "_id" : "myset",
  "version" : 1,
  "members" : [
  {
  "_id" : 0,
  "host" : "10.250.7.220:27018"
  },
  {
  "_id" : 1,
  "host" : "10.250.7.220:27019"
  },
  {
  "_id" : 2,
  "host" : "10.250.7.220:27020"
  }
  ]
  }
  PRIMARY> db.isMaster();--查看是否是主库的命令,当然可以从提示符中看出primary
  {
  "setName" : "myset",
  "ismaster" : true,  ##是primary
  "secondary" : false,
  "hosts" : [
  "10.250.7.220:27018",
  "10.250.7.220:27020",
  "10.250.7.220:27019"
  ],
  "primary" : "10.250.7.220:27018",
  "me" : "10.250.7.220:27018",
  "maxBsonObjectSize" : 16777216,
  "ok" : 1
  }
  分别登录其他两个mongodb 服务:
  [mongodb@rac4 bin]$ ./mongo 127.0.0.1:27019
  MongoDB shell version: 2.0.1
  connecting to: 127.0.0.1:27019/test
  SECONDARY>
  SECONDARY>
  SECONDARY> db.isMaster();
  {
  "setName" : "myset",
  "ismaster" : false,
  "secondary" : true,
  "hosts" : [
  "10.250.7.220:27019",
  "10.250.7.220:27020",
  "10.250.7.220:27018"
  ],
  "primary" : "10.250.7.220:27018",
  "me" : "10.250.7.220:27019",
  "maxBsonObjectSize" : 16777216,
  "ok" : 1
  }
  SECONDARY>
  [mongodb@rac4 bin]$./mongo 127.0.0.1:27020
  MongoDB shell version: 2.0.1
  connecting to: 127.0.0.1:27020/test
  SECONDARY>
  SECONDARY> db.isMaster();
  {
  "setName" : "myset",
  "ismaster" : false,
  "secondary" : true,
  "hosts" : [
  "10.250.7.220:27020",
  "10.250.7.220:27019",
  "10.250.7.220:27018"
  ],
  "primary" : "10.250.7.220:27018",
  "me" : "10.250.7.220:27020",
  "maxBsonObjectSize" : 16777216,
  "ok" : 1
  }
  至此搭建成功。。
  对主库进行写操作,从库查看:
  [mongodb@rac4 bin]$ ./mongo 127.0.0.1:27020
  MongoDB shell version: 2.0.1
  connecting to: 127.0.0.1:27020/test
  PRIMARY> use test
  switched to db test
  PRIMARY>
  PRIMARY> db.yql.insert({val:"this is a message on 27020 primary !"});
  PRIMARY>
  主库日志:
  Mon Oct 31 21:03:46 [FileAllocator] allocating new datafile /opt/mongodata/r3/test.ns, filling with zeroes...

  Mon Oct 31 21:03:46 [FileAllocator] done allocating datafile /opt/mongodata/r3/test.ns,>  Mon Oct 31 21:03:46 [FileAllocator] allocating new datafile /opt/mongodata/r3/test.0, filling with zeroes...
  Mon Oct 31 21:03:48 [clientcursormon] mem (MB) res:35 virt:2726 mapped:1248

  Mon Oct 31 21:03:50 [FileAllocator] done allocating datafile /opt/mongodata/r3/test.0,>  Mon Oct 31 21:03:50 [conn6] build index test.yql { _id: 1 }
  Mon Oct 31 21:03:50 [conn6] build index done 0 records 0 secs
  Mon Oct 31 21:03:50 [conn6] insert test.yql 4759ms
  Mon Oct 31 21:03:50 [FileAllocator] allocating new datafile /opt/mongodata/r3/test.1, filling with zeroes...
  Mon Oct 31 21:03:51 [conn8] getmore local.oplog.rs query: { ts: { $gte: new Date(5669632022159556609) } } cursorid:6257712144272734285 nreturned:1 reslen:146 5031ms
  Mon Oct 31 21:03:51 [conn5] getmore local.oplog.rs query: { ts: { $gte: new Date(5669632022159556609) } } cursorid:423878080662643430 nreturned:1 reslen:146 5631ms

  Mon Oct 31 21:03:54 [FileAllocator] done allocating datafile /opt/mongodata/r3/test.1,>  从库日志,可以看出 从库从主库应用日志,复制数据文件的过程。
  Mon Oct 31 20:49:27 [clientcursormon] mem (MB) res:19 virt:2693 mapped:1232
  Mon Oct 31 20:54:27 [clientcursormon] mem (MB) res:19 virt:2693 mapped:1232
  Mon Oct 31 20:59:27 [clientcursormon] mem (MB) res:19 virt:2693 mapped:1232
  Mon Oct 31 21:03:51 [FileAllocator] allocating new datafile /opt/mongodata/r2/test.ns, filling with zeroes...

  Mon Oct 31 21:03:54 [FileAllocator] done allocating datafile /opt/mongodata/r2/test.ns,>  Mon Oct 31 21:03:54 [FileAllocator] allocating new datafile /opt/mongodata/r2/test.0, filling with zeroes...

  Mon Oct 31 21:04:00 [FileAllocator] done allocating datafile /opt/mongodata/r2/test.0,>  Mon Oct 31 21:04:00 [rsSync] build index test.yql { _id: 1 }
  Mon Oct 31 21:04:00 [rsSync] build index done 0 records 0 secs
  Mon Oct 31 21:04:00 [FileAllocator] allocating new datafile /opt/mongodata/r2/test.1, filling with zeroes...

  Mon Oct 31 21:04:03 [FileAllocator] done allocating datafile /opt/mongodata/r2/test.1,>  Mon Oct 31 21:04:37 [clientcursormon] mem (MB) res:17 virt:2853 mapped:1312
  Mon Oct 31 21:04:41 [conn6] end connection 127.0.0.1:44672
  如前面介绍rs.status()时所说,state:1表示该host是当前可以进行读写,2:不能读写
  {
  "_id" : 1,
  "name" : "10.250.7.220:27019",
  "health" : 1,
  "state" : 2,  -- 从库的state为 2 ,此时是不可读写的。
  "stateStr" : "SECONDARY",
  "uptime" : 78,
  "optime" : {
  "t" : 1320064073000,
  "i" : 1
  },
  在从库进行读操作,会报错。
  [mongodb@rac4 bin]$ ./mongo 127.0.0.1:27019
  MongoDB shell version: 2.0.1
  connecting to: 127.0.0.1:27019/test
  SECONDARY> use test
  switched to db test
  SECONDARY> db.yql.find();
  error: { "$err" : "not master and slaveok=false", "code" : 13435 }


运维网声明 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-626373-1-1.html 上篇帖子: mongodb3.2 sharding deploy-WorkNote 下篇帖子: 【Mongodb】 Replica set的自动故障切换
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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