本文小编为大家详细介绍“MongoDB如何高效读写海量数据”,内容详细,步骤清晰,细节处理妥当,希望这篇“MongoDB如何高效读写海量数据”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

MongoDB简介

高性能,易部署,易使用

常见应用场景

分布式的日志收集: elk 单节点最多 32g , mongodb 越多越好

传感器(电子产品) --- 数据库 --- MongoDB

地理地图

网络爬虫

大数据时代的3V

海量 Volume

多样 Variety

实时 Velocity

大数据库时代的3高

高并发

高可扩

高性能

MongoDB集群1. 一主一从

docker-compose.yml

version:'2'services:master:image:mongo:3.4volumes:-/data/mongodbml/master:/data/dbcommand:mongod--dbpath/data/db--masterslaver:image:mongo:3.4volumes:-/data/mongodbml/slaver:/data/dbcommand:mongod--dbpath/data/db--slave--sourcemaster:27017links:-master

注意:默认从库是不能读取,需要设置SlaveOk的状态:

docker-composeup-ddockerpsdockerexec-itmasterid/bin/bashmongo>showdatabases;>usetest;>db.userinfo.insert({"name":"master"});>db.userinfo.find({});exitdockerexec-itslaveid/bin/bashmongo>showdatabases;>db.getMongo().setSlaveOk();>usetest;>db.userinfo.find({});docker-composerm

缺点:当主库挂了,需要手动切换到从库

2. 一主二从

docker-compose.yml

version:'2'services:rs1:image:mongo:3.4volumes:-/data/mongodbtest/replset/rs1:/data/dbcommand:mongod--dbpath/data/db--replsetmysetrs2:image:mongo:3.4volumes:-/data/mongodbtest/replset/rs2:/data/dbcommand:mongod--dbpath/data/db--replsetmysetrs3:image:mongo:3.4volumes:-/data/mongodbtest/replset/rs3:/data/dbcommand:mongod--dbpath/data/db--replsetmyset

设置:安排rs1进主节点,rs2rs3进从节点。

docker-composeup-ddockerpsdockerexec-itrs1id/bin/bashmongo>rs.initiate()myset:SECONDARY>rs.add('rs2:27017');myset:PRIMARY>rs.add('rs3:27017');myset:PRIMARY>rs.conf()myset:PRIMARY>showdatabases;myset:PRIMARY>usetest;myset:PRIMARY>db.userinfo.insert({"name":"rs1"});myset:PRIMARY>db.userinfo.find({});exitdockerexec-itrs2id/bin/bashmongomyset:SECONDARY>rs.status();myset:SECONDARY>rs.slaveOk();myset:SECONDARY>showdatabases;myset:SECONDARY>usetest;myset:SECONDARY>db.userinfo.find({});exitdockerexec-itrs3id/bin/bashmongomyset:SECONDARY>rs.slaveOk();myset:SECONDARY>showdatabases;myset:SECONDARY>usetest;myset:SECONDARY>db.userinfo.find({});

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

dockerstoprs1iddockerexec-itrs2id/bin/bashdockerstoprs2iddockerexec-itrs3id/bin/bashdocker-composerm

结论:

当主节点rs1挂了,会有从节点过来替代原有主库的位置,但是当仅剩最后一个从库时,无法切换为主库。

当主节点rs1重新启动恢复后,只会立马变为从库,不再是主库。除非等到现在的主库挂了,才有可能重新回到主库的位置。

问题:当主节点rs1挂了,会有从节点过来替代原有主库的位置,但是具体是哪一个从库没有办法控制。所以我们需要添加一个冲裁来解决这个问题。

3. 一主一从一仲裁

docker-compose.yml

version:'2'services:master:image:mongo:3.4volumes:-/data/mongodbnode/replset/rs1:/data/dbcommand:mongod--dbpath/data/db--replsetnewset--oplogSize128slave:image:mongo:3.4volumes:-/data/mongodbnode/replset/rs2:/data/dbcommand:mongod--dbpath/data/db--replsetnewset--oplogSize128arbiter:image:mongo:3.4command:mongod--dbpath/data/db--replsetnewset--smallfiles--oplogSize128

配置:

docker-composeup-ddockerpsdockerexec-itmasterid/bin/bashmongo>rs.initiate()newset:SECONDARY>rs.add('slave:27017');newset:PRIMARY>rs.add('arbiter:27017',true);newset:PRIMARY>re.conf()newset:PRIMARY>showdatabases;newset:PRIMARY>usetest;newset:PRIMARY>db.userinfo.insert({"name":"master"});newset:PRIMARY>db.userinfo.find({});exitdockerexec-itslaveid/bin/bashnewset:SECONDARY>res.slaveOk();newset:SECONDARY>usetest;newset:SECONDARY>db.userinfo.find({});exitdockerexec-itarbiterid/bin/bashnewset:ARBITER>res.slaveOk();newset:ARBITER>showdatabases;newset:ARBITER>db.userinfo.find({});

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

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