博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MongoDB可复制集架构介绍以及安装
阅读量:4163 次
发布时间:2019-05-26

本文共 3413 字,大约阅读时间需要 11 分钟。

文章目录

架构概述

在这里插入图片描述

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节点,安装教程参考我的另一篇博客:

    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: truesystemLog:   destination: file   path: "/usr/local/mongodb/replica/master/log/mongodb.logs"net:   port: 27030   http:      RESTInterfaceEnabled: trueprocessManagement:   fork: falsereplication:   replSetName: configRS   oplogSizeMB: 500
  4. 创建启动脚本

    cd /usr/local/mongodb/replicamkdir logsvim 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/binmongo 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/binmongo 127.0.0.1:27031rs.slaveOk();exitmongo 127.0.0.1:27032rs.slaveOk();exit
  8. 主节点负责写入,从节点负责同步数据和负载均衡查询,现在测试一下吧,从主节点新增数据

    cd /usr/local/mongodb/replica/master/binmongo 127.0.0.1:27030use dalomaodb.users.insertOne({
    "username":"张三"})

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

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

    mongo 127.0.0.1:27031rs.isMaster()

    在这里插入图片描述

  10. 停止命令如下

    cd /usr/local/mongodb/replicavim 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

转载地址:http://ykpxi.baihongyu.com/

你可能感兴趣的文章
HTTPS那些事 用java实现HTTPS工作原理
查看>>
oracle函数trunc的使用
查看>>
MySQL 存储过程或者函数中传参数实现where id in(1,2,3,...)IN条件拼接
查看>>
java反编译
查看>>
Class.forName( )你搞懂了吗?——转
查看>>
jarFile
查看>>
EJB与JAVA BEAN_J2EE的异步消息机制
查看>>
数学等于号是=那三个横杠是什么符
查看>>
HTTP协议详解
查看>>
java多线程中的join方法详解
查看>>
ECLIPSE远程调试出现如下问题 ECLIPSE中调试代码提示找不到源
查看>>
java abstract修饰符
查看>>
数组分为两部分,使得其和相差最小
查看>>
有趣的排序——百度2017春招
查看>>
二叉树的最近公共祖先LCA
查看>>
数组中累加和为定值K的最长子数组长度
查看>>
素数对--腾讯2017校招编程
查看>>
JAVA集合--ArrayList实现原理
查看>>
synchronized与Lock
查看>>
数据库索引
查看>>