0


MongoDB副本集集群原理以及维护配置

文章目录

1.MongoDB副本集介绍

MongoDB的副本集就是主从复制,由于之前3.0版本之前就有主从复制的说法,后来更新迭代,起名叫副本集

副本集建议最少3台机器,一个主及诶单,两个从节点,如果是偶数台机器,需要在部署一个仲裁节点,否则会这导致集群选举异常

副本集(Replica Set)是一组MongoDB实例组成的集群,由一个主(Primary)服务器和多个备份(Secondary)服务器构成。通过复制(Replication),将数据的更新由Primary推送到其他实例上,在一定的延迟之后,每个MongoDB实例维护相同的数据集副本。通过维护冗余的数据库副本,能够实现数据的异地备份,读写分离和自动故障转移

从节点登陆数据后,无法查看数据,需要执行rs.slaveOK()之后才可以查看集群信息

副本集角色:

  • 主节点 - 负责读写
  • 副本节点 - 同步主节点 shell下连接默认不可读
  • 仲裁节点 - 不是必须的,不存储数据,也不参与竞选,只投票

副本集架构图:

集群只有2台,必须使用仲裁节点

img

2.部署副本集集群

2.1.环境准备

由于服务器有限,因此在一台机器上部署多个实例来实现副本集

要部署三个mongodb节点,ip都一致,只需要修改端口号
IP角色端口192.168.81.210Primary26017192.168.81.210Secondary28017192.168.81.210Secondary29017

2.2.规划目录

[mongo@mongodb-1 ~]$ mkdir /data/mongodb_cluster/mongodb_2{6,8,9}017/{conf,data,pid,logs}
[mongo@mongodb-1 ~]$ tree -d /data/mongodb_cluster/ -L 1
/data/mongodb_cluster/
├── mongodb -> mongodb-linux-x86_64-4.0.14/
├── mongodb_26017
├── mongodb_27017
├── mongodb_28017
├── mongodb_29017
└── mongodb-linux-x86_64-4.0.14
6 directories

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wPCe3k7P-1668046677870)(.\MongoDB-图片笔记存放\image-20210217100444722.png)]

2.3.创建节点配置文件

创建好一个配置文件后,复制到两个节点,并使用sed命令替换

1.创建26017节点配置文件
[mongo@mongodb-1 ~]$ vim /data/mongodb_cluster/mongodb_26017/conf/mongodb.yml
systemLog:destination: file
  logAppend:truepath: /data/mongodb_cluster/mongodb_26017/logs/mongodb.log

storage:journal:enabled:truedbPath: /data/mongodb_cluster/mongodb_26017/data
  directoryPerDB:truewiredTiger:engineConfig:cacheSizeGB:0.5directoryForIndexes:truecollectionConfig:blockCompressor: zlib
    indexConfig:prefixCompression:trueprocessManagement:fork:truepidFilePath: /data/mongodb_cluster/mongodb_26017/pid/mongod.pid

net:port:26017bindIp: 127.0.0.1,192.168.81.210

replication:oplogSizeMB:1024replSetName: mongo-rs

2.将配置文件复制到其他两个节点
[mongo@mongodb-1 ~]$ cp /data/mongodb_cluster/mongodb_26017/conf/mongodb.yml /data/mongodb_cluster/mongodb_28017/conf/
[mongo@mongodb-1 ~]$ cp /data/mongodb_cluster/mongodb_26017/conf/mongodb.yml /data/mongodb_cluster/mongodb_29017/conf/

3.替换端口号
[mongo@mongodb-1 ~]$ sed -ri 's#26017#28017#g' /data/mongodb_cluster/mongodb_28017/conf/mongodb.yml [mongo@mongodb-1 ~]$ sed -ri 's#26017#29017#g' /data/mongodb_cluster/mongodb_29017/conf/mongodb.yml

2.4.启动所有节点

[mongo@mongodb-1 ~]$ mongod -f /data/mongodb_cluster/mongodb_26017/conf/mongodb.yml 
[mongo@mongodb-1 ~]$ mongod -f /data/mongodb_cluster/mongodb_28017/conf/mongodb.yml
[mongo@mongodb-1 ~]$ mongod -f /data/mongodb_cluster/mongodb_29017/conf/mongodb.yml

2.5.初始化副本集

1.初始化
> config = {
            _id : "mongo-rs", 
            members : [
                        {_id : 0, host : "192.168.81.210:26017"},
                        {_id : 1, host : "192.168.81.210:28017"},
                        {_id : 2, host : "192.168.81.210:29017"},
            ]}

2.重载配置
> rs.initiate(config)

