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