一篇文章上手MongoDB 4.X

本篇文章主要匯總MongoDB的一些核心知識點芙贫,以及在Python和PHP中的使用搂鲫,持續(xù)更新,力爭清晰全面磺平,便于作為手冊查詢魂仍。

一拐辽,概述

1. MongoDB是什么 WHAT

MongoDB 是一個由C++語言編寫的,基于分布式文件存儲的NoSQL數(shù)據(jù)庫擦酌。

它是非關(guān)系型數(shù)據(jù)庫中功能最豐富俱诸,最像關(guān)系數(shù)據(jù)庫的。

MongoDB 提出的是文檔赊舶、集合的概念睁搭,他將數(shù)據(jù)存儲為一個文檔,并使用BSON(類JSON對象)作為其數(shù)據(jù)模型結(jié)構(gòu)笼平,由鍵值key => value對組成园骆。

其結(jié)構(gòu)是面向?qū)ο蟮模皇嵌S表寓调。字段值可以包含其他文檔锌唾,數(shù)組及文檔數(shù)組。

2. 為什么要用MongoDB WHY

  • 文檔數(shù)據(jù)類型

    文檔是一組屬性名和屬性的集合夺英。相較于關(guān)系數(shù)據(jù)庫復(fù)雜的規(guī)范化晌涕,面向文檔的數(shù)據(jù)模型很容易以聚合的形式來表示數(shù)據(jù)。

    SQL類型的數(shù)據(jù)庫可以通過主鍵或者外鍵的約束痛悯,保證數(shù)據(jù)的完整性與唯一性余黎,而MongoDB的文檔沒有固定的Schema,可以讓數(shù)據(jù)的存儲數(shù)據(jù)結(jié)構(gòu)更靈活灸蟆。

  • 即時查詢能力

    MongoDB保留了關(guān)系型數(shù)據(jù)庫即時查詢的能力驯耻,保留了索引(底層是基于B tree),并對查詢進(jìn)行優(yōu)化炒考,無需預(yù)先定義系統(tǒng)接受的查詢類型可缚。

  • 復(fù)制能力

    MongoDB采用副本集(replica set)的拓?fù)浣Y(jié)構(gòu)提供復(fù)制功能,能將數(shù)據(jù)分布到多臺機器上實現(xiàn)冗余斋枢,在服務(wù)器或網(wǎng)絡(luò)故障時帘靡,可以提供自動故障轉(zhuǎn)移、擴展讀能力瓤帚。
      副本集由一個主節(jié)點(Primary node)和一個或多個從節(jié)點(secondary node)構(gòu)成描姚。當(dāng)主節(jié)點down掉后,集群會選擇一個從節(jié)點自動將它提升為主節(jié)點戈次,先前的主節(jié)點恢復(fù)后變成一個從節(jié)點轩勘。主節(jié)點既能夠讀也能夠?qū)懀鴱墓?jié)點是只讀的怯邪。

  • 速度與持久性

    通過開啟Journaling日志記錄绊寻,控制速度和持久化之間的平衡。

    MongoDB的驅(qū)動實現(xiàn)一個寫入語義 fire and forget ,即通過驅(qū)動調(diào)用寫入時澄步,可以立即得到返回得到成功的結(jié)果冰蘑,這樣讓寫入的速度更加快。其次提供了Journaling日志的概念村缸,實際上像mysql的bin-log日志祠肥,當(dāng)需要插入的時候會先往日志里面寫入記錄,再完成實際的數(shù)據(jù)操作梯皿,這樣如果出現(xiàn)停電仇箱,進(jìn)程突然中斷的情況,可以保障數(shù)據(jù)不會錯誤索烹,可以通過修復(fù)功能讀取Journaling日志進(jìn)行修復(fù)工碾。

  • 水平擴展能力

    MongoDB使用分片技術(shù)對數(shù)據(jù)進(jìn)行水平擴展,通過集群將數(shù)據(jù)分布到多臺機器百姓,而不是只提升單個節(jié)點的性能渊额。MongoDB能自動分片、自動轉(zhuǎn)移分片里面的數(shù)據(jù)塊垒拢,讓每一個服務(wù)器里面存儲的數(shù)據(jù)都是一樣大小旬迹,降低故障帶來的影響。

二求类,MongoDB shell HOW

1. 安裝

