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

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

MongoDB的集群模式--Replica Set

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

接下来就以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: 2
processManagement:
   fork: true
   pidFilePath: "/data/mongodb/pid/m.pid"
net:
   bindIp: 10.10.18.10
   port: 27017
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: 2
processManagement:
   fork: true
   pidFilePath: "/data/mongodb/pid/m.pid"
net:
   bindIp: 10.10.18.11
   port: 27017
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: 2
processManagement:
   fork: true
   pidFilePath: "/data/mongodb/pid/m.pid"
net:
   bindIp: 10.10.18.12
   port: 27017
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: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: file
   path: "/data/mongodb/log/mongod.log"
   logAppend: true
storage:
   dbPath: "/data/mongodb/data"
   journal:
      enabled: true
   wiredTiger:
      engineConfig:
        cacheSizeGB: 2
processManagement:
   fork: true
   pidFilePath: "/data/mongodb/pid/mongod.pid"
net:
   bindIp: 10.10.18.10
   port: 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

相关文章:

  • 2022-12-23
  • 2021-11-14
  • 2021-07-09
  • 2022-12-23
  • 2021-05-23
  • 2021-12-20
  • 2021-07-21
  • 2022-12-23
猜你喜欢
  • 2021-12-05
  • 2022-12-23
  • 2021-11-21
  • 2021-11-13
  • 2021-07-25
  • 2022-12-23
  • 2021-06-13
相关资源
相似解决方案