这篇文章介绍了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
进主节点,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高效读写海量数据的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程学习网。
本文标题为:MongoDB高效读写海量数据的方法
基础教程推荐
- Sql Server Management Studio连接Mysql的实现步骤 2023-07-29
- python中pandas库的iloc函数用法解析 2023-07-28
- Mysql查询所有表和字段信息的方法 2023-07-26
- SQLServer 清理日志的实现 2023-07-29
- 如何将excel表格数据导入postgresql数据库 2023-07-20
- 关于MySQL中explain工具的使用 2023-07-27
- 【Redis】数据持久化 2023-09-12
- Python常见库matplotlib学习笔记之多个子图绘图 2023-07-27
- Redis如何实现延迟队列 2023-07-13
- Mysql主从三种复制模式(异步复制,半同步复制,组复 2022-09-01