MongoDB高效读写海量数据的方法

 更新时间:2022年02月17日 11:59:47   作者:Run2948  
这篇文章介绍了MongoDB高效读写海量数据的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

MongoDB 简介

高性能,易部署,易使用

常见应用场景

  • 分布式的日志收集: elk 单节点最多 32g , mongodb 越多越好
  • 传感器(电子产品) --- 数据库 --- MongoDB
  • 地理地图
  • 网络爬虫

大数据时代的3V

  • 海量 Volume
  • 多样 Variety
  • 实时 Velocity

大数据库时代的3高

  • 高并发
  • 高可扩
  • 高性能

MongoDB 集群

1. 一主一从

  • docker-compose.yml
version: '2'
services: 
  master: 
    image: mongo:3.4
    volumes:
      - /data/mongodbml/master:/data/db
    command: mongod --dbpath /data/db --master 
  slaver: image:mongo:3.4
    volumes:
      - /data/mongodbml/slaver:/data/db 
    command: mongod --dbpath /data/db --slave --source master:27017
    links:
      - master

注意: 默认从库是不能读取,需要设置 SlaveOk 的状态:

docker-compose up -d

docker ps

docker exec -it masterid /bin/bash

mongo
> show databases;
> use test;
> db.userinfo.insert({"name":"master"});
> db.userinfo.find({});
exit

docker exec -it slaveid /bin/bash

mongo
> show databases;
> db.getMongo().setSlaveOk();
> use test;
> db.userinfo.find({});


docker-compose rm

缺点: 当主库挂了,需要手动切换到从库

2. 一主二从

  • docker-compose.yml
version: '2'
services: 
  rs1: 
    image: mongo:3.4
    volumes:
      - /data/mongodbtest/replset/rs1:/data/db
    command: mongod --dbpath /data/db --replset myset 
  rs2: image:mongo:3.4
    volumes:
      - /data/mongodbtest/replset/rs2:/data/db
    command: mongod --dbpath /data/db --replset myset 
  rs3: image:mongo:3.4
    volumes:
      - /data/mongodbtest/replset/rs3:/data/db
    command: mongod --dbpath /data/db --replset myset

设置: 安排 rs1 进主节点,rs2rs3 进从节点。

docker-compose up -d

docker ps 

docker exec -it rs1id /bin/bash

mongo

> rs.initiate()

myset:SECONDARY> rs.add('rs2:27017'); 
myset:PRIMARY> rs.add('rs3:27017'); 
myset:PRIMARY> rs.conf()

myset:PRIMARY> show databases;
myset:PRIMARY> use test;
myset:PRIMARY> db.userinfo.insert({"name":"rs1"});
myset:PRIMARY> db.userinfo.find({});
exit

docker exec -it rs2id /bin/bash

mongo

myset:SECONDARY> rs.status();
myset:SECONDARY> rs.slaveOk();
myset:SECONDARY> show databases;
myset:SECONDARY> use test;
myset:SECONDARY> db.userinfo.find({});
exit

docker exec -it rs3id /bin/bash

mongo

myset:SECONDARY> rs.slaveOk();
myset:SECONDARY> show databases;
myset:SECONDARY> use test;
myset:SECONDARY> db.userinfo.find({});

测试: 强行停止主库 rs1,检查从库是否能分配并切换到主库 ,在继续强行停止分配后的主库 rs2

docker stop rs1id

docker exec -it rs2id /bin/bash

docker stop rs2id

docker exec -it rs3id /bin/bash

docker-compose rm

结论:

当主节点 rs1 挂了,会有从节点过来替代原有主库的位置,但是当仅剩最后一个从库时,无法切换为主库。

当主节点 rs1 重新启动恢复后,只会立马变为从库,不再是主库。除非等到现在的主库挂了,才有可能重新回到主库的位置。

问题: 当主节点 rs1 挂了,会有从节点过来替代原有主库的位置,但是具体是哪一个从库没有办法控制。所以我们需要添加一个冲裁 来解决这个问题。

3. 一主一从一仲裁

  • docker-compose.yml
