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高效读写海量数据的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 关于对MongoDB索引的一些简单理解

    目录 索引简介 1.语法准备 2.数据准备: 3.索引 3.1 唯一索引 3.2 单键索引 3.3 多键索引 3.4 复合索引 3.5 交叉索引 3.6 部分索引 3.7覆盖索引 3.8 全文索引 4.索引限制 4.1 查询限制 4.2 范围限制 总结 索引简介 索引可以提升文档的查询速度,但建立索引的过程需要使用计算与存储资源,在已经建立索引的前提下,插入新的文档会引起索引顺序的重排. MongoDB 的索引是基于 B-tree 数据结构及对应算法形成的.树索引存储特定字段或字段集的值,按字段

  • MongoDB数据库的安装步骤

    目录 Mac OS安装 Mac OS 安装有两种方式,手动安装或使用 homebrew. homebrew 安装 在终端运行如下命令: $ brew install mongodb 手动安装 从 MongoDB 官网下载最新稳定版MongoDB 社区版.需要注意下载合适的版本,尤其是检查操作系统是32位还是64位.下载下来的文件是tgz 格式的. 在下载下来的文件夹对文件进行解压,命令如下: $ tar xvf mongodb-osx-xyz.tgz 上面的具体文件名根据实际下载的文件来确定.解

  • mongodb三分钟入门大全

    目录 一.MongoDB是什么 1.维基百科 2.简而言之 二.MongoDB 的应用场景 1.MongoDB事务 2.多引擎支持各种强大的索引需求 3.具体的应用场景 4.以下是几个实际的应用案例: 5.选择MongoDB的场景总结: 三.MongoDB对比MySQL 1.关键字对比 四.SpringBoot整合MongoDB实现增删改查 1.引入pom 2.启动类Application 3.实体类 4.UserRepository 5.业务层service 6.测试类 7.插入 8.更新 9

  • 常用的MongoDB查询语句的示例代码

    背景 最近做了几个规则逻辑.用到mongo查询比较多,就是查询交易信息跑既定规则筛选出交易商户,使用聚合管道进行统计和取出简单处理后的数据,用SQL代替业务代码逻辑的判断. 方法 MongoDB聚合使用aggregate,聚合管道采取自动向下子执行方式,基本语法格式: db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION) 聚合框架中常用的操作: $project:修改输入文档的结构.可以用来重命名.增加或删除域,也可以用于创建计算结果以及嵌套文档.

  • mongodb数据库迁移变更的解决方案

    目录 前言 使用 安装 简单使用 后续 前言 在版本迭代过程中,存在数据库变更的几率,如增加某张表某个字段,删除某个字段等:​ 缺乏变更历史的记录,要么在升级多套不同版本环境时,需要耗费大量时间去寻找数据库变更记录以及执行脚本: ​ 该方案提供一种数据库变更记录方式: ​ 使用到开源库:migrate, 目前已经支持多种不同类型数据库(可视化目前使用的为mongodb,已经支持): 使用 ​ migrate提供两种方式进行变更操作:1. 命令行方式  2. SDK方式(使用Go) ​ 在本方案中

  • MongoDB数据库安装部署及警告优化

    目录 1.软件下载 2.部署MongoDB 2.1.规划部署目录 2.2.下载软件包 2.3.安装MongoDB 2.4.MongoDB配置文件介绍 2.5.编写MongoDB配置文件 2.6.启动MongoDB 2.7.如何关闭MongoDB 2.8.登录MongoDB 3.优化MongoDB警告信息 3.1.优化启动用户警告 3.2.优化大内存页警告 3.2.1.永久关闭大内存页 3.2.2.临时关闭大内存页 3.3.优化limit警告 1.软件下载 3.6.13版本:https://fas

  • MongoDB中优雅删除大量数据的三种方式

    目录 为什么要"瘦身"呢? MongoDB中删除数据的三种方式 三种方式的执行效率对比 1. remove 2. deleteMany 3. bulkWrite 通过 Write Concern 规避主从延迟 删除过程中遇到的Bug 总结 删除大量数据,无论是在哪种数据库中,都是一个普遍性的需求.除了正常的业务需求,我们需要通过这种方式来为数据库"瘦身". 为什么要"瘦身"呢? 1.表的数据量到达一定量级后,数据量越大,表的查询性能会越差. 毕竟

  • 详解MongoDB的条件查询和排序

    目录 find 方法 条件组合 比较操作符 IN 查询 限制返回结果条数和跳过数据 排序 总结 find 方法 查询的基本格式是db.collection.find({条件}),其中条件是可选的,类似于 MySQL 的 WHERE 条件一样.示例如下: // 查找全部文档 db.collection.find({}); // 查找指定条件的文档 db.collection.find({key: value}); // 查找昵称为岛上码农的用户 db.users.find({nickname: '

  • mongodb清除连接和日志的正确方法分享

    目录 前言 关闭current的方法一: 关闭current的方法二: 日志 去重script 导出数据 总结 前言 最近在做并发,服务器卡死了. 感觉是pymongo未能完全close掉和mongodb创建的tcp连接,并且在mongo连接未自动释放前进行高频连接,导致连接数爆满造成的. 所以对建立的连接进行清除,以此记录并做分享. 查看MongoDB的连接信息 db.serverStatus().connections current 当前连接数 available 可用连接数 connec

  • mongodb启动方法小结

    目录 1.mongodb的几种启动方法 2.关闭mongodb 2.0前台运行: 2.1后台运行: 1.mongodb的几种启动方法 启动Mongodb服务有两种方式,前台启动或者Daemon方式启动,前者启动会需要保持当前Session不能被关闭,后者可以作为系统的fork进程执行,下文中的path是mongodb部署的实际地址. 1. 最简单的启动方式,前台启动,仅指定数据目录,并且使用默认的27107端口,cli下可以直接使用./mongo连上本机的mongodb,一般只用于临时的开发测试

  • MongoDB 常用的crud操作语句

    目录 创建数据(CREATE) 更新数据(Update) 删除(DELETE) 读取数据(READ) 对于后端大神(小白)来说,每天的工作就是 CRUD,再加上 Control + C 和 Control + V.作为大神(小白),怎么能不懂 CRUD 呢?MongoDB 的 CRUD 相比繁琐的 SQL 语句而言十分简便,显得更为现代化. 创建数据(CREATE) MongoDB 提供了两种方式创建数据: db.crud.insert({name: '码农', gender: '男'}); d

  • MongoDB日志切割的三种方式总结

    目录 前言 方法如下 1. 通过 MongoDB 管理命令进行切割 2. 通过 Linux 系统自带的服务 logrotate 进行切割 3. 通过向进程发送 SIGUSR1 信号来切割日志 总结 前言 线上运行的服务会产生大量的运行及访问日志,日志里会包含一些错误.警告及用户行为等信息.通常服务会以文本的形式记录日志信息,这样可读性强,方便于日常定位问题.但当产生大量的日志之后,要想从大量日志里挖掘出有价值的内容,则需要对数据进行进一步的存储和分析. 任何一种数据库都有各种各样的日志,Mong

  • MongoDB数据库授权认证的实现

    目录 1.与用户相关的命令 2.配置mongodb登陆授权认证 2.1.创建一个用户 2.2.修改配置文件启用用户认证 2.3.重启mongodb 2.4.使用口令登陆mongodb 3.授权用户并赋予多个权限 3.1.创建用户并制造数据 3.2.使用mytest登录test库验证权限 3.3.使用mytest登录test2库验证权限 1.与用户相关的命令 db.auth() 将用户验证到数据库. db.changeUserPassword() 更改现有用户的密码. db.createUser(

  • MongoDB如何更新多级文档的数据

    目录 嵌套数组更新 更新下级文档的属性 属性增加和移除 总结 嵌套数组更新 以下面的数据(数据集名称为author)为例: {name: '岛上码农', documents: ['Flutter入门与实战', '高性能MySQL', 'MongoDB专业指北']} 我们需要将 MongoDB专业指北改成MongoDB不专业指北,就属于修改嵌套的文档数据了.这个时候需要使用到 MongoDB 提供的定位操作符$.定位操作符即表示将对应条件匹配到的数据,如: db.author.update( {n

随机推荐