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

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

MongoDB高效讀寫(xiě)海量數(shù)據(jù)的方法_MongoDB

作者:Run2948 ? 更新時(shí)間: 2022-04-21 編程語(yǔ)言

MongoDB?簡(jiǎn)介

高性能,易部署,易使用

常見(jiàn)應(yīng)用場(chǎng)景

  • 分布式的日志收集: elk 單節(jié)點(diǎn)最多 32g , mongodb 越多越好
  • 傳感器(電子產(chǎn)品) --- 數(shù)據(jù)庫(kù) --- MongoDB
  • 地理地圖
  • 網(wǎng)絡(luò)爬蟲(chóng)

大數(shù)據(jù)時(shí)代的3V

  • 海量 Volume
  • 多樣 Variety
  • 實(shí)時(shí) Velocity

大數(shù)據(jù)庫(kù)時(shí)代的3高

  • 高并發(fā)
  • 高可擴(kuò)
  • 高性能

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

注意:?默認(rèn)從庫(kù)是不能讀取,需要設(shè)置?SlaveOk?的狀態(tài):

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

缺點(diǎn):?當(dāng)主庫(kù)掛了,需要手動(dòng)切換到從庫(kù)

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

設(shè)置:?安排?rs1?進(jìn)主節(jié)點(diǎn),rs2rs3?進(jìn)從節(jié)點(diǎn)。

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({});

測(cè)試:?強(qiáng)行停止主庫(kù)?rs1,檢查從庫(kù)是否能分配并切換到主庫(kù) ,在繼續(xù)強(qiáng)行停止分配后的主庫(kù)?rs2

docker stop rs1id

docker exec -it rs2id /bin/bash

docker stop rs2id

docker exec -it rs3id /bin/bash

docker-compose rm

結(jié)論:

當(dāng)主節(jié)點(diǎn)?rs1?掛了,會(huì)有從節(jié)點(diǎn)過(guò)來(lái)替代原有主庫(kù)的位置,但是當(dāng)僅剩最后一個(gè)從庫(kù)時(shí),無(wú)法切換為主庫(kù)。

當(dāng)主節(jié)點(diǎn)?rs1?重新啟動(dòng)恢復(fù)后,只會(huì)立馬變?yōu)閺膸?kù),不再是主庫(kù)。除非等到現(xiàn)在的主庫(kù)掛了,才有可能重新回到主庫(kù)的位置。

問(wèn)題:?當(dāng)主節(jié)點(diǎn)?rs1?掛了,會(huì)有從節(jié)點(diǎn)過(guò)來(lái)替代原有主庫(kù)的位置,但是具體是哪一個(gè)從庫(kù)沒(méi)有辦法控制。所以我們需要添加一個(gè)沖裁?來(lái)解決這個(gè)問(wèn)題。

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({});

注意:?當(dāng)存在?arbiter節(jié)點(diǎn) (只是仲裁,并不存儲(chǔ)數(shù)據(jù))

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

欄目分類(lèi)
最近更新