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高效讀寫海量數據的文章就介紹到這瞭。希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。
推薦閱讀:
- Docker Compose的安裝和使用步驟
- docker compose快速開始超詳細教程
- 詳解Docker在哪裡保存日志文件
- 解決使用Docker Compose管理容器的問題
- 親手教你Docker Compose安裝DOClever的詳細過程