32bit的mongodb最大只能存放2G的數(shù)據(jù)奔垦,64bit就沒有限制

下載MongoDB

https://www.mongodb.com/download-center/community

下載最新版安裝包

 curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.2.1.tgz

解壓并指定目錄

 tar -zxvf mongodb-linux-x86_64-rhel70-4.2.1.tgz 
 mv mongodb-linux-x86_64-rhel70-4.2.1 /usr/local/mongodb

創(chuàng)建數(shù)據(jù)目錄

 cd /usr/local/mongodb/
 mkdir -p ./data/db
 mkdir ./logs

創(chuàng)建配置文件

  vim mongodb.conf
dbpath = /usr/local/mongodb/data/db #數(shù)據(jù)文件存放目錄
logpath = /usr/local/mongodb/logs/mongodb.log #日志文件存放目錄
port = 27017  # 端口
fork = true  # 以守護(hù)程序的方式啟用,即在后臺運行
auth=true # 測試階段可以關(guān)閉權(quán)限校驗
bind_ip=0.0.0.0

環(huán)境變量配置 /etc/profile, 添加這條語句:

export PATH=$PATH:/usr/local/mongodb/bin

啟用配置

source /etc/profile

啟動MongoDB

mongod -f /usr/local/mongodb/mongodb.conf
about to fork child process, waiting until server is ready for connections.
forked process: 4207
child process started successfully, parent exiting

查看服務(wù)狀態(tài)

ps aux |grep mongodb
root      4207  3.9  7.8 1547080 79192 ?       Sl   08:50   0:03 mongod -f /usr/local/mongodb/mongodb.conf
root      4246  0.0  0.0 112708   976 pts/1    R+   08:51   0:00 grep --color=auto mongodb

關(guān)閉連接

  mongod -f /usr/local/mongodb/mongodb.conf --shutdown  
2019-11-24T08:50:17.366-0500 I  CONTROL  [main] log file "/usr/local/mongodb/logs/mongodb.log" exists; moved to "/usr/local/mongodb/logs/mongodb.log.2019-11-24T13-50-17".
killing process with pid: 4049

自此MongoDB 4.2安裝成功

2. MongoDB基本操作

使用終端連接

mongo

這個shell就是mongodb的客戶端尸疆,同時也是一個js的編譯器

