一、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. LOJ6115 汇合 树上分块

    本题空间很小,那些O(nlogn)的树上lca算法在这里不顶用了,可以考虑树分块. 本题的树分块是基于深度的,即按深度每\(\sqrt n\)分一块,然后一块一块往上跳,一直跳到lca处. 对于这题, ...

  2. 你好,我叫Flask

    首先,要看你学没学过Django 如果学过Django 的同学,请从头看到尾,如果没有学过Django的同学,并且不想学习Django的同学,轻饶过第一部分 一. Python 现阶段三大主流Web框 ...

  3. 使用docker部署nginx+tomcat架构(3):使用docker-compose简化部署操作

    经历了之前的两篇,我们已经大体上了解了docker部署容器的过程. 使用docker部署nginx+tomcat架构 使用docker部署nginx+tomcat架构():访问mysql数据库 不过, ...

  4. jquery根据选择器进行页面赋值,封装赋值方法

    可以进行文本框赋值,文本域赋值,下拉列表赋值,单选框赋值,多选框赋值, 传入对象,可以根据元素name进行比对赋值,不用每个进行单独赋值 <!DOCTYPE html> <html ...

  5. Java基础之十六 数组

    数组:可以创建并组装它们,通过使用整型索引值访问它们的元素,并且它们的尺寸不能改变. 16.1 数组为什么特殊 数组与其他种类的容器之间的区别有三方面:效率,类型和保存基本类型的能力. 数组是一种效率 ...

  6. IE浏览器卡死提示是否停止运行此脚本的解决办法

    IE浏览器经常卡死,报是否停止运行此脚本,严重影响使用体验,下面小编教大家怎么解决这个问题,供大家参考! 1.启动IE浏览器,点击上方菜单栏位的工具,如下图所示 2.在工具栏位选择internet选项 ...

  7. 【神经网络与深度学习】生成式对抗网络GAN研究进展(五)——Deep Convolutional Generative Adversarial Nerworks,DCGAN

    [前言]      本文首先介绍生成式模型,然后着重梳理生成式模型(Generative Models)中生成对抗网络(Generative Adversarial Network)的研究与发展.作者 ...

  8. 记录ssis的两个异常解决办法

    1.Foreach文件枚举提示变量为空的解决办法:把foreach属性窗口中的DelayValidation设置为True就可以了 2.csv导入数据库提示:无法在 unicode 和非 unicod ...

  9. Effective.Java第23-33条(泛型相关)

    23.  类结构层次优于标签类 有时你会碰到一个类,它的实例有一个或多个风格,并且包含一个tag属性表示实例的风格.例如,如下面的类表示一个圆或者矩形: public class Figure { / ...

  10. LuoguP3069 【[USACO13JAN]牛的阵容Cow Lineup

    题目链接 看了看其他大佬的文章,为什么要控制右端呢 其实就是一个很简单的模拟队列趴... 难点就在于根据题意我们可以分析得一段合法区间内,不同种类个数不能超过k+2 哦当然,由于种类数范围过大,要对种 ...