MongoDB复制集技术

为什么使用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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/255774.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux文件系统的实现 (图文并茂,比较好)

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢! Linux文件管理从用户的层面介绍了Linux管理文件的方式。Linux有一个树状结构来组织文件。树的顶端为根目录(/),节点为目录&#xff0…

【深度学习】——如何处理输入图像大小不一样的情况

这里一般有常见的几种方法: 1)将图像缩放成大小一致后再输入,如RCNN算法 2)roi pooling:这里允许输入图像的大小不一样,后续根据指定的固定大小来求解池化的核大小,以此来得到相同大小的特征图&…

ROS探索总结(一)——ROS简介

随着机器人领域的快速发展和复杂化,代码的复用性和模块化的需求原来越强烈,而已有的开源机器人系统又不能很好的适应需求。2010年Willow Garage公司发布了开源机器人操作系统ROS(robot operating system),很快在机器人…

微信浏览器取消缓存的方法

摘要:做微信公家号以及调试手机页面的时辰,防止不了页面要跳转到微信阅读器打开,调试阶段,android版微信阅读器一直都默许缓存html静态资本,每一次静态资本变革乃至新内容发布的时辰在微信阅读器上都极有可能不克不及更新&#xf…

【机器视觉】——裂纹检测笔记

目录 传统算法处理裂缝的基本思路: 第一种思路 第二种思路: 第三种思路 CPP代码 halcon代码 python代码 Matlab代码 深度学习缺陷检测 裂缝检测文献 传统算法处理裂缝的基本思路: 第一种思路 1.先转换彩色图为灰度图 2.进行自适应…

利用union判断系统的大小端

int checkCPUendian()//返回1,为小端;反之,为大端; { union{ unsigned int a; unsigned char b; }c; c.a 1; return 1 c.b; }大端模式(Big-endian),是指数据的高字节保存在内存的低地址中,而数据…

Filter(过滤器) 和 interceptor(拦截器)的区别

Filter(过滤器) 和 interceptor(拦截器)的区别 1.拦截器是基于java反射机制的,而过滤器是基于函数回调的。 2.过滤器依赖于Servlet容器,而拦截器不依赖于Servlet容器。 3.拦截器只对Action请求起作用&#…

ROS探索总结(二)——ROS总体框架

一、 总体结构 根据ROS系统代码的维护者和分布来标示,主要有两大部分:(1)main:核心部分,主要由Willow Garage公司和一些开发者设计、提供以及维护。它提供了一些分布式计算的基本工具,以及整个…

python 阿狸的进阶之路(4)

装饰器 #1、开放封闭原则:对扩展开放,对修改是封闭#2、装饰器:装饰它人的,器指的是任意可调用对象,现在的场景装饰器-》函数,被装饰的对象也是-》函数#原则:1、不修改被装饰对象的源代码 2、不修…

【深度学习】——利用pytorch搭建一个完整的深度学习项目(构建模型、加载数据集、参数配置、训练、模型保存、预测)

目录 一、深度学习项目的基本构成 二、实战(猫狗分类) 1、数据集下载 2、dataset.py文件 3、model.py 4、config.py 5、predict.py 一、深度学习项目的基本构成 一个深度学习模型一般包含以下几个文件: datasets文件夹:存放…

二叉树的序遍历

时间限制: 1 s空间限制: 32000 KB题目等级 : 白银 Silver题目描述 Description求一棵二叉树的前序遍历,中序遍历和后序遍历 输入描述 Input Description第一行一个整数n,表示这棵树的节点个数。 接下来n行每行2个整数L和R。第i行的两个整数Li和Ri代表编号…

GUI登录界面

在这次的作业中,我先使用单选按钮,输入框,复选框设计了一个简单地登录界面。接着我使用了MouseListener将登陆按钮与下一个“查询界面”连接起来。最后我使用了我们本周所学的JFrame框架与事件处理机制设计了一个简单地界面。我所设计的登录界…

浅谈ROS操作系统及其应用趋势

ROS操作系统是最先由斯坦福开发的开源机器人操作系统,目前由willowgarage公司开发和维护,相关的开发社区也很成熟( http://www.ros.org , http://answers.ros.org, http://www.willowgarage.com), 经过几年的发展API也逐渐稳定&a…

Raft学习传送门

Raft官网 官方可视化动画1 官方可视化动画2 论文中文翻译 论文英文地址 Paxos Made Simple论文翻译 Raft理解 技术分享 《分布式一致性raft算法实现原理》 状态机 MIT: raft实现 分布式系统学习2-Raft算法分析与实现 分布式系统MIT 6.824学习资源 知乎大神的&#…

【Python生成器与迭代器的区别】

目录 一、迭代 二、迭代器 1)创建迭代器——两种方法 iter()方法 利用()和range结合使用 2)具体案例 3、生成器 4、二者的异同 1)、共同点 2)、不同点 a、语法上 b、用法上 一、迭代 首先理解一…

BZOJ4426 : [Nwerc2015]Better Productivity最大生产率

如果一个区间包含另一个区间,那么这两个区间是否在一起的生产率是一样的。 将所有这种包含了其他区间的区间放入数组$b$,其余的放入数组$c$,有多个相同的时候则从$b$移一个到$c$。 那么$c$里所有区间左端点递增,右端点也递增&…

[codevs1105][COJ0183][NOIP2005]过河

[codevs1105][COJ0183][NOIP2005]过河 试题描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧。在桥上有一些石子,青蛙很讨厌踩在这些石子上。由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的…

ABB机器人套接口通信 机器人部分

ABB机器人套接口通信 机器人部分 文章机器人部分,描述如何运行机器人从机程序,使机器人根据上位机节点发送的命令,执行具体运动。 ABB机器人执行3个任务。这些任务都配置为SEMISTATIC(背景程序)的任务,第三任务是正常动作任务。下文描述如…

CRM项目总结

CRM项目总结 一:开发背景 在公司日益扩大的过程中,不可避免的会伴随着更多问题出现。 对外 : 如何更好的管理客户与公司的关系?如何更及时的了解客户日益发展的需求变化?公司的产品是否真的符合客户需求?以…

【面经——《速腾聚创科技有限公司——深度学习算法工程师》】

自我介绍 实习项目 1)项目主要应用的领域? 2)难点在哪?——机械臂吸盘大小和目标大小之间坐标的协调 3)难点不在于算法,在于数据的处理和均衡性?对于数据均衡方面有什么理解&#xf…