一、Replica Set 集群分为两种架构:

  • 奇数个节点构成Replica Set,所有节点拥有数据集。最小架构: 1个Primary节点,2个Secondary节点

  • 偶数个节点 + 一个仲裁节点 构成的Replica Set,节点拥有数据集,仲裁节点仅参与仲裁选举出Primary节点。 最小架构:1个Primary节点,1个Secondary节点,1个Arbiter节点
  •  

接下来就以3台服务器为例,部署具有仲裁的框架。

IP地址 操作系统版本 MongoDB版本 端口 功能
10.10.18.10 Centos7.5  4.0  27017  Primary 
10.10.18.11 Centos7.5  4.0  27017  Secondary
10.10.18.12 Centos7.5  4.0  27017  Arbiter

二、安装部署(请访问 "MongoDB安装")

Primary的配置文件:

systemLog:destination: filepath: "/data/mongodb/log/mongod.log"logAppend: true
storage:dbPath: "/data/mongodb/data"journal:enabled: truewiredTiger:engineConfig:cacheSizeGB: 2
processManagement:fork: truepidFilePath: "/data/mongodb/pid/m.pid"
net:bindIp: 10.10.18.10port: 27017
replication:replSetName: "rs0"

Secondary的配置文件

systemLog:destination: filepath: "/data/mongodb/log/mongod.log"logAppend: true
storage:dbPath: "/data/mongodb/data"journal:enabled: truewiredTiger:engineConfig:cacheSizeGB: 2
processManagement:fork: truepidFilePath: "/data/mongodb/pid/m.pid"
net:bindIp: 10.10.18.11port: 27017replication:replSetName: "rs0"

Arbiter的配置文件

systemLog:destination: filepath: "/data/mongodb/log/mongod.log"logAppend: true
storage:dbPath: "/data/mongodb/data"journal:enabled: truewiredTiger:engineConfig:cacheSizeGB: 2
processManagement:fork: truepidFilePath: "/data/mongodb/pid/m.pid"
net:bindIp: 10.10.18.12port: 27017replication:replSetName: "rs0"

启动三台服务器上的mongdb

mongod -f /data/mongodb/mongod.conf

关闭进程

 mongod -f /data/mongodb/mongod.conf --shutdown

三、配置Replica Set

登录三台服务器中任意一台,登录mongo(如果报错就将配置文件中:security 内容暂时先去掉)

mongo --host 10.10.18.10

>cfg={ _id:"rs0",members:[{_id:0,host:'10.10.18.10:27017',priority:1},{_id:1,host:'10.10.18.11:27017',priority:1},{_id:2,host:'10.10.18.12:27017',arbiterOnly:true}] };>rs.initiate(cfg)

查看Replica Set配置

> rs.conf()

{
"_id" : "rs0",
"version" : 1,
"protocolVersion" : NumberLong(1),
"writeConcernMajorityJournalDefault" : true,
"members" : [
{
"_id" : 0,
"host" : "10.10.18.10:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {

},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 1,
"host" : "10.10.18.11:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {

},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2,
"host" : "10.10.18.12:27017",
"arbiterOnly" : true,
"buildIndexes" : true,
"hidden" : false,
"priority" : 0,
"tags" : {

},
"slaveDelay" : NumberLong(0),
"votes" : 1
}
],
"settings" : {
"chainingAllowed" : true,
"heartbeatIntervalMillis" : 2000,
"heartbeatTimeoutSecs" : 10,
"electionTimeoutMillis" : 10000,
"catchUpTimeoutMillis" : -1,
"catchUpTakeoverDelayMillis" : 30000,
"getLastErrorModes" : {

},
"getLastErrorDefaults" : {
"w" : 1,
"wtimeout" : 0
},
"replicaSetId" : ObjectId("5cff76e5e57e23a5bc7054e2")
}
}

四、验证Replica Set

在Primary中插入数据

