MongoDB复制集技术
复制集搭建 没毛病: https://www.cnblogs.com/nicolegxt/p/6841442.html?utm_source=itdadao&utm_medium=referral#commentform
转载:https://i.cnblogs.com/EditPosts.aspx?opt=1
为什么使用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: 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 </span>cp /mongodb/28017/conf/mongod.conf /mongodb/28018/conf/
</span>cp /mongodb/28017/conf/mongod.conf /mongodb/28019/conf/
</span>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

登录

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 }

MongoDB复制集技术的更多相关文章
- Raft与MongoDB复制集协议比较
在一文搞懂raft算法一文中,从raft论文出发,详细介绍了raft的工作流程以及对特殊情况的处理.但算法.协议这种偏抽象的东西,仅仅看论文还是比较难以掌握的,需要看看在工业界的具体实现.本文关注Mo ...
- MongoDB复制集成员及状态转换
此文已由作者温正湖授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 复制集(Replica Set)是MongoDB核心组件,相比早期版本采用的主从(Master-Slave) ...
- MongoDB复制集原理
版权声明:本文由孔德雨原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/136 来源:腾云阁 https://www.qclo ...
- MongoDB复制集与Raft协议异同点分析
此文已由作者温正湖授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 一.日志复制流程: a.raft leader节点在接收client请求后,先将请求写到日志中,再将日志通过 ...
- MongoDb复制集实现故障转移,读写分离
前言 数据库技术是信息系统的一个核心技术,发展很快,各种功能类型数据库层出不穷,之前工作中使用过关系型数据库(mysql.oracle等).面相对象数据库(db4o).key-value存储(Memc ...
- MongoDB复制集概念架构浅析
一.复制集的作用 (1) 高可用 防止设备(服务器.网络)故障. 提供自动failover 功能. 技术来保证数 (2) 灾难恢复 当发生故障时,可以从其他节点恢复. (3) 功能隔离 用于分析.报表 ...
- 02 . MongoDB复制集,分片集,备份与恢复
复制集 MongoDB复制集RS(ReplicationSet): 基本构成是1主2从的结构,自带互相监控投票机制(Raft(MongoDB)Paxos(mysql MGR 用的是变种)) 如果发生主 ...
- MongoDB 复制集 (一) 成员介绍
一 MongoDB 复制集简介 MongoDB的复制机制主要分为两种: Master-Slave (主从复制) 这个已经不建议使用 ...
- mongodb 复制集
mongodb 复制集 复制集简介 Mongodb复制集由一组Mongod实例(进程)组成,包含一个Primary节点和多个Secondary节点,Mongodb Driver(客户端)的所有数据都写 ...
随机推荐
- Winform关于未找到元数据文件.exe和不包含适合于入口点的静态“Main”方法
在三层架构中ItcastCaterModel项目是被其他项目引用的,所以输出类型为类库.
- 解决pycharm添加第三方包失败
今天想用pycharm打开图像,但是import scipy的时候报错了,报错内容如下: from scipy.misc import imread Traceback (most recent ca ...
- ORA-12638: 身份证明检索失败的解决方法
本地oracle客户端用PLSQL Developer连接远程数据库,每次登录都会在很久之后,出现 ORA-12638: 身份证明检索失败,tnsping 表明TNS配置没有问题. 解决方案: D:\ ...
- java 线程操作
停止线程 创建“停止标记”,thread.interrupt() 准确的说interrupt()方法只是“告知线程该停止了”,而线程检查到该“告知”后,再通过其他的办法停止线程. 线程调用了inter ...
- [Linux]Redhat7配置本地镜像源
一.Redhat7源 上一个文章介绍了如何配置的Redhat7的YUM网络源:[Linux]Redhat7配置CentOS7 YUM源 .如果在无法联网的情况下,可以使用镜像文件作为源安装需要的包. ...
- Java易错题(1)
检查程序,是否存在问题,如果存在指出问题所在,如果不存在,说明输出结果. public class HelloB extends HelloA { public HelloB() { } { Syst ...
- 操作系统の实验四 windows中线程的创建和同步控制
摘要: 1.创建信号量 HANDLE CreateSemaphore( LPSECURITY_ATTIBUTES lpSemaphoreAttributes, LONG lInitialCount; ...
- C#获取程序运行时间
需要用到System.Diagnostics名称空间中的Stopwatch类! Stopwatch类其中有一个属性ElapsedMilliseconds.该属性是获取当前运行时间,以毫秒为单位! 其中 ...
- JVM Optimization
架构图 基本概念说明 堆(heap):数据存储,对象实例:空间往上增长,线程共享区:大小可通过-Xmx和-Xms配置 新生代(Young Generation):划分为Eden Space和两个Sur ...
- c#抓屏功能在DPI缩放后,截到的图片不完整的问题
/// <summary> /// 获取屏幕快照 /// </summary> /// <returns></returns> public stati ...