溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

什么是MongoDB分片

發(fā)布時間:2020-08-24 16:55:36 來源:億速云 閱讀:324 作者:Leah 欄目:編程語言

本篇文章為大家展示了什么是MongoDB分片,代碼簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

一、分片

分片,也叫做分區(qū),是一種常用的數(shù)據(jù)庫優(yōu)化技術(shù)。其含義就是將數(shù)據(jù)拆分,將數(shù)據(jù)分散到不同機(jī)器上的過程。這樣就能夠使得系統(tǒng)可以存儲更多的數(shù)據(jù),處于更大的負(fù)載。 

幾乎所有的數(shù)據(jù)庫軟件都可以進(jìn)行手動分片,通過應(yīng)用程序管理不同服務(wù)器上的不同數(shù)據(jù),查詢也需要尋找正確的服務(wù)器。這樣雖然可以減輕負(fù)載,但是卻難以維護(hù),比如我們向集群添加節(jié)點(diǎn)或者刪除節(jié)點(diǎn),都需要對應(yīng)的調(diào)整數(shù)據(jù)的分布。 

MongoDB在這一點(diǎn)上做得不錯,它支持自動分片,集群可以自動切分?jǐn)?shù)據(jù),達(dá)到負(fù)載均衡,從而使管理人員可以擺脫手動分片。

二、mongo的分片

下面說說分片的原理。MongoDB分片的基本思想就是將集合切分成小塊,這些塊分散到若干片里面,每個片只負(fù)責(zé)總數(shù)據(jù)的一部分。 

應(yīng)用程序不需要知道哪些片對應(yīng)哪些數(shù)據(jù),也不需要知道數(shù)據(jù)是否已經(jīng)拆分。MongoDB通過另外一個獨(dú)立的路由進(jìn)程mongos來實(shí)現(xiàn)這個功能。 

mongos路由進(jìn)程知道所有數(shù)據(jù)的存放位置,所以應(yīng)用可以連接它來正常發(fā)送請求。而對于應(yīng)用來說,自己只知道連接了一個普通的mongod。也就是說,mongos對應(yīng)用隱藏了分片的細(xì)節(jié)。 

為什么要隱藏了?其實(shí)就是為了拓展的時候,不必修改應(yīng)用程序的代碼。

應(yīng)用場景

說完了原理,那什么時候需要用到分片呢?有以下幾種情況: 

1. 機(jī)器的磁盤不夠用了;

2. 單個mongodb已經(jīng)不再滿足性能需要;

3. 想將大量數(shù)據(jù)放入內(nèi)存提高性能。

一般來說,先從不分片開始,然后在需要的時候?qū)⑵滢D(zhuǎn)換成分片。

片鍵

設(shè)置分片時,需要從集合里面選一個鍵,用該鍵的值作為數(shù)據(jù)拆分的依據(jù)。這個鍵成為片鍵。 

假設(shè)有個文檔集合表示的是人員,如果選擇名字”name”做為片鍵,第一篇可能會存放名字以A-F開頭的文檔;第二片存G-P開頭的文檔;第三篇存Q-Z的文檔。 

隨著增加或刪除片,MongoDB會重新平衡數(shù)據(jù),使得每片的流量比較均衡,數(shù)據(jù)量也在合理范圍內(nèi)。

那么我們應(yīng)該如何選擇片鍵呢? 

如果我們選擇了時間屬性的鍵作為片鍵,那么隨著時間增長,所有的文檔都會以最后一片插入。這就不適合寫入操作負(fù)載很高的情況,但是查詢起來就比較方便。 

如果我們選擇了分布均勻的片鍵,就會提高寫入操作的負(fù)載能力,但是就會影響查詢的性能。 

我們也可以選擇復(fù)合片鍵,將兩個屬性鍵結(jié)合為一個片鍵。 

其實(shí)和索引的原理相似,事實(shí)上,片鍵也是最常用的索引。

三、分片你來試試

1、mongodb分片的基本結(jié)構(gòu)包括:多個數(shù)據(jù)庫節(jié)點(diǎn)shard、configserver、mongos組成。

    ·shard1、shard.....:mongodb服務(wù)的片節(jié)點(diǎn)。存儲數(shù)據(jù)。

    ·configserver:維護(hù)meta信息,判斷某條數(shù)據(jù)存儲到哪臺節(jié)點(diǎn)的服務(wù)器上。本身不存儲數(shù)據(jù)

    ·mongs:查詢數(shù)據(jù)時,要先找到configserver,詢問查詢的數(shù)據(jù)到哪個shard上取數(shù)據(jù)。

