服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - MongoDB - MongoDB高效读写海量数据的方法

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

2022-09-29 18:09Run2948 MongoDB

这篇文章介绍了MongoDB高效读写海量数据的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

MongoDB 简介

高性能,易部署,易使用

常见应用场景

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

大数据时代的3V

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

大数据库时代的3高

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

MongoDB 集群

1. 一主一从

  • docker-compose.yml
?
1
2
3
4
5
6
7
8
9
10
11
12
13
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 的状态:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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 进从节点。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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

?
1
2
3
4
5
6
7
8
9
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
?
1
2
3
4
5
6
7
8
9
10
11
12
13
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

配置:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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高效读写海量数据的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://www.cnblogs.com/Run2948/p/MongoDB_Massive_Data_Efficient_ReadWrite.html

延伸 · 阅读

精彩推荐
  • MongoDBMongoDB管理数据库的方法介绍

    MongoDB管理数据库的方法介绍

    这篇文章介绍了MongoDB管理数据库的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...

    社会主义接班人3442022-07-07
  • MongoDBMongoDB社区版和企业版的差别对照表

    MongoDB社区版和企业版的差别对照表

    这篇文章主要介绍了MongoDB社区版和企业版的差别对照表,本文同时提供了中文和英文版的对照表,需要的朋友可以参考下 ...

    轻雨漫步26992020-04-29
  • MongoDBMongoDB系列教程(五):mongo语法和mysql语法对比学习

    MongoDB系列教程(五):mongo语法和mysql语法对比学习

    这篇文章主要介绍了MongoDB系列教程(五):mongo语法和mysql语法对比学习,本文对熟悉Mysql数据库的同学来说帮助很大,用对比的方式可以快速学习到MongoDB的命...

    MongoDB教程网3102020-05-01
  • MongoDBMongoDB中优雅删除大量数据的三种方式

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

    最近接到一个任务,线上的mongodb积累了大量的无用数据,导致宕机,现在对里面的数据进行批量删除,所以这篇文章主要给大家介绍了关于MongoDB中优雅删除大量...

    iVictor10602021-11-17
  • MongoDBMongoDB Shell 命令实例总结【进阶篇】

    MongoDB Shell 命令实例总结【进阶篇】

    这篇文章主要介绍了MongoDB Shell 命令,结合实例形式总结分析了MongoDB数据库常用的查询、更新、插入、集合、函数等相关操作技巧与注意事项,需要的朋友可...

    trouble-i-am-in4452020-05-21
  • MongoDBMongoDB凭什么跻身数据库排行前五

    MongoDB凭什么跻身数据库排行前五

    MongoDB以比去年同期超出65.96分的成绩继续雄踞榜单前五,这个增幅在全榜仅次于PostgreSQL的77.99,而其相对于4月份的6.10分的增长也是仅次于微软SQL Server排名...

    孙浩峰3412020-05-22
  • MongoDBMongoDB如何查询耗时记录的方法详解

    MongoDB如何查询耗时记录的方法详解

    查询操作是我们日常操作数据库经常会遇到的一个功能,下面这篇文章主要给大家介绍了关于MongoDB如何查询耗时记录的相关资料,文中通过示例代码介绍的...

    Chain8292020-05-15
  • MongoDBmongodb 集群重构和释放磁盘空间实例详解

    mongodb 集群重构和释放磁盘空间实例详解

    这篇文章主要介绍了mongodb 集群重构和释放磁盘空间实例详解的相关资料,具有一定的参考价值,需要的朋友可以参考下 ...

    MongoDB教程网5252020-05-08