您好,登錄后才能下訂單哦!
本篇文章為大家展示了什么是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
③、啟動configsvr服務器
./bin/mongod --dbpath /home/m20 --logpath /home/mlog/m20.log --fork --port 27020 --configsvr --smallfiles --journal -storageEngine=mmapv1
--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
--configdb:啟動mongs路由需要指明哪個configsvr為他服務,所以后面填寫為他服務的configsvr服務器的地址。
⑤、鏈接mongos添加分片服務器
鏈接mongos: ./bin/mongo --port 30000
添加分片:
sh.addShard('127.0.0.1:27017')
sh.addShard('127.0.0.1:27018')
查看添加分片狀態:
⑥、啟動數據庫分片功能
sh.enableSharding('shop')
shop為需要開啟分片功能的數據庫。
查看shop數據庫是否開啟了分片功能
⑦、設置數據庫表格分片
將shop數據庫下的goods表格根據goods_id字段進行分片。
添加分片語法:
sh.shardCollection(‘dbName.collectionName’,{field:1});
Field是collection的一個字段,系統將會利用filed的值,來計算應該分到哪一個片上。
這個filed叫“片鍵”,shard key。
⑧、修改chunk的單位大小,達到調整每個chunk存放的數據量。
chunk工作原理:
mongodb分片是以chunk為單位進行分片,當其中的一個節點(27017節點)上存放的chunk比另一個節點(27018)上存放的chunk大于3倍時,那么27017節點上將會將部分chunk移動到27018節點上,來維護各個節點片之間數據的均衡。
查看默認chunk的大小
a、首先保證分片的數據庫下有數據,如果沒有則插入一條數據。
b、查看chunk大小
c、設置chunk大小
db.settings.save({_id:'chunksize',value:1})
⑨、批量添加數據,查看分片數據。
添加了一百萬條數據后,在查看數據在分片上存儲的數據。
查看chunk在每個分配上的數量。
查看27017分片的數據條數
查看27018分片上的數據條數
到這里,分片就完成了。
上述內容就是什么是MongoDB分片,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。