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

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

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

MongoDB复制集简介

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

复制的基本架构

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

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

如果加上可选的仲裁者:

如果主服务器失效:

复制集技术实现

搭建三节点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: filepath: /mongodb/28017/log/mongodb.loglogAppend: true
storage:journal:enabled: truedbPath: /mongodb/28017/datadirectoryPerDB: true#engine: wiredTigerwiredTiger:engineConfig:cacheSizeGB: 1directoryForIndexes: truecollectionConfig:blockCompressor: zlibindexConfig:prefixCompression: true
processManagement:fork: true
net:port: 28017
replication:oplogSizeMB: 2048replSetName: 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 -ichown -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

登录

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 },
] );

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

[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
}

#查看当前是否为主节点

#主节点检测
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
}

#在主节点上添加节点

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
}

#删除节点

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
}

#添加仲裁节点

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
}

#主、从、仲裁节点对比

#主节点操作
[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 }

转载于:https://www.cnblogs.com/anyux/p/8194648.html

MongoDB复制集技术相关推荐

  1. Raft与MongoDB复制集协议比较

    在一文搞懂raft算法一文中,从raft论文出发,详细介绍了raft的工作流程以及对特殊情况的处理.但算法.协议这种偏抽象的东西,仅仅看论文还是比较难以掌握的,需要看看在工业界的具体实现.本文关注Mo ...

  2. MongoDB复制集与Raft协议异同点分析

    此文已由作者温正湖授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 一.日志复制流程: a.raft leader节点在接收client请求后,先将请求写到日志中,再将日志通过 ...

  3. MongoDB复制集(Replication Sets)介绍

    近年来,随着大数据越来越火,非关系型数据库的重要性被越来越多的人所认知,越来越多的开发者逐渐加入到NoSQL的阵营中.我们知道NoSQL是Not Only SQL的意思,既然如此,很多关系型数据库所支 ...

  4. 配置MongoDB复制集

    什么是复制集? 复制集是额外的数据副本,是跨多个服务器同步数据的过程,复制集提供了冗余并增加了数据可用性,通过复制集可以对硬件故障和中断的服务进行恢复. 复制集的优势如下: 让数据更安全 高数据可用性 ...

  5. MongoDB 复制集的选举原理

    复制的原理         复制时基于啊哦做日志 oplog , 相当于 MySQL 中的二进制日志,只记录发生改变的记录.复制是将主节点的oplog 日志同步并应用到其他从节点的过程. 选举的原理 ...

  6. MongoDB 复制集的结构以及基本概念

    MongoDB 复制集的架构中,主要分为两部分:主节点(Primary)和从节点(Secondary). 主节点:在一个复制集中只有并且必须有一个主节点,主节点也是众多实例中唯一可以接收客户端写操作的 ...

  7. MongoDB 复制集节点增加移除及节点属性配置

    复制集(replica Set)或者副本集是MongoDB的核心高可用特性之一,它基于主节点的oplog日志持续传送到辅助节点,并重放得以实现主从节点一致.再结合心跳机制,当感知到主节点不可访问或宕机 ...

  8. MongoDB复制集搭建主服务器模拟切换

    前言 Mongodb复制集由一组Mongod实例(进程)组成,包含一个Primary节点和多个Secondary节点,Mongodb Driver(客户端)的所有数据都写入Primary,Second ...

  9. educoder MongoDB 复制集 分片

    第2关:MongoDB 复制集搭建 mkdir -p /data/test/db1 /data/test/db2 /data/test/db3 mkdir -p /logs/test touch { ...

最新文章

  1. 指针空间的申请与释放
  2. 低价电阻箱-阻值测试
  3. 8个问题全面了解5G关键技术Massive MIMO
  4. elasticsearch mapping之store
  5. CityEngine快捷键一览表
  6. 爱思助手短信备份到安卓_爱思助手肿么将短信导入iphone
  7. settimeout怎么用_怎么实现一个3d翻书效果
  8. 高斯卷积核如何生成 C语言实现
  9. git 提交遇到error:fail to push some refer to 远程地址(url)
  10. 微信公众号JSSDK中的wx.ready()和wx.error()问题
  11. VUE+axios+php实现图片上传
  12. PAT-BASIC-1001-害死人不偿命的(3n+1)猜想
  13. php正则验证邮箱、手机号、姓名、身份证、特殊符号等
  14. 《HALCON机器视觉与算法原理编程实践》第1章 机器视觉概述-学习笔记
  15. JDK、STS、SVN、Tomcat 、mysql的下载安装及环境变量的配置和sts修改字体大小
  16. win系统下非系统盘msdia.dll文件怎么处理
  17. 阿里巴巴实习生面试悲惨经历
  18. 深度卷积神经网络最新进展综述
  19. 计算机硬件及编程语言
  20. css3中的渐变色效果

热门文章

  1. 时间插件只能选择整点和半点_我花一小时自制了三款PPT插件,不仅免费分享,还想手把手教你制作...
  2. oracle轮询方式循环输出,LGWR的两种模式(POST/WAIT和POLLING)
  3. linux离线安装redmine_Linux 下一款非常好用的翻译软件
  4. 金蝶k3单据编码规则_金蝶K3存货跌价案例教程
  5. 【theano-windows】学习笔记十二——卷积神经网络
  6. 《少年先疯队》第九次团队作业:Beta冲刺与团队项目验收
  7. 【】MTCNN基于NCNN的测试过程
  8. Cordova - 彻底搞定IOS编译!
  9. 判断字符串中是否为数字的三种方法
  10. ComponentName的意思