• MongoDB复制(副本集)总结


    基础篇(能解决工作中80%的问题):

    1. MongoDB的概述、应用场景、下载方式、连接方式和发展历史等

    2. MongoDB数据类型、重要概念以及shell常用指令

    3. MongoDB文档的各种增加、更新、删除操作总结

    4. MongoDB各种查询操作总结

    5. MongoDB对列的各种操作总结

    6. MongoDB中的索引操作总结

    进阶篇:

    1. MongoDB聚合操作总结

    2. MongoDB的导入导出、备份恢复总结

    3. MongoDB的用户管理总结

    4. MongoDB复制(副本集)总结

    5. MongoDB 分片总结

    6. MongoDB 遇见 spark(进行整合)

    7. MongoDB内部的存储原理

    其它:

    1. python3操作MongoDB的各种案例

    2. MongoDB命令汇总

    一. MongoDB 复制(副本集)

    MongoDB副本集(Replica Set)是有自动故障恢复功能的主从集群,有一个主节点和一个或多个从节点组成。副本集没有固定的主节点,当主节点发生故障时,整个集群会选举一个主节点为系统提供服务以保证系统的高可用。

    MongoDB复制是将数据同步在多个服务器的过程。

    复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性。

    复制还允许您从硬件故障和服务中断中恢复数据。

    官网参考:MongoDB副本集

    二. 为什么要复制?

    保障数据的安全性
    数据高可用性 (24* 7 )
    灾难恢复
    无需停机维护(如备份,重建索引,压缩)
    读缩放(额外的副本读取)
    副本集对应用程序是透明

    三. MongoDB复制原理

    mongodb的复制至少需要两个节点。其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据。

    mongodb各个节点常见的搭配方式为:一主一从、一主多从

    主节点记录在其上的所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致。

    MongoDB复制结构图如下所示:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UAcjfDeV-1657022462558)(evernotecid://B1CD39FE-B044-413D-A086-0649DB3F0070/appyinxiangcom/26430792/ENResource/p1224)]
    以上结构图中,客户端从主节点读取数据,在客户端写入数据到主节点时, 主节点与从节点进行数据交互保障数据的一致性。

    副本集特征:

    • N 个节点的集群
    • 任何节点可作为主节点
    • 所有写入操作都在主节点上
    • 自动故障转移
    • 自动恢复

    四. 设置一个副本集

    使用同一个MongoDB来做MongoDB主从的实验, 操作步骤如下:

    1、关闭正在运行的MongoDB服务器。

    2、通过指定 --replSet 选项来启动mongoDB。基本语法格式如下:

    mongod --port "PORT" --dbpath "YOUR_DB_DATA_PATH" --replSet "REPLICA_SET_INSTANCE_NAME"
    
    • 1

    五. 案例

    4.1 用适当的选项启动副本集的每个成员

    sudo rm -rf /MongoDB/node1 /MongoDB/node2 /MongoDB/node3
    
    sudo mkdir -p /MongoDB/node1 /MongoDB/node2 /MongoDB/node3
    
    sudo mongod —bind_ip 192.168.17.129 —port 27020 —dbpath "/MongoDB/node1" —replSet rs0
    
    sudo mongod —bind_ip 192.168.17.129 —port 27021 —dbpath "/MongoDB/node2" —replSet rs0
    
    sudo mongod —bind_ip 192.168.17.129 —port 27022 —dbpath "/MongoDB/node3" —replSet rs0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    还可以通过配置文件中指定副本集名称。启动mongod使用配置文件,与配置选项指定的文件

    4.2 mongo shell连接副本集

    mongo -port 27020 --host 192.168.17.129
    
    • 1

    4.3 初始化initiate副本集

    利用 rs.initiate() 会在副本集的一个成员上初始化一个默认的复制集配置。

    4.4 验证初始副本集配置

    使用 rs.conf() 显示副本集配置对象:

    rs0:OTHER> rs.conf()
    {
        "_id" : "rs0",
        "version" : 1,
        "protocolVersion" : NumberLong(1),
        "members" : [
            {
                "_id" : 0,
                "host" : "192.168.17.129:27020",
                "arbiterOnly" : false,
                "buildIndexes" : true,
                "hidden" : false,
                "priority" : 1,
                "tags" : {
                },
                "slaveDelay" : NumberLong(0),
                "votes" : 1
            }
        ],
        "settings" : {
            "chainingAllowed" : true,
            "heartbeatIntervalMillis" : 2000,
            "heartbeatTimeoutSecs" : 10,
            "electionTimeoutMillis" : 10000,
            "getLastErrorModes" : {
            },
            "getLastErrorDefaults" : {
                "w" : 1,
                "wtimeout" : 0
            },
            "replicaSetId" : ObjectId("579b3500299da8059cc5fb99")
        }
    }
    rs0:PRIMARY>
    
    • 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
    • 31
    • 32
    • 33
    • 34

    4.5 检查副本集的状态 rs.status()

    rs0:PRIMARY> rs.status()
    {
        "set" : "rs0",
        "date" : ISODate("2021-07-29T11:13:58.433Z"),
        "myState" : 1,
        "term" : NumberLong(1),
        "heartbeatIntervalMillis" : NumberLong(2000),
        "members" : [
            {
                "_id" : 0,
                "name" : "192.168.17.129:27020",
                "health" : 1,
                "state" : 1,
                "stateStr" : "PRIMARY",
                "uptime" : 1200,
                "optime" : {
                    "ts" : Timestamp(1469789441, 1),
                    "t" : NumberLong(1)
                },
                "optimeDate" : ISODate("2021-07-29T11:50:41Z"),
                "electionTime" : Timestamp(1469789440, 2),
                "electionDate" : ISODate("2021-07-29T11:50:40Z"),
                "configVersion" : 1,
                "self" : true
            }
        ],
        "ok" : 1
    }
    rs0:PRIMARY>
    
    • 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

    4.6 将剩下的成员添加到副本集

    必须连接到副本集primary主节点, 才能使用 rs.add() 添加剩余的成员。

    rs.add()在某些情况下,触发一个选举。如果连接到主节点primary成为从节点secondary,需要连接Mongo shell到主节点primary继续增加新的副本集成员
    利用rs.status()识别副本集主节点primary

    4.7 删除副本

    rs.remove("192.168.17.129:27021")
    
    • 1

    以上实例会启动一个名为rs0的MongoDB实例,其端口号为27017。

    启动后打开命令提示框并连接上mongoDB服务。

    在Mongo客户端使用命令rs.initiate()来启动一个新的副本集。

    我们可以使用rs.conf()来查看副本集的配置, 查看副本集状态使用 rs.status() 命令

  • 相关阅读:
    Python常见的开发工具合集对比
    java-php-python-ssm抑抑心理交流平台计算机毕业设计
    基于沙猫群优化的BP神经网络(分类应用) - 附代码
    数学建模 | 灰色预测原理及python实现
    MAA接枝聚苯乙烯(PSt-g-PMAA)共聚微球/聚醋酸乙烯酯接枝聚苯乙烯复合微球应用
    Vue.js 循环语句
    Qt应用软件【协议篇】GPIO控制LED灯
    Go中的channel
    【数据结构 | 链表】leetcode 2. 两数相加
    【数据结构】手撕排序算法(中)交换排序 (冒泡排序、快速排序的递归方式(挖坑法、前后指针法、左右指针法))、归并排序的递归方式
  • 原文地址:https://blog.csdn.net/cui_yonghua/article/details/125626931