日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

MongoDB高效讀寫海量數據的方法_MongoDB

作者:Run2948 ? 更新時間: 2022-04-21 編程語言

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?進主節點,rs2rs3?進從節點。

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節點 (只是仲裁,并不存儲數據)

原文鏈接:https://www.cnblogs.com/Run2948/p/MongoDB_Massive_Data_Efficient_ReadWrite.html

欄目分類
最近更新