MongoDB shell version v4.2.1
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("e1ac6d21-6554-45fc-8f5e-0f27b05c8402") }
MongoDB server version: 4.2.1
Server has startup warnings: 
2019-11-24T08:50:44.275-0500 I  CONTROL  [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2019-11-24T08:50:44.275-0500 I  CONTROL  [initandlisten] 
2019-11-24T08:50:44.275-0500 I  CONTROL  [initandlisten] 
2019-11-24T08:50:44.275-0500 I  CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2019-11-24T08:50:44.275-0500 I  CONTROL  [initandlisten] **        We suggest setting it to 'never'
2019-11-24T08:50:44.275-0500 I  CONTROL  [initandlisten] 
2019-11-24T08:50:44.275-0500 I  CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2019-11-24T08:50:44.275-0500 I  CONTROL  [initandlisten] **        We suggest setting it to 'never'
2019-11-24T08:50:44.275-0500 I  CONTROL  [initandlisten] 
2019-11-24T08:50:44.275-0500 I  CONTROL  [initandlisten] ** WARNING: soft rlimits too low. rlimits set to 4096 processes, 65535 files. Number of processes should be at least 32767.5 : 0.5 times number of files.
2019-11-24T08:50:44.275-0500 I  CONTROL  [initandlisten] 
---
Enable MongoDB's free cloud-based monitoring service, which will then receive and display
metrics about your deployment (disk utilization, CPU, operation statistics, etc).

The monitoring data will be available on a MongoDB website with a unique URL accessible to you
and anyone you share the URL with. MongoDB may use this information to make product
improvements and to suggest MongoDB products and deployment options to you.

To enable free monitoring, run the following command: db.enableFreeMonitoring()
To permanently disable this reminder, run the following command: db.disableFreeMonitoring()
---
  • 查看 mongodb 的版本
db.version()
  • 查看當(dāng)前數(shù)據(jù)庫
# 查看當(dāng)前數(shù)據(jù)庫名稱
db

# 查看當(dāng)前狀態(tài)信息
db.stats()

默認(rèn)的數(shù)據(jù)庫為test椿猎,如果你沒有創(chuàng)建新的數(shù)據(jù)庫,集合將存放在test數(shù)據(jù)庫中

> db.stats()
{
        "db" : "test",
        "collections" : 0,
        "views" : 0,
        "objects" : 0,
        "avgObjSize" : 0,
        "dataSize" : 0,
        "storageSize" : 0,
        "numExtents" : 0,
        "indexes" : 0,
        "indexSize" : 0,
        "scaleFactor" : 1,
        "fileSize" : 0,
        "fsUsedSize" : 0,
        "fsTotalSize" : 0,
        "ok" : 1
}
  • 列出所有在物理上存在的數(shù)據(jù)庫
show dbs
  • 切換數(shù)據(jù)庫
use demo

如果數(shù)據(jù)庫不存在寿弱,則指向數(shù)據(jù)庫犯眠,但不創(chuàng)建,直到插入數(shù)據(jù)或創(chuàng)建集合時數(shù)據(jù)庫才被創(chuàng)建

  • 終端退出連接
exit

  • 查看當(dāng)前數(shù)據(jù)庫的集合
show collections
  • 集合創(chuàng)建
db.createCollection(name, options)

name是要創(chuàng)建的集合的名稱症革,options是一個文檔筐咧,用于指定集合的配置

> show collections
> db.createCollection('project')
{ "ok" : 1 }
  • 刪除集合
db.name.drop()
> show collections
project
> db.project.drop()
true
> show collections

基本數(shù)據(jù)操作

  • 插入文檔
# 通用插入
db.集合名稱.insert(document)

#單條插入
db.集合名稱.insertOne(document)

# 多條插入
db.集合名稱.insertMany(documents)

插入文檔時,如果不指定_id參數(shù)噪矛,MongoDB會為文檔分配一個唯一的ObjectId

> db.project.insert([{name:'阿里巴巴',founder:'馬云'},{name:'京東',founder: '劉強東'}])
BulkWriteResult({
        "writeErrors" : [ ],
        "writeConcernErrors" : [ ],
        "nInserted" : 2,
        "nUpserted" : 0,
        "nMatched" : 0,
        "nModified" : 0,
        "nRemoved" : 0,
        "upserted" : [ ]
})
  • 查詢文檔
# 查詢多條
db.集合名稱.find({條件}) 

# 查詢一條
db.集合名稱.findOne({條件})

# 方法pretty():將結(jié)果格式化
db.集合名稱.find({條件}).pretty()
> db.project.find()
{ "_id" : ObjectId("5dda8de90de81f9845d393fe"), "name" : "阿里巴巴", "founder" : "孫正義" }
{ "_id" : ObjectId("5dda8de90de81f9845d393ff"), "name" : "京東", "founder" : "劉強東" }

ROBO 查詢指定字段

db.getCollection('demo').find({},{_id:0, rongzi:1}).count()
  • 更新文檔
db.集合名稱.update(
   {query},
   {update},
   {multi: <boolean>}
)

參數(shù)query:查詢條件量蕊,類似sql語句update中where部分
參數(shù)update:更新操作符,類似sql語句update中set部分
參數(shù)multi:可選艇挨,默認(rèn)false残炮,表示只更新找到的第一條記錄,true表示全部更新

> db.project.update({name:'阿里巴巴'}, {$set:{founder:'馬云'}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.project.find()
{ "_id" : ObjectId("5dda8de90de81f9845d393fe"), "name" : "阿里巴巴", "founder" : "馬云" }
{ "_id" : ObjectId("5dda8de90de81f9845d393ff"), "name" : "京東", "founder" : "劉強東" }
  • 刪除文檔
db.集合名稱.remove(
   {query},
   {justOne: <boolean>}
)

參數(shù)query:可選缩滨,刪除的文檔的條件吉殃,不加條件則全部刪除
參數(shù)justOne:可選辞居,如果設(shè)為true或1,則只刪除匹配的一條蛋勺,默認(rèn)false,表示刪除多條

> db.project.remove({name:'京東'})
WriteResult({ "nRemoved" : 1 })

> db.project.find()
{ "_id" : ObjectId("5dda8de90de81f9845d393fe"), "name" : "阿里巴巴", "founder" : "馬云" }
  • skip與Limit
# 獲取指定條數(shù)的文檔
db.集合名稱.find({條件可選}).limit(NO.)

# 跳過指定條數(shù)的文檔鸠删,NO.為2則表示查詢從第3條開始
db.集合名稱.find({條件可選}).skip(NO.)

方法limit()和skip()可以一起使用抱完,不分先后順序

> db.createCollection('people')
{ "ok" : 1 }

> for(i=0;i<10;i++){db.people.insert({_id:i,name:'people' + i})}
WriteResult({ "nInserted" : 1 })

> db.people.find({_id:{$gte:1}}).skip(2).limit(5)
{ "_id" : 3, "name" : "people3" }
{ "_id" : 4, "name" : "people4" }
{ "_id" : 5, "name" : "people5" }
{ "_id" : 6, "name" : "people6" }
{ "_id" : 7, "name" : "people7" }
> 
  • 投影(字段)
db.集合名稱.find({},{字段名稱:1,...})

參數(shù)為字段與值,值為1表示顯示刃泡,值為0不顯示
對于需要顯示的字段巧娱,設(shè)置為1即可,不設(shè)置即為不顯示(_id默認(rèn)顯示)

> db.project.find({},{name:1})
{ "_id" : ObjectId("5dda8de90de81f9845d393fe"), "name" : "阿里巴巴" }
  • 排序 sort()
db.集合名稱.find().sort({字段:1,...})

參數(shù)1為升序排列烘贴,參數(shù)-1為降序排列

> db.people.find({_id:{$gt:0}}).limit(3).sort({_id:1})
{ "_id" : 1, "name" : "people1" }
{ "_id" : 2, "name" : "people2" }
{ "_id" : 3, "name" : "people3" }

> db.people.find({_id:{$gt:0}}).limit(3).sort({_id:-1})
{ "_id" : 9, "name" : "people9" }
{ "_id" : 8, "name" : "people8" }
{ "_id" : 7, "name" : "people7" }
  • 統(tǒng)計個數(shù) count()
db.集合名稱.find({條件}).count()
db.集合名稱.count({條件})
> db.people.find().count()
10

> db.people.count()
10
  • 去重 distinct()
db.集合名稱.distinct('去重字段',{條件})
  • 聚合 aggregate
db.集合名稱.aggregate([{管道:{表達(dá)式}}])

管道在Unix和Linux中一般用于將當(dāng)前命令的輸出結(jié)果作為下一個命令的輸入,在mongodb中禁添,管道具有同樣的作用

常用管道

管道名 作用
$group 將集合中的文檔分組,可用于統(tǒng)計結(jié)果
$match 過濾數(shù)據(jù)桨踪,只輸出符合條件的文檔
$project 修改輸入文檔的結(jié)構(gòu)老翘,如重命名、增加锻离、刪除字段铺峭、創(chuàng)建計算結(jié)果
$sort 將輸入文檔排序后輸出
$limit 限制聚合管道返回的文檔數(shù)
$skip 跳過指定數(shù)量的文檔,并返回余下的文檔
$unwind 將數(shù)組類型的字段進(jìn)行拆分

索引

  • 創(chuàng)建大量數(shù)據(jù):
for (i = 0; i < 100000; i++) {
    db.表.insert({name:'test'+i, age:i})
}
  • 數(shù)據(jù)查找性能分析(使用explain()命令進(jìn)行查看性能)
> db.explain.find({name:'test666'}).explain('executionStats')
{
        "queryPlanner" : {
                "plannerVersion" : 1,
                "namespace" : "demo.explain",
                "indexFilterSet" : false,
                "parsedQuery" : {
                        "name" : {
                                "$eq" : "test666"
                        }
                },
                "winningPlan" : {
                        "stage" : "COLLSCAN",
                        "filter" : {
                                "name" : {
                                        "$eq" : "test666"
                                }
                        },
                        "direction" : "forward"
                },
                "rejectedPlans" : [ ]
        },
        "executionStats" : {
                "executionSuccess" : true,
                "nReturned" : 0,
                "executionTimeMillis" : 0,
                "totalKeysExamined" : 0,
                "totalDocsExamined" : 10,
                "executionStages" : {
                        "stage" : "COLLSCAN",
                        "filter" : {
                                "name" : {
                                        "$eq" : "test666"
                                }
                        },
                        "nReturned" : 0,
                        "executionTimeMillisEstimate" : 0,
                        "works" : 12,
                        "advanced" : 0,
                        "needTime" : 11,
                        "needYield" : 0,
                        "saveState" : 0,
                        "restoreState" : 0,
                        "isEOF" : 1,
                        "direction" : "forward",
                        "docsExamined" : 10
                }
        },
        "serverInfo" : {
                "host" : "10.0.3.15",
                "port" : 27017,
                "version" : "4.2.1",
                "gitVersion" : "edf6d45851c0b9ee15548f0f847df141764a317e"
        },
        "ok" : 1
}

三汽纠,MongoDB在php中的使用

  1. 安裝MongoDB擴展
composer require topthink/think-mongo=2.0.*
  1. 配置相關(guān)參數(shù)
// 數(shù)據(jù)庫類型
'type'           => '\think\mongo\Connection',
// 設(shè)置查詢類
'query'          => '\think\mongo\Query',
// 服務(wù)器地址
'hostname'       => '127.0.0.1',
// 強制把_id轉(zhuǎn)換為id進(jìn)行操作卫键,保持和Mysql一致的主鍵命名習(xí)慣
'pk_convert_id'  => true,
// 集合名
'database'       => 'demo',
// 用戶名
'username'       => '',
// 密碼
'password'       => '',
// 端口
'hostport'       => '',
  1. thinkPHP支持的原生查詢

query (collection,query)

collection:表示當(dāng)前查詢的集合
query:是一個\MongoDB\Driver\Query對象

$filter = [
    'author' => 'bjori',
    'views' => [
        '$gte' => 100,
    ],
];

$options = [
    /* Only return the following fields in the matching documents */
    'projection' => [
        'title' => 1,
        'article' => 1,
    ],
    /* Return the documents in descending order of views */
    'sort' => [
        'views' => -1
    ],
);

$query = new MongoDB\Driver\Query($filter, $options);
Db::query('demo.user', $query);

execute (collection,bulk)

collection:表示當(dāng)前查詢的集合
bulk:是一個\MongoDB\Driver\BulkWrite對象

command (command,dbName)

command:是一個\MongoDB\Driver\Command對象
dbName:當(dāng)前操作的數(shù)據(jù)庫名稱,留空表示當(dāng)前數(shù)據(jù)庫

系統(tǒng)還封裝了一個cmd方法可以直接執(zhí)行字符串格式的mongo命令

// 列出當(dāng)前的集合
$collections = Db::cmd('listCollections');
  1. 查詢ORM
// 查詢操作
$user = Db::table('user')
    ->where('id','589461c0fc122812b4007411')
    ->find();
dump($user);

針對MongoDb的特殊鏈?zhǔn)讲僮鞣椒?/p>

方法 描述
skip 設(shè)置skip
awaitData 設(shè)置awaitData
batchSize 設(shè)置batchSize
exhaust 設(shè)置exhaust
modifiers 設(shè)置modifiers
noCursorTimeout 設(shè)置noCursorTimeout
oplogReplay 設(shè)置oplogReplay
partial 設(shè)置partial
maxTimeMS 設(shè)置maxTimeMS
slaveOk 設(shè)置slaveOk
tailable 設(shè)置tailable
writeConcern 設(shè)置writeConcern

不再支持的方法

view虱朵、join莉炉、alias、group碴犬、having絮宁、union、lock翅敌、strict羞福、sequence、force蚯涮、bind治专、partition

安裝PHP擴展問題匯總:

  1. brew install mongodb 安裝mongodb提示:No available formula with the name "mongodb"

https://blog.csdn.net/weixin_40368256/article/details/100626177

四,schema 設(shè)計原則

MongoDB是文檔型數(shù)據(jù)庫遭顶,是Schema Free的张峰,這種設(shè)計的好處如下:

  • 使用BSON結(jié)構(gòu),可直接將一個json數(shù)據(jù)存儲進(jìn)MongoDB棒旗,非常友好
  • 通過合理的數(shù)據(jù)模型設(shè)計喘批,將多種關(guān)聯(lián)需求通過內(nèi)嵌撩荣、反范式的方式實現(xiàn),減少了隨機IO饶深,讀寫性能高
  • 數(shù)據(jù)模型靈活餐曹,無需為Online DDL而操心,不同文檔可以有不同結(jié)構(gòu)

但這樣也有一些弊端敌厘,對于PHP這種弱類型語言台猴,如果往一個集合里插入任意類型的數(shù)據(jù),可能會導(dǎo)致查詢結(jié)果的錯誤俱两。例如:

> db.members.find();
{ "_id" : ObjectId("5b62a5c73eeb75204f15dbe3"), "user_id" : 100, "level" : "vip" }
{ "_id" : ObjectId("5b62a5cb3eeb75204f15dbe4"), "user_id" : 101, "level" : "vip" }
{ "_id" : ObjectId("5b62a5db3eeb75204f15dbe5"), "user_id" : "102", "level" : "gold" }
{ "_id" : ObjectId("5b62a5e53eeb75204f15dbe6"), "user_id" : 102, "level" : "gold" }

集合中有user_id為102和"102"的兩個文檔饱狂,按user_id查詢

> db.members.find({user_id:{$eq:102}});
{ "_id" : ObjectId("5b62a5e53eeb75204f15dbe6"), "user_id" : 102, "level" : "gold" }

> db.members.find({user_id:{$eq:"102"}});
{ "_id" : ObjectId("5b62a5db3eeb75204f15dbe5"), "user_id" : "102", "level" : "gold" }

MongoDB從版本3.2開始引入了schema validation,可以為集合指定驗證規(guī)則宪彩,在正確的地方休讳、需要的地方schema free,在適當(dāng)?shù)牡胤揭邢拗颇蚩住N覀優(yōu)閙embers集合指定驗證規(guī)則细燎,限定user_id必須為int類型锨亏,且不可或缺辨泳。

> db.createCollection( "contacts",{ validator: { $or :
[
  { phone: { $type: "string" } },
  { email: { $regex: /@mongodb.com$/ } },
  { status: { $in: [ "Unknown", "Incomplete" ] } }
]
}} )
{ "ok" : 1 }

嘗試插入user_id為string類型的數(shù)據(jù)

> db.members.insert({user_id:"102", level:"gold"});
Document failed validation

對已經(jīng)建立了的表谈截,可以通過如下方式來做限定:

db.runCommand( {
collMod: "contacts",
validator: { $or: [ { phone: { $type: "string" } }, { email: { $regex: /@mongodb.com$/ } }, { status: { $in: [ "Unknown", "Incomplete" ] } } ] },
validationLevel: "moderate"
} )

我們可以在設(shè)置validation的時候指定我們的validationLevel級別

  • 默認(rèn)級別是strict,對該collection已有和新增document都進(jìn)行validation驗證
  • 可以設(shè)置為moderate芜辕,僅對已存在的document進(jìn)行validation限定

validationAction參數(shù)來指定尚骄,當(dāng)有不符合validation規(guī)則的數(shù)據(jù)進(jìn)行update或者insert的時候,mongodb實例如何處理

  • 默認(rèn)級別為error侵续,不符合validation規(guī)則的拒絕insert和update
  • 可以設(shè)置為warn倔丈,mongodb會在日志中記錄,但允許insert和update操作

validation的限制

  • validation不能對admin状蜗、local和config庫中的collection進(jìn)行設(shè)置需五;
  • 不能對system.*這類collections進(jìn)行validation設(shè)置;

五轧坎,索引與查詢優(yōu)化

mongodb也有索引宏邮,視圖功能, MongoDB 4.0 引入的事務(wù)功能缸血,支持多文檔ACID特性蜜氨。

六,MongoDB副本和分片

MongoDb在用于生產(chǎn)環(huán)境的三種模式捎泻,master/slaves(主從模式)飒炎、replcation副本集和auto shard分片模式。官方推薦使用副本集模式笆豁。

副本

副本集是為了解決mongodb的可靠性郎汪。

在早期的系統(tǒng)設(shè)計中赤赊,主從模式是比較流行的。將讀寫分離煞赢,在不同的DB上操作抛计,可以有效降低數(shù)據(jù)庫的壓力,還能實現(xiàn)數(shù)據(jù)的備份耕驰,但是在master節(jié)點故障時爷辱,不能及時的自動切換到slaves節(jié)點,需要手動干預(yù)朦肘。

MongoDB復(fù)制是將數(shù)據(jù)同步在多個服務(wù)器的過程,它不但實現(xiàn)了主從模式的讀寫分離双饥,而且有自己的一套選舉機制媒抠,能通過自己的算法,選舉出當(dāng)前最優(yōu)節(jié)點作為Primary咏花。

客戶端從主節(jié)點上讀寫數(shù)據(jù)趴生,主節(jié)點負(fù)責(zé)將數(shù)據(jù)同步復(fù)制到副本節(jié)點。

主節(jié)點和副本節(jié)點昏翰,以及副本節(jié)點之間會有心跳

一旦主節(jié)點掛掉苍匆,會馬上選出一個副本節(jié)點作為主節(jié)點,不影響數(shù)據(jù)庫的使用棚菊。

一般讀取從主節(jié)點讀取浸踩,但也可以通過設(shè)置從副本節(jié)點讀取

分片

分片是為了解決mongodb的擴展問題。

利用Mongo的分片统求,可以將數(shù)據(jù)自動分解成多個塊检碗,存儲在不同的節(jié)點上,每個被拆分的塊都有三個副本集码邻,這樣是為了數(shù)據(jù)備份和恢復(fù)折剃,而且數(shù)據(jù)分片后,可以利用多臺廉價的存儲和CPU的計算構(gòu)建一個水平可擴展的系統(tǒng)架構(gòu)像屋。

水平擴展涉及劃分系統(tǒng)數(shù)據(jù)集并加載多個服務(wù)器怕犁,添加其他服務(wù)器以根據(jù)需要增加容量。雖然單個機器的總體速度或容量可能不高己莺,但每臺機器處理整個工作負(fù)載的子集奏甫,可能提供比單臺服務(wù)器更高的效率。擴展部署容量篇恒,只需要根據(jù)需求添加額外的服務(wù)器扶檐,這可能比單個機器的垂直擴展總體成本更低。

MongoDB分片群集包含以下組件:

分片:每個分片包含分片數(shù)據(jù)的子集胁艰。每個分片都可以部署為副本集款筑。
mongos:mongos充當(dāng)查詢路由器智蝠,在客戶端應(yīng)用程序和分片集群之間提供接口。
config servers:配置服務(wù)器存儲群集的元數(shù)據(jù)和配置設(shè)置奈梳。從MongoDB 3.4開始杈湾,必須將配置服務(wù)器部署為副本集(CSRS)

數(shù)據(jù)庫可以混合使用分片和非分片集合。分片集合在集群中的分片上進(jìn)行分區(qū)和分布攘须。非散列集合存儲在主分片上漆撞。每個數(shù)據(jù)庫都有自己的主分片。必須連接到mongos路由器才能與分片群集中的任何集合進(jìn)行交互于宙。這包括分片和非分片集合浮驳。客戶端永遠(yuǎn)不應(yīng)連接到單個分片以執(zhí)行讀取或?qū)懭氩僮?/p>

