MongoDB可复制集架构介绍以及安装

架构概述

在这里插入图片描述
MongoDB部署架构分为单机、可复制集、分片集群,单机适合学习使用;分片集群比较复杂、运维难度高,在数据量达到一定瓶颈的时候才考虑使用,要慎重选择;可复制集是非常适合用于生产环境的一种架构

本文讲解的是可复制集架构的原理和搭建

可复制集原理

可复制集是跨多个MongDB服务器(节点)分布和维护数据的方法。

mongoDB可以把数据从一个节点复制到其他节点并在修改时进行同步,集群中的节点配置为自动同步数据

旧方法叫做主从复制,mongoDB 3.0以后推荐使用可复制集

可复制集优点:

  • 避免数据丢失,保障数据安全,提高系统安全性(最少3节点,最大50节点)
  • 自动化灾备机制,主节点宕机后通过选举产生新主机,提高系统健壮性(7个选举节点上限)
  • 读写分离,负载均衡,提高系统性能
  • 生产环境推荐的部署模式

架构图:
在这里插入图片描述

  • oplog(操作日志):保存操作记录、时间戳,该日志极其重要!!!
  • 数据同步:从节点与主节点保持长轮询
    • 首先从节点查询本机oplog最新时间戳
    • 然后从节点查询主节点oplog晚于此时间戳的所有文档
    • 最后从节点加载这些文档,并根据log执行写操作
  • 阻塞复制:与writeconcern相关
    • 情况一:不需要同步到从节点的策略(如: acknowledged、Unacknowledged 、w1),数据同步都是异步的
    • 情况二:其他writeconcern情况都是同步的,因为都需要等待从节点确认完毕后才结束整个写流程
  • 心跳机制:成员之间会每2s 进行一次心跳检测(ping操作),发现故障后进行选举和故障转移
  • 选举制度:主节点故障后,其余节点根据优先级和bully算法选举出新的主节点,在选出主节点之前,集群服务是只读的,不对外提供写服务

备注:oplog是盖子集合,大小是可以调整的,64为系统中默认是所在硬盘可用空间的5%,具体说明参考:官方文档说明

可复制集环境搭建

  1. 环境准备

    这里只在一台机器上搭建三个节点,生产上一定要用3台

    IP:192.168.31.41

    MongoDB版本:mongodb-linux-x86_64-rhel70-3.4.20.tgz

  2. 安装好3个MongoDB节点,安装教程参考我的另一篇博客:MongoDB在CentOS7下的yum方式和压缩包方式安装

    master 192.168.31.41 27030

    slave1 192.168.31.41 27031

    slave2 192.168.31.41 27032

  3. 3个MongoDB的配置文件mongodb.conf加入如下相同的配置

    replication:
      replSetName: configRS #集群名称
      oplogSizeMB: 500 #oplog集合大小,单位MB,一定不能设置太小,根据具体机器磁盘进行设置

    这里列出master节点的配置文件全部内容,和slave1、slave2配置文件的不同之处在于端口和相关路径的配置,其他都一致:

    storage:
       dbPath: "/usr/local/mongodb/replica/master/data"
       journal:
          enabled: true
       directoryPerDB: true
       engine: wiredTiger
       wiredTiger:
            engineConfig:
                cacheSizeGB: 1
                journalCompressor: snappy
                directoryForIndexes: false 
            collectionConfig:
                blockCompressor: snappy
            indexConfig:
                prefixCompression: true
    systemLog:
       destination: file
       path: "/usr/local/mongodb/replica/master/log/mongodb.logs"
    net:
       port: 27030
       http:
          RESTInterfaceEnabled: true
    processManagement:
       fork: false
    replication:
       replSetName: configRS
       oplogSizeMB: 500
  4. 创建启动脚本

    cd /usr/local/mongodb/replica
    
    mkdir logs
    
    vim start-replica-mongo.sh
    
    #输入如下内容
    nohup ./master/bin/mongod -f ./master/bin/mongodb.conf > ./logs/master.log 2>&1 &
    nohup ./slave1/bin/mongod -f ./slave1/bin/mongodb.conf > ./logs/slave1.log 2>&1 &
    nohup ./slave2/bin/mongod -f ./slave2/bin/mongodb.conf > ./logs/slave2.log 2>&1 &
    
    #保存后授权执行权限
    chmod u+x start-replica-mongo.sh
  5. 启动

    ./start-replica-mongo.sh
  6. 在master节点上运行初始化命令

    cd /usr/local/mongodb/replica/master/bin
    
    mongo 127.0.0.1:27030
    
    # _id表示集群名称,members表示master主机
    rs.initiate({
    	_id: "configRS",
    	version: 1,
    	members: [{ _id: 0, host : "192.168.31.41:27030" }]});
    
    # 有多少个slave就执行多少次add 
    rs.add("192.168.31.41:27031");
    rs.add("192.168.31.41:27032");
  7. 从节点上执行rs.slaveOk()【注意:这里有个小坑】

    目前只能在主节点上查询出数据,但如果想在副节点上查询到数据需运行rs.slaveOk()

    注意:每次使用命令行的方式登录从机的时候都要在从机执行rs.slaveOk()命令,否则是无法查询的!!!

    cd /usr/local/mongodb/replica/master/bin
    mongo 127.0.0.1:27031
    rs.slaveOk();
    exit
    
    mongo 127.0.0.1:27032
    rs.slaveOk();
    exit
  8. 主节点负责写入,从节点负责同步数据和负载均衡查询,现在测试一下吧,从主节点新增数据

    cd /usr/local/mongodb/replica/master/bin
    mongo 127.0.0.1:27030
    use dalomao
    db.users.insertOne({"username":"张三"})

    然后登陆slave1和slave2查看是否有数据

  9. 可以在每个节点运行rs.status()或isMaster()命令查看复制集状态,如:

    mongo 127.0.0.1:27031
    rs.isMaster()

    在这里插入图片描述

  10. 停止命令如下

    cd /usr/local/mongodb/replica
    
    vim stop-replica-mongo.sh
    
    #输入如下内容
    nohup ./master/bin/mongod --shutdown -f ./master/bin/mongodb.conf > ./logs/master.log 2>&1 &
    nohup ./slave1/bin/mongod --shutdown -f ./slave1/bin/mongodb.conf > ./logs/slave1.log 2>&1 &
    nohup ./slave2/bin/mongod --shutdown -f ./slave2/bin/mongodb.conf > ./logs/slave2.log 2>&1 &
    
    #保存后授权执行权限
    chmod u+x stop-replica-mongo.sh