• MongoDB副本集群搭建和基础配置


    MongoDB副本集群

    1.MongoDB副本集介绍

    MongoDB的副本集就是主从复制,由于之前3.0版本之前就有主从复制的说法,后来更新迭代,起名叫副本集
    副本集建议最少3台机器,一个主及诶单,两个从节点,如果是偶数台机器,需要在部署一个仲裁节点,否则会这导致集群选举异常
    副本集(Replica Set)是一组MongoDB实例组成的集群,由一个主(Primary)服务器和多个备份(Secondary)服务器构成。通过复制(Replication),将数据的更新由Primary推送到其他实例上,在一定的延迟之后,每个MongoDB实例维护相同的数据集副本。通过维护冗余的数据库副本,能够实现数据的异地备份,读写分离和自动故障转移
    从节点登陆数据后,无法查看数据,需要执行rs.slaveOK()之后才可以查看集群信息

    1.1.副本集角色:

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

    2.副本集介绍

    请添加图片描述

    在这里插入图片描述

    请添加图片描述
    请添加图片描述

    请添加图片描述

    2.1.副本集目录规划

    以/opt/Mongo+端口号为单机多实例存放目录

    3.MOngoDB副本集

    3.1.创建多实例目录

    [root@localhost mongo_clusetr]# mkdir -p /opt/mongo_clusetr/mongodb_2801{7,8,9}/{conf,logs,pid}
    
    • 1

    3.2.创建配置文件

    vim /opt/mongo_clusetr/mongodb_28017/conf/mongodb.yml
    systemLog:
      destination: file
      logAppend: true
      path: /opt/mongo_clusetr/mongodb_28017/logs/mongodb.log
    
    storage:
      journal:
        enabled: true
      dbPath: /data/mongo_clusetr/mongodb_28017/data
      directoryPerDB: true
      wiredTiger:
        engineConfig:
            cacheSizeGB: 1
            directoryForIndexes: true
        collectionConfig:
            blockCompressor: zlib
        indexConfig:	
            prefixCompression: true
    
    processManagement:
      fork: true
      pidFilePath: /opt/mongo_clusetr/mongodb_28017/pid/mongod.pid
    
    net:
      port: 27017 
      bindIp: 127.0.0.1,192.168.40.4
    reclication:
      oplogSizeMB: 1024
      replSetName: dba1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    2.3.创建其他两个配置文件

    [root@localhost mongo_clusetr]# cp mongodb_28017/conf/mongodb.yml mongodb_28018/conf/
    [root@localhost mongo_clusetr]# cp mongodb_28017/conf/mongodb.yml mongodb_28019/conf/
    
    修改端口号
    [root@localhost mongo_clusetr]# sed -i 's#28017#28108#g' /opt/mongo_clusetr/mongodb_28018/conf/mongodb.yml 
    [root@localhost mongo_clusetr]# sed -i 's#28017#28109#g' /opt/mongo_clusetr/mongodb_28019/conf/mongodb.yml 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3.3.创建数据目录

    [root@localhost mongo_clusetr]# mkdir /data/mongo_clusetr/mongodb_2801{7,8,9}
    
    • 1

    3.4.启动所有节点

    启动第一个节点
    [root@localhost mongo_clusetr]# mongodb/bin/mongod -f mongodb_28017/conf/mongodb.yml 
    启动第二个节点
    [root@localhost mongo_clusetr]# mongodb/bin/mongod -f mongodb_28018/conf/mongodb.yml
    启动第三个节点
    [root@localhost mongo_clusetr]# mongodb/bin/mongod -f mongodb_28019/conf/mongodb.yml
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3.5.查看启动情况

    [root@localhost mongo_clusetr]# netstat -anpt |grep 2801
    tcp        0      0 192.168.40.4:28017      0.0.0.0:*               LISTEN      12177/mongodb/bin/m 
    tcp        0      0 127.0.0.1:28017         0.0.0.0:*               LISTEN      12177/mongodb/bin/m 
    tcp        0      0 192.168.40.4:28018      0.0.0.0:*               LISTEN      12639/mongodb/bin/m 
    tcp        0      0 127.0.0.1:28018         0.0.0.0:*               LISTEN      12639/mongodb/bin/m 
    tcp        0      0 192.168.40.4:28019      0.0.0.0:*               LISTEN      13021/mongodb/bin/m 
    tcp        0      0 127.0.0.1:28019         0.0.0.0:*               LISTEN      13021/mongodb/bin/m
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    4.初始化集群集

    定义副本集群
    config = {
    _id : "dba1",
    members : [
    {_id : 0, host : "db:28017"},
    {_id : 1, host : "db:28018"},
    {_id : 2, host : "db:28019"},
    ] }
    
    使副本集群生效
    rs.initiate(config)
    
    查看副本集状态
    rs.status()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    4.1.生成副本集群

    请添加图片描述

    输入之后直接生效,直接变成主库

    请添加图片描述

    4.2.测试数据同步

    登录主库
    [root@localhost mongo_clusetr]# mongodb/bin/mongo db:28017
    查看当前所在库和表
    dba1:PRIMARY> db
    test
    dba1:PRIMARY> show tables
    
    在主库写入数据
    dba1:PRIMARY> db.te.insert({"name":"zhang","age":10})
    WriteResult({ "nInserted" : 1 })
    
    在主库查看数据
    dba1:PRIMARY> db.te.find()
    { "_id" : ObjectId("636f63745a73f86992679cef"), "name" : "zhang", "age" : 10 }
    { "_id" : ObjectId("636f63be5a73f86992679cf0"), "name" : "gao", "age" : 11 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    4.3.从库插入数据报错

    可以看到主库是可以正常插入数据的,但是从库不能读不能写入数据

    副本集默认是只能复制但是不能读写的

    dba1:SECONDARY> show tables
    2022-11-12T17:18:03.351+0800 E QUERY    [thread1] Error: listCollections failed: {
    	"operationTime" : Timestamp(1668244677, 1),
    	"ok" : 0,
    	"errmsg" : "not master and slaveOk=false",
    	"code" : 13435,
    	"codeName" : "NotMasterNoSlaveOk",
    	"$clusterTime" : {
    		"clusterTime" : Timestamp(1668244677, 1),
    		"signature" : {
    			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
    			"keyId" : NumberLong(0)
    		}
    	}
    } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    4.4.从库插入无法数据临时解决方法

    这个是MongoDB库的一种保护机制,下面我们来解决这个问题。

    但是每次登陆都需要只用这个命令。

    解决方法
    rs.slaveOK();
    
    执行命令
    dba1:SECONDARY> rs.slaveOk();
    WARNING: slaveOk() is deprecated and may be removed in the next major release. Please use secondaryOk() instead.
    
    然后我们就可以正常的查看数据了
    dba1:SECONDARY> db.te.find()
    { "_id" : ObjectId("636f63745a73f86992679cef"), "name" : "zhang", "age" : 10 }
    { "_id" : ObjectId("636f63be5a73f86992679cf0"), "name" : "gao", "age" : 11 }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    4.5.登陆的永久解决方法

    如果不想每次登陆都使用这个命令

    下面为大家提供方法

    我的用户时root可以在数据库用户下找到.mongorc.js的隐藏文件
    [root@localhost ~]# ls -la | grep .mongorc.js
    -rw-------.  1 root root         0 Jul 25 16:57 .mongorc.js
    
    • 1
    • 2
    • 3

    在文件中写入内容

    [root@localhost ~]# vim.mongorc.js
    [root@localhost ~]# cat .mongorc.js 
    rs.slaveOK();
    
    • 1
    • 2
    • 3

    我们再次登陆数据库

    可以看到不用再次输入命令可以直接查看
    [root@localhost mongo_clusetr]# mongodb/bin/mongo db:28018
    dba1:SECONDARY> show dbs
    admin   0.000GB
    config  0.000GB
    local   0.000GB
    test    0.000GB
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    cat .mongorc.js
    rs.slaveOK();

    
    我们再次登陆数据库
    
    可以看到不用再次输入命令可以直接查看
    [root@localhost mongo_clusetr]# mongodb/bin/mongo db:28018
    dba1:SECONDARY> show dbs
    admin   0.000GB
    config  0.000GB
    local   0.000GB
    test    0.000GB
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
  • 相关阅读:
    网络靶场实战-物联网安全qiling框架初探
    安装gensim,fasttsxt,以及如何安装后缀whl文件,tar.gz文件
    代码随想录笔记_动态规划_377组合总和IV
    测试自学人必看:软件测试如何找测试项目?
    Java(六)——常用类System
    神马自然排名如何提高?
    SAP初始界面无法输入事务代码的解决 -- 显示OK代码字段
    11 【Teleport CSS功能】
    PDF文档翻译软件哪个好?分享5款快速翻译的工具
    Flutter笔记:手写并发布一个人机滑动验证码插件
  • 原文地址:https://blog.csdn.net/qq_46020071/article/details/127823185