MongoDB复制集技术

Wesley13
• 阅读 410

复制集搭建 没毛病: https://www.cnblogs.com/nicolegxt/p/6841442.html?utm_source=itdadao&utm_medium=referral#commentform

转载:https://i.cnblogs.com/EditPosts.aspx?opt=1

为什么使用MongogDB复制集技术?

MongoDB复制集技术
mysql中:一主一从,一主多从结构存在的问题 1、 fileover(故障转移) a) 选主投票 b) 切换 2、 是否对就用透明化 3、 数据补偿的问题 a) 两阶段数据补偿 4、 解决方法 mysql中使用MHA+VIP + binlogserver

  mongodb通过复制集技术解决以上所有问题,不需要第三方软件,自已原生支持

MongoDB复制集技术

  MongoDB复制集简介

MongoDB复制集技术
一组Mongodb复制集,就是一组mongod进程,这些进程维护同一个数据集合。复制集提供了数据冗余和高等级的可靠性,这是生产部署的基础。 保证数据在生产部署时的冗余和可靠性,通过在不同的机器上保存副本来保证数据的不会因为单点损坏而丢失。能够随时应对数据丢失、机器损坏带来的风险,牛逼到不行。换一句话来说,还能提高读取能力,用户的读取服务器和写入服务器在不同的地方,而且,由不同的服务器为不同的用户提供服务,提高整个系统的负载,简直就是云存储的翻版...一组复制集就是一组mongod实例掌管同一个数据集,实例可以在不同的机器上面。实例中包含一个主导,接受客户端所有的写入操作,其他都是副本实例,从主服务器上获得数据并保持同步。 主服务器很重要,包含了所有的改变操作(写)的日志。但是副本服务器集群包含有所有的主服务器数据,因此当主服务器挂掉了,就会在副本服务器上重新选取一个成为主服务器。每个复制集还有一个仲裁者,仲裁者不存储数据,只是负责通过心跳包来确 认集群中集合的数量,并在主服务器选举的时候作为仲裁决定结果。
MongoDB复制集技术

 

 复制的基本架构

一个包含3个mongod的复制集架构如下所示

MongoDB复制集技术

如果主服务器失效,会变成:

MongoDB复制集技术

如果加上可选的仲裁者:

MongoDB复制集技术

 

如果主服务器失效:

MongoDB复制集技术

复制集技术实现

搭建三节点MongoDB复制集

MongoDB复制集技术
#创建多mongodb多实例
mkdir
-p /mongodb/28017/conf /mongodb/28017/data /mongodb/28017/log mkdir -p /mongodb/28018/conf /mongodb/28018/data /mongodb/28018/log mkdir -p /mongodb/28019/conf /mongodb/28019/data /mongodb/28019/log mkdir -p /mongodb/28020/conf /mongodb/28020/data /mongodb/28020/log #创建mongodb多 vim /mongodb/28017/conf/mongod.conf systemLog: destination: file path: /mongodb/28017/log/mongodb.log logAppend: true storage: journal: enabled: true dbPath: /mongodb/28017/data directoryPerDB: true #engine: wiredTiger wiredTiger: engineConfig: cacheSizeGB: 1 directoryForIndexes: true collectionConfig: blockCompressor: zlib indexConfig: prefixCompression: true processManagement: fork: true net: port: 28017 replication: oplogSizeMB: 2048 replSetName: my\_repl

cp /mongodb/28017/conf/mongod.conf /mongodb/28018/conf/ cp /mongodb/28017/conf/mongod.conf /mongodb/28019/conf/ cp /mongodb/28017/conf/mongod.conf /mongodb/28020/conf/ sed 's#28017#28018#g' /mongodb/28018/conf/mongod.conf -i sed 's#28017#28019#g' /mongodb/28019/conf/mongod.conf -i sed 's#28017#28020#g' /mongodb/28020/conf/mongod.conf -i

chown -R mongod:mongod /mongodb/

su - mongod mongod -f /mongodb/28017/conf/mongod.conf mongod -f /mongodb/28018/conf/mongod.conf mongod -f /mongodb/28019/conf/mongod.conf mongod -f /mongodb/28020/conf/mongod.conf

MongoDB复制集技术

 

登录

 