初始化成功后,敲几次回车,会看到集群每个节点的名称都会改变
在这里插入图片描述

2.6.查看集群状态

mongo-rs:PRIMARY> rs.status()

集群名称

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0YK4e5kt-1668046677872)(.\MongoDB-图片笔记存放\image-20210217131838018.png)]

集群节点信息

在这里插入图片描述

2.7.模拟插入数据验证集群可用性

1.在主库插入数据

mongo-rs:PRIMARY> db.user_info.insertOne({"name":"json","age":27,"ad":"北京市朝阳区"})
mongo-rs:PRIMARY> db.user_info.insertOne({"name":"bobo","age":27,"ad":"北京市朝阳区"})
mongo-rs:PRIMARY> db.user_info.insertOne({"name":"lei","age":28,"ad":"北京市朝阳区"})
mongo-rs:PRIMARY> db.user_info.insertOne({"name":"bug","age":28,"ad":"北京市朝阳区"})
mongo-rs:PRIMARY> db.user_info.insertOne({"name":"bobo","age":28,"ad":"北京市朝阳区","sex":"null"})

2.从库查看数据

1.直接查数据会报错
mongo-rs:SECONDARY> show dbs
2021-02-17T13:25:50.425+0800 E QUERY    [js] Error: listDatabases failed:{
    "operationTime" : Timestamp(1613539548, 1),
    "ok" : 0,
    "errmsg" : "not master and slaveOk=false",
    "code" : 13435,
    "codeName" : "NotMasterNoSlaveOk",
    "$clusterTime" : {
        "clusterTime" : Timestamp(1613539548, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
} :

2.执行rs.slaveOK命令
mongo-rs:SECONDARY> rs.slaveOk()

3.执行完即可查询
mongo-rs:SECONDARY> db.user_info.find()

在这里插入图片描述

2.8.永久解决从库每次查数据报错问题

rs.slaveOk命令只能在当前会话使用,一旦退出重新进入则需要重新执行

可以将rs.slaveOk命令写到管理用户的家目录下的mongodb.js文件即可永久生效
在这里插入图片描述

3.模拟MongoDB副本集故障转移

3.1.模拟故障转移

直接将主库关掉观察从库状态即可

mongo@mongodb-1 ~]$ mongod -f /data/mongodb_cluster/mongodb_26017/conf/mongodb.yml --shutdown
killing process with pid: 19938

主库下线后,从库中会选举一个立刻成为主库
在这里插入图片描述

3.2.主库恢复重新成为主库

当故障的主库修复后需要重新成为主库,这时就需要调整主库的优先级使其重新成为主库,或者让现有主库自动降级,使恢复的主库重新成为主库

恢复的主库重新成为主库有两种方式:1、线上主库自动降级;2、从库调整优先级成为主库

3.2.1.线上主库自动降级使恢复主库成为新的主库

线上主库自动降级,使恢复的主库成为主库

1.修复主库重新上线
[mongo@mongodb-1 ~]$ mongod -f /data/mongodb_cluster/mongodb_26017/conf/mongodb.yml 

2.现有主库降级
mongo-rs:PRIMARY> rs.stepDown()

在这里插入图片描述

3.2.2.从库调整优先级成为主库

调整优先级需要在主库执行

1.首先查出28017节点的id号,这里查到id为1
[mongo@mongodb-1 ~]$ mongo 192.168.81.210:26017 --eval "rs.status()" | grep -B 2 '28017'
        {
            "_id" : 1,
            "name" : "192.168.81.210:28017",
--
            "pingMs" : NumberLong(0),
            "lastHeartbeatMessage" : "",
            "syncingTo" : "192.168.81.210:28017",
            "syncSourceHost" : "192.168.81.210:28017",

在这里插入图片描述

2.将28017从库调整权重优先级为100
mongo-rs:PRIMARY> myconfig=rs.conf()        #将配置定义成变量

mongo-rs:PRIMARY> myconfig.members[1].priority=100        #要调整哪个节点的优先级,需要在[]中写哪个节点的id号
100

mongo-rs:PRIMARY> rs.reconfig(myconfig)                #重载配置
{
    "ok" : 1,
    "operationTime" : Timestamp(1613542537, 1),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1613542537, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}

rs.conf命令也会显示出每个节点的ID

在这里插入图片描述

当优先级调整成功后,被调整的从节点会成为主库

在这里插入图片描述

3.2.3.当主库上线后需要将优先级调成默认

当主库重新上线后,需要将优先级调成原来默认的值,否则下次选举将会失败

在主库上操作

mongo-rs:PRIMARY> myconfig=rs.conf()
mongo-rs:PRIMARY> myconfig.members[1].priority=1
1
mongo-rs:PRIMARY> rs.reconfig(myconfig)
{
    "ok" : 1,
    "operationTime" : Timestamp(1613543718, 1),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1613543718, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}

4.副本集集群扩容收缩

4.1.增加新节点

1.规划目录
[mongo@mongodb-1 ~]$ mkdir -p /data/mongodb_cluster/mongodb_25017/{conf,data,logs,pid}[mongo@mongodb-1 ~]$ tree -d /data/mongodb_cluster/ -L 2 
 
2.准备配置文件
[mongo@mongodb-1 ~]$ cp /data/mongodb_cluster/mongodb_26017/conf/mongodb.yml /data/mongodb_cluster/mongodb_25017/conf/
[mongo@mongodb-1 ~]$ sed -ri 's#26017#25017#g' /data/mongodb_cluster/mongodb_25017/conf/mongodb.yml 

3.启动25017节点
[mongo@mongodb-1 ~]$ mongod -f /data/mongodb_cluster/mongodb_25017/conf/mongodb.yml

在这里插入图片描述

4.2.扩容一个集群节点

扩容节点就是在集群增加一个节点

1.添加节点
[mongo@mongodb-1 ~]$ mongo 192.168.81.210:26017
mongo-rs:PRIMARY> rs.add("192.168.81.210:25017")
{
    "ok" : 1,
    "operationTime" : Timestamp(1613544168, 1),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1613544168, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}

2.查看是否添加成功
[mongo@mongodb-1 ~]$ mongo 192.168.81.210:26017 --eval "rs.status()" | grep -B2 '25017' -A12

在这里插入图片描述

4.3.删除一个集群节点

1.删除一个节点
[mongo@mongodb-1 ~]$ mongo 192.168.81.210:26017
mongo-rs:PRIMARY> rs.remove("192.168.81.210:25017")
{
    "ok" : 1,
    "operationTime" : Timestamp(1613544442, 1),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1613544442, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}

2.查看是否删除
[mongo@mongodb-1 ~]$ mongo 192.168.81.210:26017 --eval "rs.status()" | grep -B2 '25017' -A12

在这里插入图片描述

4.4.查看删除后的节点状态

当节点从集群中移除后默认处于other状态

[mongo@mongodb-1 ~]$ mongo 192.168.81.210:25017
mongo-rs:OTHER> exit
[mongo@mongodb-1 ~]$ mongod -f /data/mongodb_cluster/mongodb_25017/conf/mongodb.yml --shutdown

在这里插入图片描述

5.添加/删除仲裁节点

仲裁节点在作用的就是选举主库,当集群节点数为偶数时,一定要增加一个仲裁节点

5.1.部署节点

添加仲裁节点需要部署一个mongodb节点,这里直接用25017节点,将数据文件删除之后重启就是一个新的节点

1.删除25017节点数据文件
[mongo@mongodb-1 ~]$ mongod -f /data/mongodb_cluster/mongodb_25017/conf/mongodb.yml --shutdown
[mongo@mongodb-1 ~]$ rm -rf /data/mongodb_cluster/mongodb_25017/data/*

2.启动节点
[mongo@mongodb-1 ~]$ mongod -f /data/mongodb_cluster/mongodb_25017/conf/mongodb.yml 

5.2.新增仲裁节点

1.添加仲裁节点
[mongo@mongodb-1 ~]$ mongo 192.168.81.210:26017
mongo-rs:PRIMARY> rs.addArb("192.168.81.210:25017")
{
    "ok" : 1,
    "operationTime" : Timestamp(1613544974, 1),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1613544974, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}

2.查看仲裁节点是否添加成功
[mongo@mongodb-1 ~]$ mongo 192.168.81.210:26017 --eval "rs.status()" | grep -B2 '25017' -A12

3.登陆仲裁节点查看状态
[mongo@mongodb-1 ~]$ mongo 192.168.81.210:25017
mongo-rs:ARBITER> 

在这里插入图片描述

5.3.删除仲裁节点

仲裁节点和副本节点一样,当移除集群后处于other状态

[mongo@mongodb-1 ~]$ mongo 192.168.81.210:26017
mongo-rs:PRIMARY> rs.remove("192.168.81.210:25017")
{
    "ok" : 1,
    "operationTime" : Timestamp(1613545186, 1),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1613545186, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}

在这里插入图片描述

标签: mongodb 数据库 nosql

本文转载自: https://blog.csdn.net/weixin_44953658/article/details/127783794
版权归原作者 Jiangxl~ 所有, 如有侵权,请联系我们删除。

“MongoDB副本集集群原理以及维护配置”的评论:

还没有评论