凡科自助建站靠譜嗎百度推廣獲客
MongoDB
- 1、簡(jiǎn)單介紹
- 2、基本術(shù)語
- 3、shard分片概述
- 背景
- 架構(gòu)
- 路由功能
- chunk(數(shù)據(jù)分片)
- shard key(分片鍵值)
- 4、常用命令
1、簡(jiǎn)單介紹
MongoDB是一個(gè)分布式文件存儲(chǔ)的數(shù)據(jù)庫,介于關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫之間,支持的數(shù)據(jù)結(jié)構(gòu)類型為BSON,類似于JSON。MongoDB中的記錄是一個(gè)document,由字段和值對(duì)組成的數(shù)據(jù)結(jié)構(gòu)。
MongoDB適合在數(shù)據(jù)量大,讀寫頻繁,對(duì)事務(wù)性要求不高的場(chǎng)景應(yīng)用。
2、基本術(shù)語
- database:數(shù)據(jù)庫
- collection:表
- document:一條數(shù)據(jù)
- field:字段
- index:索引
3、shard分片概述
分片(sharding)是 MongoDB 用來將大型集合分割到不同服務(wù)器(或者說一個(gè)集群)上所采用的方法。
背景
高數(shù)據(jù)量和吞吐量的數(shù)據(jù)庫應(yīng)用會(huì)對(duì)單機(jī)的性能造成較大壓力,大的查詢量會(huì)將單機(jī)的CPU耗盡,大的數(shù)據(jù)量對(duì)單機(jī)的存儲(chǔ)壓力較大,最終會(huì)耗盡系統(tǒng)的內(nèi)存而將壓力轉(zhuǎn)移到磁盤IO上。為了解決這些問題,有兩個(gè)基本的方法: 垂直擴(kuò)展和水平擴(kuò)展。垂直擴(kuò)展:增加更多的CPU和存儲(chǔ)資源來擴(kuò)展容量。水平擴(kuò)展:將數(shù)據(jù)集分布在多個(gè)服務(wù)器上。水平擴(kuò)展即分片。
分片為應(yīng)對(duì)高吞吐量與大數(shù)據(jù)量提供了方法。使用分片減少了每個(gè)分片需要處理的請(qǐng)求數(shù),因此,通過水平擴(kuò)展,集群可以提高自己的存儲(chǔ)容量和吞吐量。舉例來說,當(dāng)插入一條數(shù)據(jù)時(shí),應(yīng)用只需要訪問存儲(chǔ)這條數(shù)據(jù)的分片。而且當(dāng)某個(gè)shard的負(fù)載超過一定闕值后,就會(huì)自動(dòng)的重新分發(fā)數(shù)據(jù),用來保證系統(tǒng)的負(fù)載均衡。
架構(gòu)
-
shard:分片,數(shù)據(jù)的真正存儲(chǔ)位置,以chunk為單位存數(shù)據(jù)。
-
mongos:數(shù)據(jù)路由,和客戶端打交道的模塊。提供對(duì)外應(yīng)用訪問,所有操作均通過mongos執(zhí)行
? mongos本身沒有任何數(shù)據(jù),他也不知道該怎么處理這數(shù)據(jù),會(huì)去找config server。
-
config server:存儲(chǔ)元數(shù)據(jù)和所有shard節(jié)點(diǎn)的信息,分片功能的一些配置信息。
Mongos本身并不持久化數(shù)據(jù),Sharded cluster所有的元數(shù)據(jù)都會(huì)存儲(chǔ)到Config Server,而用戶的數(shù)據(jù)會(huì)議分散存儲(chǔ)到各個(gè)shard。Mongos啟動(dòng)后,會(huì)從配置服務(wù)器加載元數(shù)據(jù),開始提供服務(wù),將用戶的請(qǐng)求正確路由到對(duì)應(yīng)的碎片。
路由功能
-
當(dāng)數(shù)據(jù)寫入時(shí),MongoDB Cluster根據(jù)分片鍵設(shè)計(jì)寫入數(shù)據(jù)。
-
當(dāng)外部語句發(fā)起數(shù)據(jù)查詢時(shí),MongoDB根據(jù)數(shù)據(jù)分布自動(dòng)路由至指定節(jié)點(diǎn)返回?cái)?shù)據(jù)。
chunk(數(shù)據(jù)分片)
在一個(gè)shard server內(nèi)部,MongoDB還是會(huì)把數(shù)據(jù)分為chunks,每個(gè)chunk代表這個(gè)shard server內(nèi)部一部分?jǐn)?shù)據(jù)。chunk的產(chǎn)生,會(huì)有以下兩個(gè)用途:
Splitting:當(dāng)一個(gè)chunk的大小超過配置中的chunk size時(shí),MongoDB的后臺(tái)進(jìn)程會(huì)把這個(gè)chunk切分成更小的chunk,從而避免chunk過大的情況
Balancing:在MongoDB中,balancer是一個(gè)后臺(tái)進(jìn)程,負(fù)責(zé)chunk的遷移,從而均衡各個(gè)shard server的負(fù)載,系統(tǒng)初始1個(gè)chunk,chunk size默認(rèn)值64M,生產(chǎn)庫上選擇適合業(yè)務(wù)的chunk size是最好的。ongoDB會(huì)自動(dòng)拆分和遷移chunks。
shard key(分片鍵值)
MongoDB 中數(shù)據(jù)的分片是以集合為基本單位的,集合中的數(shù)據(jù)通過片鍵(Shard key)被分成多部分。其實(shí)片鍵就是在集合中選一個(gè)鍵,用該鍵的值作為數(shù)據(jù)拆分的依據(jù)。
片鍵必須是一個(gè)索引。
對(duì)集合進(jìn)行分片時(shí),你需要選擇一個(gè)片鍵,片鍵是每條記錄都必須包含的,且建立了索引的單個(gè)字段或復(fù)合字段,MongoDB按照片鍵將數(shù)據(jù)劃分到不同的數(shù)據(jù)塊中,并將數(shù)據(jù)塊均衡地分布到所有分片中。
MongDB查詢結(jié)果按照shard key排列,且每一shard中按索引有序排列。
4、常用命令
show dbs # 查看所有數(shù)據(jù)庫
use [database] # 選擇某一數(shù)據(jù)庫
show tables # 查看數(shù)據(jù)庫中的所有表
db.[collection].find() # 查看某一集合的數(shù)據(jù)
db.[collection].find({"id":{$regex:"^a*"}}) # 正則查詢,^:表示匹配字符串開頭;*:匹配任意字符;$:表示匹配字符串結(jié)尾
db.[collection].find().limit() # 限制查詢結(jié)果條數(shù)
db.[collection].find({}, {id:1, name:1}) # 限制返回結(jié)果字段只有id和name
db.[collection].insert({}) # 插入一條數(shù)據(jù)
db.[collection].update({"id":"123456"}, {$set:{"name":"minh"}}) # 更新id為123456的name字段值為minh
db.[collection].sort() # 對(duì)查詢結(jié)果按某字段排序
pretty() # 查詢結(jié)果進(jìn)行格式化處理
findOne() # 查詢單條數(shù)據(jù)
db.[collection].remove({"name":"minh"}) # 刪除數(shù)據(jù)
db.[collection].find().hint({name:1}) # 強(qiáng)制使用某個(gè)索引查詢
$and $or
示例:
show dbs
use books
show tables
use literaturedb.literature.find()
db.literature.findOne()
db.literature.find().pretty()
db.literature.find().sort()
db.literature.find().hint({name:1})
db.literature.find().limit(10)
db.literature.find({"name":"WeThree"})
db.literature.find({"name":"WeThree"}, {name:1, author:1, price:1})
db.literature.find({$and:[{"name":"WeThree"}, {"price": {$gte: 30}}]})
db.literature.find({$or:[{"name":"WeThree"}, {"name": "homeless"}]})
db.literature.find({"name": {$in : ["a", "b", "c"]}})db.literature.insert({id:"2", name:"name", author:"minh", price:NumberInt(66), date:NumberLong(12345678)})db.literature.update({name:"name"}, {$set: {name:"minh"}})db.literature.remove({id:"2"})
參考:
https://www.mongodb.com/docs/manual/sharding/
https://zhuanlan.zhihu.com/p/598892366