MongoDB复制集技术
mongo --port=28017 use admin config = {\_id: 'my\_repl', members: \[ {\_id: 0, host: '10.0.0.134:28017'}, {\_id: 1, host: '10.0.0.134:28018'}, {\_id: 2, host: '10.0.0.134:28019'}\] } rs.initiate(config) use test; db.movies.insert(\[ { "title" : "Jaws", "year" : 1975, "imdb\_rating" : 8.1 },{ "title" : "Batman", "year" : 1989, "imdb\_rating" : 7.6 }, \] );

MongoDB复制集技术

 

 

#复制集状态查询 在哪个节点都可以看

MongoDB复制集技术
\[mongod@mongo ~\]$ mongo --port=28017 MongoDB shell version: 3.2.8 connecting to: 127.0.0.1:28017/test my\_repl:PRIMARY> rs.status(); { "set" : "my\_repl", "date" : ISODate("2018-01-04T09:06:52.951Z"), "myState" : 1, "term" : NumberLong(1), "heartbeatIntervalMillis" : NumberLong(2000), "members" : \[ { "\_id" : 0, "name" : "10.0.0.134:28017", #ip port "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "PRIMARY" 主节点 "uptime" : 772, "optime" : { "ts" : Timestamp(1515056188, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2018-01-04T08:56:28Z"), "electionTime" : Timestamp(1515056187, 1), "electionDate" : ISODate("2018-01-04T08:56:27Z"), "configVersion" : 1, "self" : true }, { "\_id" : 1, "name" : "10.0.0.134:28018", #ip port "health" : 1, "state" : 2, "stateStr" : "SECONDARY", #从节点 "uptime" : 635, "optime" : { "ts" : Timestamp(1515056188, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2018-01-04T08:56:28Z"), "lastHeartbeat" : ISODate("2018-01-04T09:06:52.289Z"), "lastHeartbeatRecv" : ISODate("2018-01-04T09:06:51.722Z"), "pingMs" : NumberLong(0), "syncingTo" : "10.0.0.134:28017", "configVersion" : 1 }, { "\_id" : 2, "name" : "10.0.0.134:28019", #ip port "health" : 1, "state" : 2, "stateStr" : "SECONDARY", #从节点 "uptime" : 635, "optime" : { "ts" : Timestamp(1515056188, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2018-01-04T08:56:28Z"), "lastHeartbeat" : ISODate("2018-01-04T09:06:52.289Z"), "lastHeartbeatRecv" : ISODate("2018-01-04T09:06:51.601Z"), "pingMs" : NumberLong(0), "syncingTo" : "10.0.0.134:28017", "configVersion" : 1 } \], "ok" : 1 }
MongoDB复制集技术

 

 

 

#查看当前是否为主节点

 

 

MongoDB复制集技术
#主节点检测 my\_repl:PRIMARY> rs.isMaster(); { "hosts" : \[ "10.0.0.134:28017", "10.0.0.134:28018", "10.0.0.134:28019" \], "setName" : "my\_repl", "setVersion" : 1, "ismaster" : true, #主节点 "secondary" : false, "primary" : "10.0.0.134:28017", "me" : "10.0.0.134:28017", "electionId" : ObjectId("7fffffff0000000000000001"), "maxBsonObjectSize" : 16777216, "maxMessageSizeBytes" : 48000000, "maxWriteBatchSize" : 1000, "localTime" : ISODate("2018-01-04T09:11:15.204Z"), "maxWireVersion" : 4, "minWireVersion" : 0, "ok" : 1 }

#从节点检测 [mongod@mongo ~]$ mongo --port=28018 MongoDB shell version: 3.2.8 connecting to: 127.0.0.1:28018/test my_repl:SECONDARY> rs.isMaster() { "hosts" : [ "10.0.0.134:28017", "10.0.0.134:28018", "10.0.0.134:28019" ], "setName" : "my_repl", "setVersion" : 1, "ismaster" : false, "secondary" : true, #从节点 "primary" : "10.0.0.134:28017", "me" : "10.0.0.134:28018", "maxBsonObjectSize" : 16777216, "maxMessageSizeBytes" : 48000000, "maxWriteBatchSize" : 1000, "localTime" : ISODate("2018-01-04T09:11:40.092Z"), "maxWireVersion" : 4, "minWireVersion" : 0, "ok" : 1 }

MongoDB复制集技术

 

 

#在主节点上添加节点

MongoDB复制集技术
my\_repl:PRIMARY> rs.add ("10.0.0.134:28020") #添加从节点 { "ok" : 1 } my\_repl:PRIMARY> rs.status() { "set" : "my\_repl", "date" : ISODate("2018-01-04T09:16:33.144Z"), "myState" : 1, "term" : NumberLong(1), "heartbeatIntervalMillis" : NumberLong(2000), "members" : \[ { "\_id" : 0, "name" : "10.0.0.134:28017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 1353, "optime" : { "ts" : Timestamp(1515057249, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2018-01-04T09:14:09Z"), "electionTime" : Timestamp(1515056187, 1), "electionDate" : ISODate("2018-01-04T08:56:27Z"), "configVersion" : 2, "self" : true }, { "\_id" : 1, "name" : "10.0.0.134:28018", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 1216, "optime" : { "ts" : Timestamp(1515057249, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2018-01-04T09:14:09Z"), "lastHeartbeat" : ISODate("2018-01-04T09:16:31.632Z"), "lastHeartbeatRecv" : ISODate("2018-01-04T09:16:31.693Z"), "pingMs" : NumberLong(0), "syncingTo" : "10.0.0.134:28017", "configVersion" : 2 }, { "\_id" : 2, "name" : "10.0.0.134:28019", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 1216, "optime" : { "ts" : Timestamp(1515057249, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2018-01-04T09:14:09Z"), "lastHeartbeat" : ISODate("2018-01-04T09:16:31.632Z"), "lastHeartbeatRecv" : ISODate("2018-01-04T09:16:31.693Z"), "pingMs" : NumberLong(0), "syncingTo" : "10.0.0.134:28017", "configVersion" : 2 }, { "\_id" : 3, "name" : "10.0.0.134:28020", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", #从节点10.0.0.134:28020 "uptime" : 143, "optime" : { "ts" : Timestamp(1515057249, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2018-01-04T09:14:09Z"), "lastHeartbeat" : ISODate("2018-01-04T09:16:31.647Z"), "lastHeartbeatRecv" : ISODate("2018-01-04T09:16:30.645Z"), "pingMs" : NumberLong(0), "configVersion" : 2 } \], "ok" : 1 }
MongoDB复制集技术

 

 

#删除节点

MongoDB复制集技术
my\_repl:PRIMARY> rs.remove("10.0.0.134:28020") #删除从节点 { "ok" : 1 } my\_repl:PRIMARY> rs.status() { "set" : "my\_repl", "date" : ISODate("2018-01-04T09:18:10.582Z"), "myState" : 1, "term" : NumberLong(1), "heartbeatIntervalMillis" : NumberLong(2000), "members" : \[ { "\_id" : 0, "name" : "10.0.0.134:28017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 1450, "optime" : { "ts" : Timestamp(1515057484, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2018-01-04T09:18:04Z"), "electionTime" : Timestamp(1515056187, 1), "electionDate" : ISODate("2018-01-04T08:56:27Z"), "configVersion" : 3, "self" : true }, { "\_id" : 1, "name" : "10.0.0.134:28018", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 1313, "optime" : { "ts" : Timestamp(1515057484, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2018-01-04T09:18:04Z"), "lastHeartbeat" : ISODate("2018-01-04T09:18:10.231Z"), "lastHeartbeatRecv" : ISODate("2018-01-04T09:18:10.241Z"), "pingMs" : NumberLong(0), "syncingTo" : "10.0.0.134:28017", "configVersion" : 3 }, { "\_id" : 2, "name" : "10.0.0.134:28019", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 1313, "optime" : { "ts" : Timestamp(1515057484, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2018-01-04T09:18:04Z"), "lastHeartbeat" : ISODate("2018-01-04T09:18:10.231Z"), "lastHeartbeatRecv" : ISODate("2018-01-04T09:18:10.243Z"), "pingMs" : NumberLong(0), "syncingTo" : "10.0.0.134:28017", "configVersion" : 3 } \], "ok" : 1 }
MongoDB复制集技术

 

 #添加仲裁节点

MongoDB复制集技术
my\_repl:PRIMARY> rs.addArb("10.0.0.134:28020");#添加仲裁节点 { "ok" : 1 } my\_repl:PRIMARY> rs.status(); { "set" : "my\_repl", "date" : ISODate("2018-01-04T09:19:32.814Z"), "myState" : 1, "term" : NumberLong(1), "heartbeatIntervalMillis" : NumberLong(2000), "members" : \[ { "\_id" : 0, "name" : "10.0.0.134:28017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 1532, "optime" : { "ts" : Timestamp(1515057570, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2018-01-04T09:19:30Z"), "electionTime" : Timestamp(1515056187, 1), "electionDate" : ISODate("2018-01-04T08:56:27Z"), "configVersion" : 6, "self" : true }, { "\_id" : 1, "name" : "10.0.0.134:28018", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 1395, "optime" : { "ts" : Timestamp(1515057570, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2018-01-04T09:19:30Z"), "lastHeartbeat" : ISODate("2018-01-04T09:19:30.915Z"), "lastHeartbeatRecv" : ISODate("2018-01-04T09:19:30.926Z"), "pingMs" : NumberLong(0), "syncingTo" : "10.0.0.134:28017", "configVersion" : 5 }, { "\_id" : 2, "name" : "10.0.0.134:28019", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 1395, "optime" : { "ts" : Timestamp(1515057534, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2018-01-04T09:18:54Z"), "lastHeartbeat" : ISODate("2018-01-04T09:19:30.902Z"), "lastHeartbeatRecv" : ISODate("2018-01-04T09:19:30.922Z"), "pingMs" : NumberLong(0), "syncingTo" : "10.0.0.134:28017", "configVersion" : 5 }, { "\_id" : 4, "name" : "10.0.0.134:28020", "health" : 1, "state" : 7, "stateStr" : "ARBITER", #仲裁节点 "uptime" : 34, "lastHeartbeat" : ISODate("2018-01-04T09:19:30.903Z"), "lastHeartbeatRecv" : ISODate("2018-01-04T09:19:30.924Z"), "pingMs" : NumberLong(0), "syncingTo" : "10.0.0.134:28019", "configVersion" : 5 } \], "ok" : 1 }
MongoDB复制集技术

 

 #主、从、仲裁节点对比

MongoDB复制集技术
#主节点操作 \[mongod@mongo ~\]$ mongo --port=28017 MongoDB shell version: 3.2.8 connecting to: 127.0.0.1:28017/test my\_repl:PRIMARY> use test switched to db test my\_repl:PRIMARY> db.anyux.insert(\[{"language":"C"},{"language":"C++"}\]) #插入数据 BulkWriteResult({ "writeErrors" : \[ \], "writeConcernErrors" : \[ \], "nInserted" : 2, "nUpserted" : 0, "nMatched" : 0, "nModified" : 0, "nRemoved" : 0, "upserted" : \[ \] }) my\_repl:PRIMARY> db.anyux.find().pretty()                   #主节点显示数据 { "\_id" : ObjectId("5a4df337c702312dedac9176"), "language" : "C" } { "\_id" : ObjectId("5a4df337c702312dedac9177"), "language" : "C++" }

#从节点操作 MongoDB shell version: 3.2.8 connecting to: 127.0.0.1:28018/test my_repl:SECONDARY> use test my_repl:SECONDARY> rs.slaveOk(); my_repl:SECONDARY> db.anyux.find().pretty() #从节点显示数据 { "_id" : ObjectId("5a4df337c702312dedac9176"), "language" : "C" } { "_id" : ObjectId("5a4df337c702312dedac9177"), "language" : "C++" }

#仲裁节点 [mongod@mongo ~]$ mongo --port=28020 MongoDB shell version: 3.2.8 connecting to: 127.0.0.1:28020/test my_repl:ARBITER> rs.slaveOk(); my_repl:ARBITER> show dbs; local 0.000GB test 0.000GB my_repl:ARBITER> db.anyux.find().pretty(); #仲裁节点不会存储数据 Error: error: { "ok" : 0, "errmsg" : "node is recovering", "code" : 13436 }

MongoDB复制集技术

 

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解2016年09月02日00:00:36 \牧野(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fme.csdn.net%2Fdcrmg) 阅读数:59593
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Google地球出现“无法连接到登录服务器(错误代码:c00a0194)”解决方法
Google地球出现“无法连接到登录服务器(错误代码:c00a0194)”解决方法参考文章:(1)Google地球出现“无法连接到登录服务器(错误代码:c00a0194)”解决方法(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.codeprj.com%2Fblo
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这