七捞魁,部署與日常管理

參考文檔:

https://docs.mongodb.com/manual/introduction/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末至会,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子谱俭,更是在濱河造成了極大的恐慌奉件,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件昆著,死亡現(xiàn)場離奇詭異县貌,居然都是意外死亡,警方通過查閱死者的電腦和手機凑懂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門煤痕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人征候,你說我怎么就攤上這事杭攻。” “怎么了疤坝?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵兆解,是天一觀的道長。 經(jīng)常有香客問我跑揉,道長锅睛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任历谍,我火速辦了婚禮现拒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘望侈。我一直安慰自己印蔬,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布脱衙。 她就那樣靜靜地躺著侥猬,像睡著了一般例驹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上退唠,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天鹃锈,我揣著相機與錄音,去河邊找鬼瞧预。 笑死屎债,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的垢油。 我是一名探鬼主播盆驹,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼滩愁!你這毒婦竟也來了召娜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤惊楼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后秸讹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體檀咙,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年璃诀,在試婚紗的時候發(fā)現(xiàn)自己被綠了弧可。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡劣欢,死狀恐怖棕诵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情凿将,我是刑警寧澤校套,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站牧抵,受9級特大地震影響笛匙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜犀变,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一妹孙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧获枝,春花似錦蠢正、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽笨触。三九已至,卻和暖如春有鹿,著一層夾襖步出監(jiān)牢的瞬間旭旭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工葱跋, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留持寄,地道東北人。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓娱俺,卻偏偏與公主長得像稍味,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子荠卷,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容