一、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: file
path: "/data/mongodb/log/mongod.log"
logAppend: true
storage:
dbPath: "/data/mongodb/data"
journal:
enabled: true
wiredTiger:
engineConfig:
cacheSizeGB:
processManagement:
fork: true
pidFilePath: "/data/mongodb/pid/m.pid"
net:
bindIp: 10.10.18.10
port:
replication:
replSetName: "rs0"

Secondary的配置文件

systemLog:
destination: file
path: "/data/mongodb/log/mongod.log"
logAppend: true
storage:
dbPath: "/data/mongodb/data"
journal:
enabled: true
wiredTiger:
engineConfig:
cacheSizeGB:
processManagement:
fork: true
pidFilePath: "/data/mongodb/pid/m.pid"
net:
bindIp: 10.10.18.11
port:
replication:
replSetName: "rs0"

Arbiter的配置文件

systemLog:
destination: file
path: "/data/mongodb/log/mongod.log"
logAppend: true
storage:
dbPath: "/data/mongodb/data"
journal:
enabled: true
wiredTiger:
engineConfig:
cacheSizeGB:
processManagement:
fork: true
pidFilePath: "/data/mongodb/pid/m.pid"
net:
bindIp: 10.10.18.12
port:
replication:
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:,host:'10.10.18.10:27017',priority:},{_id:,host:'10.10.18.11:27017',priority:},{_id:,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 .000GB
config .000GB
local .000GB
rs0:PRIMARY> db.users.insertOne(
... {
... name:"sue",
... age: ,
... 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(, ),
"ok" : ,
"errmsg" : "not master and slaveOk=false",
"code" : ,
"codeName" : "NotMasterNoSlaveOk",
"$clusterTime" : {
"clusterTime" : Timestamp(, ),
"signature" : {
"hash" : BinData(,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong()
}
}
}

五、创建用户

六、故障模拟

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

mongo --host 10.10.18.11

rs0:PRIMARY> db.users.find()
{ "_id" : ObjectId("5cff79e8993e70290a081d04"), "name" : "sue", "age" : , "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: file
path: "/data/mongodb/log/mongod.log"
logAppend: true
storage:
dbPath: "/data/mongodb/data"
journal:
enabled: true
wiredTiger:
engineConfig:
cacheSizeGB:
processManagement:
fork: true
pidFilePath: "/data/mongodb/pid/mongod.pid"
net:
bindIp: 10.10.18.10
port:
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:,host:'10.10.18.10:27017',priority:}]}
> rs.initiate(cfg)

创建结果:

 {
"ok" : ,
"operationTime" : Timestamp(, ),
"$clusterTime" : {
"clusterTime" : Timestamp(, ),
"signature" : {
"hash" : BinData(,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong()
}
}
}

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

rs0:SECONDARY> show dbs
admin .000GB
config .000GB
local .000GB

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

4、恢复数据

mongorestore --host 10.10.18.10 --port  --gzip /data/mongobak/-- 

结果

 --13T10::33.817+    preparing collections to restore from
--13T10::33.829+ reading metadata for admin.test from /data/mongobak/--/admin/test.metadata.json.gz
--13T10::33.832+ reading metadata for test.users from /data/mongobak/--/test/users.metadata.json.gz
--13T10::33.834+ reading metadata for reporting.reporting from /data/mongobak/--/reporting/reporting.metadata.json.gz
--13T10::33.841+ reading metadata for admin.reporting from /data/mongobak/--/admin/reporting.metadata.json.gz
--13T10::33.861+ restoring test.users from /data/mongobak/--/test/users.bson.gz
--13T10::34.085+ restoring admin.test from /data/mongobak/--/admin/test.bson.gz
--13T10::34.123+ no indexes to restore
--13T10::34.123+ finished restoring test.users ( document)
--13T10::34.123+ restoring admin.reporting from /data/mongobak/--/admin/reporting.bson.gz
--13T10::34.175+ restoring reporting.reporting from /data/mongobak/--/reporting/reporting.bson.gz
--13T10::34.230+ no indexes to restore
--13T10::34.230+ finished restoring admin.test ( documents)
--13T10::34.233+ no indexes to restore
--13T10::34.233+ finished restoring reporting.reporting ( document)
--13T10::34.234+ no indexes to restore
--13T10::34.234+ finished restoring admin.reporting ( document)
--13T10::34.234+ restoring users from /data/mongobak/--/admin/system.users.bson.gz
--13T10::34.312+ done

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

 rs0:PRIMARY> show dbs
admin .000GB
config .000GB
local .000GB
reporting .000GB
test .000GB
rs0:PRIMARY> use test
switched to db test
rs0:PRIMARY> show collections
users
rs0:PRIMARY> db.users.find()
{ "_id" : ObjectId("5cff79e8993e70290a081d04"), "name" : "sue", "age" : , "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" : ,
"protocolVersion" : NumberLong(),
"writeConcernMajorityJournalDefault" : true,
"members" : [
{
"_id" : ,
"host" : "10.10.18.10:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : ,
"tags" : { },
"slaveDelay" : NumberLong(),
"votes" :
}
],
"settings" : {
"chainingAllowed" : true,
"heartbeatIntervalMillis" : ,
"heartbeatTimeoutSecs" : ,
"electionTimeoutMillis" : ,
"catchUpTimeoutMillis" : -,
"catchUpTakeoverDelayMillis" : ,
"getLastErrorModes" : { },
"getLastErrorDefaults" : {
"w" : ,
"wtimeout" :
},
"replicaSetId" : ObjectId("5d01bad15dfd3f294d147b36")
}
}

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

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

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

再次查看状态:

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

加入成功。

开启认证访问

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

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

然后依次关闭:Arbiter Secondary Primary

依次开启:Primary Secondary Arbiter 

 

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

MongoDB的集群模式--Replica Set的更多相关文章

  1. mongodb之集群模式

    前言 数据量大了或者并发量上来了,单机肯定是抗不住的,这个时候要开始考虑使用集群了.mongodb目前为止支持三种集群模式:主从集群,副本集集群,分片集群. 主从集群 特性 1. 一主多从2. 主负责 ...

  2. MongoDB的集群模式--Sharding(分片)

    分片是数据跨多台机器存储,MongoDB使用分片来支持具有非常大的数据集和高吞吐量操作的部署. 具有大型数据集或高吞吐量应用程序的数据库系统可能会挑战单个服务器的容量.例如,高查询率会耗尽服务器的CP ...

  3. CentOS7+Docker+MangoDB下部署简单的MongoDB分片集群

    简单的在Docker上快速部署MongoDB分片集群 前言 文中使用的环境如下 OS:CentOS Linux release 7.5.1804 (Core) Docker:Docker versio ...

  4. 2020重新出发,NOSQL,MongoDB分布式集群架构

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

  5. elasticsearch与mongodb分布式集群环境下数据同步

    1.ElasticSearch是什么 ElasticSearch 是一个基于Lucene构建的开源.分布式,RESTful搜索引擎.它的服务是为具有数据库和Web前端的应用程序提供附加的组件(即可搜索 ...

  6. zookeeer 集群和伪集群模式

    环境变量设置: # .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi # U ...

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

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

  8. NoSQL数据库Mongodb副本集架构(Replica Set)高可用部署

    NoSQL数据库Mongodb副本集架构(Replica Set)高可用部署 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. MongoDB 是一个基于分布式文件存储的数据库.由 C ...

  9. Redis集群模式部署

    以下以Linux(CentOS)系统为例 1.1 下载和编译 $ wget http://download.redis.io/releases/redis-4.0.7.tar.gz $ tar xzf ...

随机推荐

  1. [PHP] Laravel使用redis保存SESSION

    Laravel使用redis保存SESSION 首先确认服务器已经安装redis服务,php安装了redis扩展. 1.打开config/database.php.在redis配置项中增加sessio ...

  2. [RN] React Native 使用 react-native-camera 过程中报错 Found react-native-camera 'mlkit' but wasn't required.`

    详细报错如下: Could not resolve all task dependencies for configuration ':app:debugRuntimeClasspath'. Coul ...

  3. PATB1031查验身份证

    这一题遇见的错误有很多,学会了一些知识点 使用了strcpy函数,前是需要复制的数组,后面是被复制的数组 关于字符,如果是非数字可以使用 <='9' && >='0'来判断 ...

  4. ML学习笔记(1)

    2019/03/09 16:16 归一化方法: 简单放缩(线性归一化):这种归一化方法比较适用在数值比较集中的情况.这种方法有个缺陷,如果max和min不稳定,很容易使得归一化结果不稳定,使得后续使用 ...

  5. nginx学习,看这一篇就够了:下载、安装。使用:正向代理、反向代理、负载均衡。常用命令和配置文件

    前言一.nginx简介1. 什么是 nginx 和可以做什么事情Nginx 是高性能的 HTTP 和反向代理的web服务器,处理高并发能力是十分强大的,能经受高负 载的考验,有报告表明能支持高达 50 ...

  6. 图解 Java 垃圾回收机制,写得非常好!

    阅读本文大概需要 3.7 分钟. 翻译:Rhys_Lee, AzureSora, 溪边九节, 小小菜鸟鸡 blog.csdn.net/zl1zl2zl3/article/details/9090408 ...

  7. Spring Boot进阶系列三

    Thymeleaf是官方推荐的显示引擎,这篇文章主要介绍怎么让spring boot整合Thymeleaf.  它是一个适用于Web和独立环境的现代服务器端Java模板引擎. Thymeleaf的主要 ...

  8. libevent笔记1:安装及DEMO

    本篇简单记录了libevent的安装过程及基础的先进先出管道Demo,其中demo来自这篇博客,安装过程在这篇博客 实验环境 系统:Ubuntu 18.04.3 libevent版本:libevent ...

  9. MongoDB查询和sql查询的总结

    查询所有表或集合 sql   show tables mongodb    db.getCollectionNames() 删除集合或表 sql   drop table 表名 mongodb    ...

  10. vue学习笔记01

    使用vscode配置vue项目 因为之前我没有接触过vue.js,以前的网页也是用Thymeleaf或者jsp写的,这次要求用vscode写vue,感觉现在前端招聘需求量最大的也是这个技术,刚好自己也 ...