千家信息网

MongoDB如何高效读写海量数据

发表于:2024-11-25 作者:千家信息网编辑
千家信息网最后更新 2024年11月25日,本文小编为大家详细介绍"MongoDB如何高效读写海量数据",内容详细,步骤清晰,细节处理妥当,希望这篇"MongoDB如何高效读写海量数据"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来
千家信息网最后更新 2024年11月25日MongoDB如何高效读写海量数据

本文小编为大家详细介绍"MongoDB如何高效读写海量数据",内容详细,步骤清晰,细节处理妥当,希望这篇"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 -ddocker psdocker exec -it masterid /bin/bashmongo> show databases;> use test;> db.userinfo.insert({"name":"master"});> db.userinfo.find({});exitdocker exec -it slaveid /bin/bashmongo> 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 -ddocker ps docker exec -it rs1id /bin/bashmongo> 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({});exitdocker exec -it rs2id /bin/bashmongomyset:SECONDARY> rs.status();myset:SECONDARY> rs.slaveOk();myset:SECONDARY> show databases;myset:SECONDARY> use test;myset:SECONDARY> db.userinfo.find({});exitdocker exec -it rs3id /bin/bashmongomyset:SECONDARY> rs.slaveOk();myset:SECONDARY> show databases;myset:SECONDARY> use test;myset:SECONDARY> db.userinfo.find({});

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

docker stop rs1iddocker exec -it rs2id /bin/bashdocker stop rs2iddocker exec -it rs3id /bin/bashdocker-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 -ddocker ps docker exec -it masterid /bin/bashmongo> 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({});exitdocker exec -it slaveid /bin/bashnewset:SECONDARY> res.slaveOk();newset:SECONDARY> use test;newset:SECONDARY> db.userinfo.find({});exitdocker exec -it arbiterid /bin/bashnewset:ARBITER> res.slaveOk();newset:ARBITER> show databases;newset:ARBITER> db.userinfo.find({});

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

读到这里,这篇"MongoDB如何高效读写海量数据"文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注行业资讯频道。

0