MongoDB 海量資料高效讀寫
阿新 • • 發佈:2020-12-18
mysql -- 操作硬碟 -- i/o --- 高併發時 拒絕訪問 主從,主主結構 --- 高可用
redis --- 純記憶體資料庫 八大資料結構... 資料淘汰演算法 10w/Qps --- 資料統計彙總操作不便
mongodb --- 記憶體(熱資料庫 20%) --- 硬碟 (冷資料 80%)--- 彙總(提供聚合函式,過期時間 )
NoSql 排行第一 MongoDB, MySql/Redis 能做的,它都能做。MySql/Redis 不能做的,它也能做。
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
節點 (只是仲裁,並不儲存資料)