2、搭建shard分片節(jié)點(diǎn)服務(wù)器。首先啟動27017和27018兩個實(shí)例節(jié)點(diǎn)做分片服務(wù)器。

①、創(chuàng)建服務(wù)器存儲數(shù)據(jù)的數(shù)據(jù)庫路徑和log路徑。其中m17,m18作為分片服務(wù)器,m20作為configserver服務(wù)器。

mkdir -p /home/m17 /home/m18 /home/m20 /home/mlog

②、啟動兩個分片服務(wù)器實(shí)例

./bin/mongod --dbpath /home/m17 --logpath /home/mlog/m17.log --fork --port 27017 --smallfiles --journal 
-storageEngine=mmapv1
./bin/mongod --dbpath /home/m18 --logpath /home/mlog/m18.log --fork --port 27018 --smallfiles --journal 
-storageEngine=mmapv1

什么是MongoDB分片

③、啟動configsvr服務(wù)器

./bin/mongod --dbpath /home/m20 --logpath /home/mlog/m20.log --fork --port 27020 --configsvr --smallfiles --journal 
-storageEngine=mmapv1

什么是MongoDB分片

--dbpath:指定數(shù)據(jù)庫路徑

--logpath:指定日志存放路徑

--fork:后臺運(yùn)行

--port:設(shè)置啟動的端口

--replSet:設(shè)置同一個復(fù)制集,復(fù)制集的名稱自定義

--journal:32linux需要這個參數(shù)才能啟動,64位不需要這個參數(shù)

--smallfiles:啟動時占用較小的空間,如果空間不是很缺少,一般不需要這個參數(shù)

--storageEngine:設(shè)置數(shù)據(jù)庫的引擎,由于不支持wiredTiger引擎,需要切換支持的引擎,64位系統(tǒng)不需要切換引擎。

④、啟動mongos路由

./bin/mongos --logpath /home/mlog/m30.log --fork --port 30000 --configdb 127.0.0.1:27020

什么是MongoDB分片

--configdb:啟動mongs路由需要指明哪個configsvr為他服務(wù),所以后面填寫為他服務(wù)的configsvr服務(wù)器的地址。

⑤、鏈接mongos添加分片服務(wù)器

鏈接mongos: ./bin/mongo --port 30000

添加分片:

sh.addShard('127.0.0.1:27017')
sh.addShard('127.0.0.1:27018')

什么是MongoDB分片

查看添加分片狀態(tài):

什么是MongoDB分片

⑥、啟動數(shù)據(jù)庫分片功能

sh.enableSharding('shop')

什么是MongoDB分片

shop為需要開啟分片功能的數(shù)據(jù)庫。

查看shop數(shù)據(jù)庫是否開啟了分片功能

什么是MongoDB分片

⑦、設(shè)置數(shù)據(jù)庫表格分片

將shop數(shù)據(jù)庫下的goods表格根據(jù)goods_id字段進(jìn)行分片。

添加分片語法:

sh.shardCollection(‘dbName.collectionName’,{field:1});

Field是collection的一個字段,系統(tǒng)將會利用filed的值,來計算應(yīng)該分到哪一個片上。

這個filed叫“片鍵”,shard key。

什么是MongoDB分片

⑧、修改chunk的單位大小,達(dá)到調(diào)整每個chunk存放的數(shù)據(jù)量。

chunk工作原理:

mongodb分片是以chunk為單位進(jìn)行分片,當(dāng)其中的一個節(jié)點(diǎn)(27017節(jié)點(diǎn))上存放的chunk比另一個節(jié)點(diǎn)(27018)上存放的chunk大于3倍時,那么27017節(jié)點(diǎn)上將會將部分chunk移動到27018節(jié)點(diǎn)上,來維護(hù)各個節(jié)點(diǎn)片之間數(shù)據(jù)的均衡。

查看默認(rèn)chunk的大小

a、首先保證分片的數(shù)據(jù)庫下有數(shù)據(jù),如果沒有則插入一條數(shù)據(jù)。

b、查看chunk大小

什么是MongoDB分片

c、設(shè)置chunk大小

db.settings.save({_id:'chunksize',value:1})

什么是MongoDB分片

⑨、批量添加數(shù)據(jù),查看分片數(shù)據(jù)。

什么是MongoDB分片

添加了一百萬條數(shù)據(jù)后,在查看數(shù)據(jù)在分片上存儲的數(shù)據(jù)。

查看chunk在每個分配上的數(shù)量。

什么是MongoDB分片

查看27017分片的數(shù)據(jù)條數(shù)

什么是MongoDB分片

查看27018分片上的數(shù)據(jù)條數(shù)

什么是MongoDB分片

到這里,分片就完成了。

上述內(nèi)容就是什么是MongoDB分片,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI