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 进主节点, rs2 、 rs3 进从节点。
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://HdhCmsTestcnblogs测试数据/Run2948/p/MongoDB_Massive_Data_Efficient_ReadWrite.html
查看更多关于MongoDB高效读写海量数据的方法的详细内容...