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

2023-12-04 0 383

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进主节点,rs2、rs3进从节点。

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) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悠久资源 MongoDB MongoDB高效读写海量数据的方法 https://www.u-9.cn/database/mongodb/69670.html

常见问题

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务