复制集搭建 没毛病: 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复制集技术的更多相关文章

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

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

  2. MongoDB复制集成员及状态转换

    此文已由作者温正湖授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 复制集(Replica Set)是MongoDB核心组件,相比早期版本采用的主从(Master-Slave) ...

  3. MongoDB复制集原理

    版权声明:本文由孔德雨原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/136 来源:腾云阁 https://www.qclo ...

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

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

  5. MongoDb复制集实现故障转移,读写分离

    前言 数据库技术是信息系统的一个核心技术,发展很快,各种功能类型数据库层出不穷,之前工作中使用过关系型数据库(mysql.oracle等).面相对象数据库(db4o).key-value存储(Memc ...

  6. MongoDB复制集概念架构浅析

    一.复制集的作用 (1) 高可用 防止设备(服务器.网络)故障. 提供自动failover 功能. 技术来保证数 (2) 灾难恢复 当发生故障时,可以从其他节点恢复. (3) 功能隔离 用于分析.报表 ...

  7. 02 . MongoDB复制集,分片集,备份与恢复

    复制集 MongoDB复制集RS(ReplicationSet): 基本构成是1主2从的结构,自带互相监控投票机制(Raft(MongoDB)Paxos(mysql MGR 用的是变种)) 如果发生主 ...

  8. MongoDB 复制集 (一) 成员介绍

       一 MongoDB 复制集简介          MongoDB的复制机制主要分为两种:          Master-Slave    (主从复制)      这个已经不建议使用       ...

  9. mongodb 复制集

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

随机推荐

  1. mfs windows客户端

    之前用moosefs,苦于没有Windows客户端, 本来想在Linux上mfsmount一个目录然后用samba做共享目录,但是这样太不简洁了. 当然豆瓣上有的小伙伴也说自己开发了moosefs的W ...

  2. C++获取数组的长度

    C++获取数组的长度 #include<iostream> using namespace std; template<class T> int length(T& a ...

  3. SpringApplication执行流程

    SpringApplication类的直接作用是在main方法中通过自有的run方法启动spring应用. 具体的run方法为: public static ConfigurableApplicati ...

  4. list的相关函数

    # ### 列表相关的函数 # (1) append ''' 功能:向列表的末尾添加新的元素 格式:列表.append(值) 返回值:None 注意:新添加的值在列表的末尾,该函数直接操作原有列表 ' ...

  5. php优秀框架codeigniter学习系列——CI_Router类学习

    这篇文章主要介绍CI核心框架工具类CI_Router. 如果说CI_URI类是用来解析URI,那么CI_Router类就应该是根据解析出来的URI来决定究竟访问哪一个文件和哪一个function. 详 ...

  6. mysql在查询中常见问题汇总

    1.从主从表中查询外键内容(常见问题) 从主从表中查询对应的外键,需要指定外键的表,即sno=> student.sno或者score.sno 错误:select sno,sname,degre ...

  7. 周强201771010141《面向对象程序设计(java)》第一周学习总结

    周强201771010141<面向对象程序设计(java)>第一周学习总结 第一部分:课程准备部分 填写课程学习 平台注册账号, 平台名称 注册账号 博客园:www.cnblogs.com ...

  8. Js/对数组的认识。

    1.是对数组的声明:   var auditTaskIds = []; 我一般的写法.   var auditTaskIds1 = [];  2.向数组中添加元素:   auditTaskIds.pu ...

  9. 两个1/x类的广义函数

    [转载请注明出处]http://www.cnblogs.com/mashiqi 2017/04/15 1.$\text{p.v.}\,\frac{1}{x}$ 因为$(x \ln x - x)' = ...

  10. jupyter notebook中使用mpld3进行交互

    用pycharm进行远程服务器debug可以说是非常的爽了,但是设置远程的图片在本地显示会非常的麻烦 jupyter可以用%matplotlib inline 来远程plt.show图片,但是有一个问 ...