中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

什么是MongoDB分片

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

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

一、分片

分片,也叫做分區,是一種常用的數據庫優化技術。其含義就是將數據拆分,將數據分散到不同機器上的過程。這樣就能夠使得系統可以存儲更多的數據,處于更大的負載。 

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

MongoDB在這一點上做得不錯,它支持自動分片,集群可以自動切分數據,達到負載均衡,從而使管理人員可以擺脫手動分片。

二、mongo的分片

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

應用程序不需要知道哪些片對應哪些數據,也不需要知道數據是否已經拆分。MongoDB通過另外一個獨立的路由進程mongos來實現這個功能。 

mongos路由進程知道所有數據的存放位置,所以應用可以連接它來正常發送請求。而對于應用來說,自己只知道連接了一個普通的mongod。也就是說,mongos對應用隱藏了分片的細節。 

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

應用場景

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

1. 機器的磁盤不夠用了;

2. 單個mongodb已經不再滿足性能需要;

3. 想將大量數據放入內存提高性能。

一般來說,先從不分片開始,然后在需要的時候將其轉換成分片。

片鍵

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

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

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

那么我們應該如何選擇片鍵呢? 

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

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

我們也可以選擇復合片鍵,將兩個屬性鍵結合為一個片鍵。 

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

三、分片你來試試

1、mongodb分片的基本結構包括:多個數據庫節點shard、configserver、mongos組成。

    ·shard1、shard.....:mongodb服務的片節點。存儲數據。

    ·configserver:維護meta信息,判斷某條數據存儲到哪臺節點的服務器上。本身不存儲數據

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

2、搭建shard分片節點服務器。首先啟動27017和27018兩個實例節點做分片服務器。

①、創建服務器存儲數據的數據庫路徑和log路徑。其中m17,m18作為分片服務器,m20作為configserver服務器。

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

②、啟動兩個分片服務器實例

./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服務器

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

什么是MongoDB分片

--dbpath:指定數據庫路徑

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

--fork:后臺運行

--port:設置啟動的端口

--replSet:設置同一個復制集,復制集的名稱自定義

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

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

--storageEngine:設置數據庫的引擎,由于不支持wiredTiger引擎,需要切換支持的引擎,64位系統不需要切換引擎。

④、啟動mongos路由

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

什么是MongoDB分片

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

⑤、鏈接mongos添加分片服務器

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

添加分片:

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

什么是MongoDB分片

查看添加分片狀態:

什么是MongoDB分片

⑥、啟動數據庫分片功能

sh.enableSharding('shop')

什么是MongoDB分片

shop為需要開啟分片功能的數據庫。

查看shop數據庫是否開啟了分片功能

什么是MongoDB分片

⑦、設置數據庫表格分片

將shop數據庫下的goods表格根據goods_id字段進行分片。

添加分片語法:

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

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

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

什么是MongoDB分片

⑧、修改chunk的單位大小,達到調整每個chunk存放的數據量。

chunk工作原理:

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

查看默認chunk的大小

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

b、查看chunk大小

什么是MongoDB分片

c、設置chunk大小

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

什么是MongoDB分片

⑨、批量添加數據,查看分片數據。

什么是MongoDB分片

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

查看chunk在每個分配上的數量。

什么是MongoDB分片

查看27017分片的數據條數

什么是MongoDB分片

查看27018分片上的數據條數

什么是MongoDB分片

到這里,分片就完成了。

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

奉新县| 万安县| 汉源县| 兴业县| 盘锦市| 特克斯县| 永昌县| 改则县| 潞西市| 开平市| 商城县| 连云港市| 镇坪县| 二连浩特市| 清丰县| 嘉黎县| 霸州市| 肇源县| 团风县| 习水县| 东兴市| 崇州市| 罗山县| 廊坊市| 汉阴县| 陆丰市| 青州市| 晋城| 甘肃省| 辛集市| 丁青县| 翁源县| 杭锦后旗| 英超| 湘潭市| 承德市| 淅川县| 秦安县| 阳泉市| 婺源县| 安仁县|