mongodb高可用复制集集群实战详解 一点课堂(多岸学院)

mongodb复制集

  1. 数据库

    • 关系型:MySQL、Oracle、SQL Server、DB2等
    • 非关系型:MongoDB、Redis、HBase等
  2. NoSql简介

    • NoSQL=Not Only SQL
    • 其适用于性能较高,不使用SQL意味着没有结构化的存储要求(SQL为结构化的查询语句),没有约束之后架构更加灵活.
    • NoSQL不使用SQL作为查询语言
    • 数据存储可以不需要固定的表格模式(非结构化和不可预知的数据)
    • 有水平可扩展性的特征
    • 最终一致性(CAP定理)
  3. NoSQL的优势

    • 高可扩展性、分布式计算、没有复杂的关系、低成本、架构灵活、半结构化数据
  4. MongoDB是什么?

    • MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
    • MongoDB是一个面向文档的免费数据库,多用于数据采集和分散处理(map/reduce),特别是在大数据处理方面比较擅长。
    • 全世界数据库排名:https://db-engines.com/en/ranking
  5. MongoDB特点

    • 灵活动态文档模型

    • 高可用

      自动复制和故障切换

      多数据中心支持滚动维护无需关机支持最多50个成员

    • 水平扩展

      这种方式是目前构架上的主流形式,指的是通过增加服务器数量来对系统扩容。在这样的构架下,单台服务器的配置并不会很高,可能是配置比较低、很廉价的 PC,每台机器承载着系统的一个子集,所有机器服务器组成的集群会比单体服务器提供更强大、高效的系统容载量。

  6. 复制集介绍

    MongoDB复制集是从传统主从结构(Master/Slave)演变而来,是由一组拥有相同数据集的mongod实例所组成的集群。

    读写分离的主从结构:
    读写分离的基本原理就是让主数据库处理事务性增、改、删(写)操作,而从数据库处理查询(读)操作。以SQL为例,主库负责写数据、读数据。读库仅负责读数据。每次有写库操作,同步更新到读库。写库就一个,读库可以有多个,采用日志同步的方式实现主库和多个读库的数据同步。

    一个复制集包含多个数据节点和一个选举节点。数据节点中仅有一个为主节点(Primary),其它的为从节点(Secondary)。对于主节点,所有的请求都是在它上面完成的,从节点接收主节点传来的操作并以此来保证与主节点上的数据完全一致。需注意只有主节点能接收写操作,从节点是绝对无法写入的。复制集是通过复制而实现数据的冗余而提高数据的可靠性。

    img

      从上图可以看出,所有的读写请求都是由客户端应用程序通过驱动来指向MongoDB数据库,写请求都是指向当前数据库的主节点,写请求执行完毕后,会记录在主节点的oplog中(记录写操作而不记录读操作),从节点通过主节点的oplog来进行复制操作。在默认情况下,读请求也是指向主节点的。因为MongoDB复制集是异步复制形式,会由于磁盘的刷盘效率和网络的原因导致从节点的数据相对于主节点有一点延迟,驱动在没有配置的情况下会指向主库,也就是当前最新的数据。当然如果对数据的时效性要求不高时可以配置读操作指向某一个从节点,实现读写分离。

  7. 复制集的基本架构

    • 一个包含3个mongod的复制集架构如下所示

    img

    • 如果主服务器失效,会变成:

    img

    • 如果加上可选的仲裁者:

    img

    • 如果主服务器失效:

    img

  8. MongoDB复制集角色类型

    1、标准节点: 参与primary选举,当自身宕机或停止服务会自动让出primary

    2、被动节点: 只能成为second 不参与选举,被设置为被动节点则不能参与选举

    3、仲裁节点:负责投票选举,不存放数据,确保标准节点投票数不会相同

  9. 环境信息

    系统:centos6.8
    mongo的版本:mongodb-linux-x86_64-rhel62-4.0.6.tgz
    机器环境:192.168.57.201、192.168.57.202、192.168.57.203
  10. 安装mongodb

    #上传mongodb软件到3台机器
    #解压缩
    tar xzvf mongodb-linux-x86_64-rhel62-4.0.6.tgz 
  11. 创建mongodb配置文件(mongo.conf)

    # 配置文件保存位置
    /opt/mongo/mongo.conf
    
    fork=true
    dbpath=/opt/mongo/data/db
    port=27017
    bind_ip=0.0.0.0
    logpath=/opt/mongo/logs/mongodb.log
    logappend=true
    # 复制集的名字(自己定义)
    replSet=yidian_repl
    smallfiles=true
    
    # 3台机器分别创建配置文件和对应的数据、日志目录
  12. 启动mongo服务,配置复制集

    # 3台都启动
    ./mongod --config /opt/mongo/mongo.conf
    
    #查看是否启动成功
    netstat -ntlp
    
    #进入mongo客户端
    ./mongo
    
    # 配置复制集
    var rsconf = {
        _id:'yidian_repl', //这里的_id要与配置文件中指定的服务所属的复制集相同
        members:  //复制集成员
        [
            {
            _id:1, //成员的id
            host:'192.168.57.201:27017' //成员所属节点的ip以及该成员服务启动时所占的端口
            },
            {
            _id:2,
            host:'192.168.57.202:27017'
             },
             {
             _id:3,
             host:'192.168.57.203:27017'
              }
            ]
    }
    
    #初始化配置(加载rsconf配置文件)
    rs.initiate(rsconf);
    
    #状态查看
    rs.status(); 
  13. 测试

    # 添加数据
    db.movies.insert([ { "title" : "fzzlm", "year" : 1975, "imdb_rating" : 8.1 },
       { "title" : "jqdz", "year" : 1989, "imdb_rating" : 7.6 }] );
    
    # 查看数据
    db.movies.find().pretty();
    
    # 允许从节点查询
    rs.slaveOk();
    
    # ADD
    rs.add("ip:port");
    # remove
    rs.remove("ip:port");
    # config 查看配置信息
    rs.config();
    
    # 201主节点 kill,进行测试
    [root@test201 bin]# netstat -ntlp
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
    tcp        0      0 0.0.0.0:27017               0.0.0.0:*                   LISTEN      6159/./mongod       
    tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      2196/sshd           
    tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      1910/cupsd          
    tcp        0      0 127.0.0.1:6010              0.0.0.0:*                   LISTEN      4864/sshd           
    tcp        0      0 :::3306                     :::*                        LISTEN      2498/mysqld         
    tcp        0      0 :::22                       :::*                        LISTEN      2196/sshd           
    tcp        0      0 ::1:631                     :::*                        LISTEN      1910/cupsd          
    tcp        0      0 ::1:6010                    :::*                        LISTEN      4864/sshd           
    [root@test201 bin]# kill -9 6159
    

    视频教程:www.yidiankt.com
    QQ群组讨论组:984370849
    一点课堂公众号
    关注公众号-免费获取【JAVA核心知识点】!!

在这里插入图片描述

猜你喜欢

转载自www.cnblogs.com/yidiankt/p/11458152.html