version: '2'
services: 
  master: 
    image: mongo:3.4
    volumes:
      - /data/mongodbnode/replset/rs1:/data/db
    command: mongod --dbpath /data/db --replset newset --oplogSize 128
  slave: image:mongo:3.4
    volumes:
      - /data/mongodbnode/replset/rs2:/data/db
    command: mongod --dbpath /data/db --replset newset --oplogSize 128
  arbiter: image:mongo:3.4
    command: mongod --dbpath /data/db --replset newset  --smallfiles --oplogSize 128

配置:

docker-compose up -d

docker ps 

docker exec -it masterid /bin/bash

mongo

> rs.initiate()

newset:SECONDARY> rs.add('slave:27017'); 
newset:PRIMARY> rs.add('arbiter:27017', true);
newset:PRIMARY> re.conf()

newset:PRIMARY> show databases;
newset:PRIMARY> use test;
newset:PRIMARY> db.userinfo.insert({"name":"master"});
newset:PRIMARY> db.userinfo.find({});
exit

docker exec -it slaveid /bin/bash
newset:SECONDARY> res.slaveOk();
newset:SECONDARY> use test;
newset:SECONDARY> db.userinfo.find({});
exit


docker exec -it arbiterid /bin/bash
newset:ARBITER> res.slaveOk();
newset:ARBITER> show databases;
newset:ARBITER> db.userinfo.find({});

注意: 当存在 arbiter节点 (只是仲裁,并不存储数据)

到此这篇关于MongoDB高效读写海量数据的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Mongodb聚合函数count、distinct、group如何实现数据聚合操作

    Mongodb聚合函数count、distinct、group如何实现数据聚合操作

    Mongodb中自带的基本聚合函数有三种:count、distinct和group。下面我们分别来讲述一下这三个基本聚合函数及如何实现数据聚合操作,感兴趣的朋友一起学习吧
    2016-05-05
  • MongoDB中文档的更新操作示例详解

    MongoDB中文档的更新操作示例详解

    这篇文章主要给大家介绍了关于MongoDB中文档的更新操作的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2017-11-11
  • 通过3分钟快速掌握MongoDB中regex的几种用法

    通过3分钟快速掌握MongoDB中regex的几种用法

    $regex为模糊查询的字符串提供正则表达式功能,MongoDB使用Perl兼容正则表达式(即“文件”)8.41版与UTF-8支持。下面这篇文章主要给大家介绍了关于如何通过3分钟快速掌握MongoDB中regex的几种用法,需要的朋友可以参考下。
    2018-03-03
  • MongoDB中的常用语句总结大全

    MongoDB中的常用语句总结大全

    这篇文章主要给大家总结介绍了关于MongoDB中的一些常用语句,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • Mongodb索引的优化

    Mongodb索引的优化

    MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。接下来通过本文给大家介绍Mongodb索引的优化,本文介绍的非常详细,具有参考借鉴价值,感兴趣的朋友一起学习吧
    2016-02-02
  • mongoDB分页的两种方法(图例)

    mongoDB分页的两种方法(图例)

    mongoDB分页的两种方法,mongoDB的分页查询是通过limit(),skip(),sort()这三个函数组合进行分页查询的。
    2013-11-11
  • CentOS 6.4创建Mongodb副本集

    CentOS 6.4创建Mongodb副本集

    这篇文章主要为大家详细介绍了CentOS 6.4创建Mongodb副本集的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • 在CentOS 7上安装MongoDB数据库的方法步骤

    在CentOS 7上安装MongoDB数据库的方法步骤

    MongoDB作为一款高性能、开源的NoSQL数据库,因其灵活性和可扩展性,成为了众多开发者和企业的首选,这篇文章主要给大家介绍了关于在CentOS 7上安装MongoDB数据库的方法步骤,需要的朋友可以参考下
    2024-09-09
  • MongoDB中连接池、索引、事务

    MongoDB中连接池、索引、事务

    这篇文章主要介绍了MongoDB中连接池、索引、事务的相关资料,需要的朋友可以参考下
    2023-01-01
  • MongoDB实现备份压缩的方法教程

    MongoDB实现备份压缩的方法教程

    这篇文章主要给大家介绍了关于MongoDB实现备份压缩的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-09-09

最新评论