rs0:PRIMARY>  show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
rs0:PRIMARY> db.users.insertOne(
... {
... name:"sue",
... age: 26,
... status:"pending"
... })
{"acknowledged" : true,"insertedId" : ObjectId("5cff79e8993e70290a081d04")
}

rs0:PRIMARY> db.users.find()
{ "_id" : ObjectId("5cff79e8993e70290a081d04"), "name" : "sue", "age" : 26, "status" : "pending" }

在Secondary中,默认是不允许读

rs0:SECONDARY> db.users.find()
Error: error: {"operationTime" : Timestamp(1560247181, 1),"ok" : 0,"errmsg" : "not master and slaveOk=false","code" : 13435,"codeName" : "NotMasterNoSlaveOk","$clusterTime" : {"clusterTime" : Timestamp(1560247181, 1),"signature" : {"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),"keyId" : NumberLong(0)}}
}

五、创建用户

六、故障模拟

停止Primary上的mongo进程,在Secondary上登录mongo查看

mongo --host 10.10.18.11

rs0:PRIMARY> db.users.find()
{ "_id" : ObjectId("5cff79e8993e70290a081d04"), "name" : "sue", "age" : 26, "status" : "pending" }

发现原Secondary变成Primary,并且可以进行查询。

开启原Primary服务器上的mongo进程,该服务器变成了Secondary。

七、数据备份和恢复

mongodump从MongoDB中读取数据,保存为BSON文件,mongorestore读取BSON文件恢复到MongoDB中。适用于小型MongoDB的备份和恢复。

mongodump备份的时候只备份MongoDB中的文档,使用mongorestore恢复之后需要重建索引

mongodump --host 10.10.18.11 --port 27017 --username myUserAdmin --password abc123 --gzip --out /data/mongobak/$(date +%F)

注:--oplog  表示备份的时候oplog.bson文件,存放在dump开始 到 dump结束之间所有的oplog。

根据前面的备份恢复到一个新的Replica Set集群中其中一台服务器上。

恢复

恢复的过程中,不要启用认证。否则在将其他机器加入到Replica Set集群中来的时候,会出现无法认证的问题。

1、首先在一台服务器上开启一个干净mongo服务(无任何数据),做为 Primary

mongd.conf配置文件内容

systemLog:destination: filepath: "/data/mongodb/log/mongod.log"logAppend: true
storage:dbPath: "/data/mongodb/data"journal:enabled: truewiredTiger:engineConfig:cacheSizeGB: 2
processManagement:fork: truepidFilePath: "/data/mongodb/pid/mongod.pid"
net:bindIp: 10.10.18.10port: 27017
replication:replSetName: "rs0"

2、开启mongod服务

/data/mongodb/bin/mongod -f /data/mongodb/mongod.conf

3、创建单个Replica Set

登录mongo,然后创建单个Replica Set

mongo --host 10.10.18.10
> cfg={_id:"rs0",members:[{_id:0,host:'10.10.18.10:27017',priority:1}]}
> rs.initiate(cfg)

创建结果:

 1 {
 2         "ok" : 1,
 3         "operationTime" : Timestamp(1560394449, 1),
 4         "$clusterTime" : {
 5                 "clusterTime" : Timestamp(1560394449, 1),
 6                 "signature" : {
 7                         "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
 8                         "keyId" : NumberLong(0)
 9                 }
10         }
11 }

View Code

创建好了之后,就可以查看当前的数据库

rs0:SECONDARY> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB

可以发现,目前就三个基本的数据库。

4、恢复数据

mongorestore --host 10.10.18.10 --port 27017 --gzip /data/mongobak/2019-06-12 

结果

 1 2019-06-13T10:55:33.817+0800    preparing collections to restore from
 2 2019-06-13T10:55:33.829+0800    reading metadata for admin.test from /data/mongobak/2019-06-12/admin/test.metadata.json.gz
 3 2019-06-13T10:55:33.832+0800    reading metadata for test.users from /data/mongobak/2019-06-12/test/users.metadata.json.gz
 4 2019-06-13T10:55:33.834+0800    reading metadata for reporting.reporting from /data/mongobak/2019-06-12/reporting/reporting.metadata.json.gz
 5 2019-06-13T10:55:33.841+0800    reading metadata for admin.reporting from /data/mongobak/2019-06-12/admin/reporting.metadata.json.gz
 6 2019-06-13T10:55:33.861+0800    restoring test.users from /data/mongobak/2019-06-12/test/users.bson.gz
 7 2019-06-13T10:55:34.085+0800    restoring admin.test from /data/mongobak/2019-06-12/admin/test.bson.gz
 8 2019-06-13T10:55:34.123+0800    no indexes to restore
 9 2019-06-13T10:55:34.123+0800    finished restoring test.users (1 document)
10 2019-06-13T10:55:34.123+0800    restoring admin.reporting from /data/mongobak/2019-06-12/admin/reporting.bson.gz
11 2019-06-13T10:55:34.175+0800    restoring reporting.reporting from /data/mongobak/2019-06-12/reporting/reporting.bson.gz
12 2019-06-13T10:55:34.230+0800    no indexes to restore
13 2019-06-13T10:55:34.230+0800    finished restoring admin.test (2 documents)
14 2019-06-13T10:55:34.233+0800    no indexes to restore
15 2019-06-13T10:55:34.233+0800    finished restoring reporting.reporting (1 document)
16 2019-06-13T10:55:34.234+0800    no indexes to restore
17 2019-06-13T10:55:34.234+0800    finished restoring admin.reporting (1 document)
18 2019-06-13T10:55:34.234+0800    restoring users from /data/mongobak/2019-06-12/admin/system.users.bson.gz
19 2019-06-13T10:55:34.312+0800    done

View Code

恢复完成,在登录mongo查看,恢复数据库的情况。

 1 rs0:PRIMARY> show dbs
 2 admin      0.000GB
 3 config     0.000GB
 4 local      0.000GB
 5 reporting  0.000GB
 6 test       0.000GB
 7 rs0:PRIMARY> use test
 8 switched to db test
 9 rs0:PRIMARY> show collections
10 users
11 rs0:PRIMARY> db.users.find()
12 { "_id" : ObjectId("5cff79e8993e70290a081d04"), "name" : "sue", "age" : 26, "status" : "pending" }

可以看出之前的记录已经恢复了。

注意:如果备份时,MongoDB是拥有用户名和密码才能进行登录的,在恢复之后,用户名和密码也是可以使用的。如果需要在使用认证登录,需要将下面信息添加的配置文件mongod.conf:

security:keyFile: "/data/mongodb/keyfile"authorization: "enabled"

然后重启mongo服务。

5、关闭刚恢复的MongoDB,将数据目录同步到另一台服务器上,作为Secondary

通过之前,确认该台服务器上的mongo是无任何数据。将Primary服务上的 /data/mongodb/data 同步到 Secondary服务器上  /data/mongodb/data

6、依次开启Primary、Secondary、Arbiter的mongo服务

7、在Primary服务器上,将Secondary、Arbiter加入到Replica Set集群中来

查看当前Replica Set集群的配置

rs0:PRIMARY> rs.conf()
{"_id" : "rs0","version" : 1,"protocolVersion" : NumberLong(1),"writeConcernMajorityJournalDefault" : true,"members" : [{"_id" : 0,"host" : "10.10.18.10:27017","arbiterOnly" : false,"buildIndexes" : true,"hidden" : false,"priority" : 1,"tags" : {},"slaveDelay" : NumberLong(0),"votes" : 1}],"settings" : {"chainingAllowed" : true,"heartbeatIntervalMillis" : 2000,"heartbeatTimeoutSecs" : 10,"electionTimeoutMillis" : 10000,"catchUpTimeoutMillis" : -1,"catchUpTakeoverDelayMillis" : 30000,"getLastErrorModes" : {},"getLastErrorDefaults" : {"w" : 1,"wtimeout" : 0},"replicaSetId" : ObjectId("5d01bad15dfd3f294d147b36")}
}

可以看到当前Replica Set集群中就一台服务器

将Secondary、Arbiter加入到Replica Set集群中

rs0:PRIMARY> rs.add(
... {
... _id: 1,
... host:'10.10.18.11:27017',
... priority:1
... }
... )
{"ok" : 1,"operationTime" : Timestamp(1560397822, 1),"$clusterTime" : {"clusterTime" : Timestamp(1560397822, 1),"signature" : {"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),"keyId" : NumberLong(0)}}
}
rs0:PRIMARY> rs.add(
... {
... _id: 2,
... host:'10.10.18.12:27017',
... arbiterOnly:true
... }
... )
{"ok" : 1,"operationTime" : Timestamp(1560397830, 1),"$clusterTime" : {"clusterTime" : Timestamp(1560397830, 1),"signature" : {"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),"keyId" : NumberLong(0)}

再次查看状态:

rs0:PRIMARY> rs.conf()
{"_id" : "rs0","version" : 3,"protocolVersion" : NumberLong(1),"writeConcernMajorityJournalDefault" : true,"members" : [{"_id" : 0,"host" : "10.10.18.10:27017","arbiterOnly" : false,"buildIndexes" : true,"hidden" : false,"priority" : 1,"tags" : {},"slaveDelay" : NumberLong(0),"votes" : 1},{"_id" : 1,"host" : "10.10.18.11:27017","arbiterOnly" : false,"buildIndexes" : true,"hidden" : false,"priority" : 1,"tags" : {},"slaveDelay" : NumberLong(0),"votes" : 1},{"_id" : 2,"host" : "10.10.18.12:27017","arbiterOnly" : true,"buildIndexes" : true,"hidden" : false,"priority" : 0,"tags" : {},"slaveDelay" : NumberLong(0),"votes" : 1}],"settings" : {"chainingAllowed" : true,"heartbeatIntervalMillis" : 2000,"heartbeatTimeoutSecs" : 10,"electionTimeoutMillis" : 10000,"catchUpTimeoutMillis" : -1,"catchUpTakeoverDelayMillis" : 30000,"getLastErrorModes" : {},"getLastErrorDefaults" : {"w" : 1,"wtimeout" : 0},"replicaSetId" : ObjectId("5d01bad15dfd3f294d147b36")}
}

加入成功。

开启认证访问

在三台服务器的配置文件中添加:

security:keyFile: "/data/mongodb/keyfile"authorization: "enabled"

然后依次关闭:Arbiter Secondary Primary

依次开启:Primary Secondary Arbiter 

 

security:keyFile: "/data/mongodb/keyfile"authorization: "enabled"

转载于:https://www.cnblogs.com/sz-wenbin/p/11004179.html

MongoDB的集群模式--Replica Set相关推荐

  1. MongoDB分布式集群架构(3种模式)

    MongoDB 有三种集群部署模式,分别为主从复制(Master-Slaver).副本集(Replica Set)和分片(Sharding)模式. Master-Slaver 是一种主从副本的模式,目 ...

  2. mongodb 集群shard_mongodb replica set shard 分片 高可用 集群

    mongodb采用的分片原理,其实很简单,说白了就是,一个蛋糕特别大,需要非常非常大的盒子才能装下,就算装下了存储也不方便,所以把大蛋糕切成小蛋糕进行存储.这种思想在其他应用或数据库中也有应用.例如: ...

  3. Mongodb的集群

    序言 Mongodb的集群环境,的工作原理简单梳理下.当然也是站在别人的肩膀上(多人的肩膀上).做一个我认为比较好的梳理. 原理是个很重要的东西,可以帮助你解决 你不知道你不知道的问题. 同时也帮助你 ...

  4. NOSQL,MongoDB分布式集群架构

    MongoDB分布式集群架构 看到这里相信你已经掌握了 MongoDB 的大部分基本知识,现在在单机环境下操作 MongoDB 已经不存在问题,但是单机环境只适合学习和开发测试,在实际的生产环境中,M ...

  5. MongoDB分布式集群(一)

    MongoDB分布式集群 集群方式有三种:Master-Slaver(主从).Replica Set(副本集).Sharding(分片)三种方式. 关于MongoDB集群: 三种模式各有优劣,适用于不 ...

  6. 需要单机还是集群部署_5000W如何玩转Filecoin市场 部署最符合企业的集群模式

    5000W如何玩转Filecoin市场 部署最符合企业的集群模式 对 Filecoin集群的研究,其实一直以来都没有停止过. 如果我们将 Filecoin挖矿比作建高楼大厦.那么,集群就像打地基,地基 ...

  7. 深入剖析Redis系列(三) - Redis集群模式搭建与原理详解

    前言 在 Redis 3.0 之前,使用 哨兵(sentinel)机制来监控各个节点之间的状态.Redis Cluster 是 Redis 的 分布式解决方案,在 3.0 版本正式推出,有效地解决了 ...

  8. CentOS7下安装Redis伪集群(基于Redis官方Cluster集群模式版本redis-5.0.10)

    文章目录 Redis简介 什么是redis redis的优点 Redis集群都有哪些模式 主从复制(Master-Slave Replication) 哨兵模式(Sentinel) Redis官方 C ...

  9. MongoDb分片集群认证

    本文主要基于已经搭建好的未认证集群,结合上篇Mongodb副本集分片集群模式环境部署(https://www.cnblogs.com/woxingwoxue/p/9875878.html), Mong ...

最新文章

  1. 为什么重新new两个线程线程号相同_面试官每次问我关于线程间通信方法,我都回答的很糟糕...
  2. oracle实现数据目录共享,为共享文件系统创建特定于节点的文件和目录
  3. sysdba登录不需要密码验证?
  4. 初识压缩感知 compressive sensing
  5. Leetcode 703. 数据流中的第K大元素 解题思路及C++实现
  6. 王建然之欲望和理想的对话
  7. TimeQuest学习总结
  8. java 怎么清除画布_HTML5 Canvas 清除画布
  9. Linux命令修复方法,在Linux终端运行sudoedit -s /命令看未修复和已修复的效果
  10. Sharding-Jdbc实现读写分离、分库分表,妙!
  11. Spring框架----AOP的概念及术语
  12. Redis复制与可扩展集群搭建
  13. 教室录播系统方案_学校教室录播系统解决方案
  14. “华为杯”第17届中国研究生数学建模竞赛B题二等奖论文
  15. js判断设备是PC端还是移动端
  16. 计算机教学常规检查小结,总结·反思·提高——邮政路小学全体教师期末教学常规检查反馈...
  17. Code.V光学设计学习(一)——入门介绍
  18. 【工作日记18】渗透测试之xml注入攻击、CRLF漏洞
  19. 云中漫步-柴米油盐之上
  20. alipay_open_auth_token_app_response“:{“code“:“40002“,“msg“:“Invalid Arguments“,“sub_code“:“isv.inval

热门文章

  1. 网络共享服务Samba和NFS配置
  2. 出生日期,看出你的天赋
  3. 【Node】模块加载过程
  4. 修改Windows 7默认的软件安装路径
  5. Java并发编程—常见面试题
  6. 性能测试:服务器配置清单分析
  7. MacOs桌面自动被打乱的原因
  8. greenPlum资源隔离
  9. excel运行最多行数
  10. hdu 1233 还是畅通工程(最小生成树的Prim和Kruskal两种算法的c++实现)(prim算法详解)...