MongoDB 分片集群把非分片集合轉成分片集合


記得關注一下博主,博主每天都會更新IT技術,讓你有意想不到的小收獲哦^_^


文章目錄

  • *`記得關注一下博主,博主每天都會更新IT技術,讓你有意想不到的小收獲哦^_^`*
      • 一、MongDB集群啟停止
          • 1、MonogoDB分片集群服務啟動順序(三臺主機都要操作,主機啟動順序 mongodb01 --- mongodb02 --- mongodb03)
          • 2、MonogoDB分片集群服務停止順序(三臺主機都要操作,主機停止順序 mongodb03 --- mongodb02 --- mongodb01)
      • 二、查看并調整MonogDB分片集群
          • 1、查看分片集群狀態信息
          • 2、查看分片數據庫信息
          • 3、開啟balancer功能
          • 4、設置balance進程activeWindows運行窗口時間(本教程暫時不設置,以免影響后面模擬操作)
      • 三、MongoDB分片集群模擬非分片集合轉分片集合
          • 1、分片集群創建非分片集合并插入數據
          • 2、查看school數據庫分片情況
          • 3、school數據庫開啟分片功能
          • 4、school數據庫student集合開啟分片功能
          • 5、調整MongoDB分片集群 Chunk大小
          • 6、開啟student集合balancer功能和設置autosplit屬性為true
          • 7、設置student集合balancer功能autosplit屬性為true
          • 8、查看school數據庫student集合Chunk數據塊在每個shard節點分配使用情況
          • 9、模擬school數據庫student集合插入數據
          • 10、查看school數據庫student集合Chunk數據塊在每個shard節點分配使用情況




MongoDB分片集群由以下組件組成

shard 分片服務: 提供以復制集為單位橫向擴展,最大支持分片節點1024個,分片之間的數據不重復,所有分片在一起才可以完整工作。

mongos 路由服務:提供客戶端應用程序和分片群集之間接口,選擇合適數據shard節點進行讀寫,不持久化數據,只緩存config配置服務器的元數據。

config 配置服務: 提供MongoDB分片集群數據存儲分片shard節點的信息和分片功能的配置信息, 從MongoDB 3.4開始,配置服務器必須部署為副本集。




主機規劃

主機名稱主機IPCPU內存mongos端口config端口share1端口share2端口share3端口操作系統及軟件版本
mongodb01192.168.91.612*416GB2701727019271012710227103CentOS 7.9 mongo 4.4.29 mongos 4.4.29 mongod 4.4.29 mongosh 2.2.29
mongodb02192.168.91.622*416GB2701727019271012710227103CentOS 7.9 mongo 4.4.29 mongos 4.4.29 mongod 4.4.29 mongosh 2.2.29
mongodb03192.168.91.632*416GB2701727019271012710227103CentOS 7.9 mongo 4.4.29 mongos 4.4.29 mongod 4.4.29 mongosh 2.2.29



MongoDB分片集群架構圖

在這里插入圖片描述




提示:MongoDB 分片集群安裝與部署本教程不講解,如有疑問請自行上網查閱關于MongDB分片集群安裝與部署。




一、MongDB集群啟停止


1、MonogoDB分片集群服務啟動順序(三臺主機都要操作,主機啟動順序 mongodb01 — mongodb02 — mongodb03)
systemctl start mongod
systemctl start shard1
systemctl start shard2
systemctl start shard3
systemctl start mongossystemctl status mongod
systemctl status shard1
systemctl status shard2
systemctl start shard3
systemctl status mongos

2、MonogoDB分片集群服務停止順序(三臺主機都要操作,主機停止順序 mongodb03 — mongodb02 — mongodb01)
systemctl stop mongos
systemctl stop shard3
systemctl stop shard2
systemctl stop shard1
systemctl stop mongodsystemctl status mongos
systemctl status shard3
systemctl status shard2
systemctl status shard1
systemctl status mongod



二、查看并調整MonogDB分片集群


1、查看分片集群狀態信息
mongosh --host 192.168.91.61 --port 27017 -u root -p 123456### 顯示分片集群的分片節點信息
use admin
db.runCommand({ listshards : 1})### 查看分片集群狀態信息
use admin
sh.status()
### 查看更多分片集群狀態信息,包括分片鍵和范圍信息等
sh.status(true)

2、查看分片數據庫信息
mongosh --host 192.168.91.61 --port 27017 -u root -p 123456### 查看已開啟分片的數據庫
use config
db.databases.find( { "partitioned": true } )
db.databases.find()### 查看所有分片的片鍵
db.collections.find()

3、開啟balancer功能

提示:balancer組件是MongoDB分片集群中的一個進程,它會定期檢查分片集群中的分片數量,并自動遷移分片之間數據不均衡的數據塊,以此來實現數據分布均衡。

mongosh --host 192.168.91.61 --port 27017 -u root -p 123456### 檢查balancer是否開啟,true為開啟,false為關閉,默認開啟
sh.getBalancerState()### 啟動balancer
sh.startBalancer()### 關閉balancer
sh.stopBalancer()

4、設置balance進程activeWindows運行窗口時間(本教程暫時不設置,以免影響后面模擬操作)

提示:如果MongDB分片集群在執行備份期間,需要確保balance處于停止狀態,以免MongDB分片集群在執行備份期間還有數據塊在遷移,影響備份數據的一致性。可以設置一個備份窗口時間用于自動化備份操作,在這個時間段內,balancer進程一直處于停止狀態。

mongosh --host 192.168.91.61 --port 27017 -u root -p 123456### 檢查balancer是否開啟,true為開啟,false為關閉,默認開啟
use config
sh.getBalancerState()### 如果未開balancer功能可以執行以下命令開啟
sh.setBalancerState( true )### 設置balancer進程activeWindows運行窗口從6點開始運行,晚上23點停止,其余的時間段可以用來備份分片集群數據庫操作
db.settings.update( { _id : "balancer" }, { $set : { activeWindow : { start : "6:00", stop : "23:00" } } }, true )### 刪除balancer進程activeWindows運行窗口
db.settings.update({ "_id" : "balancer" }, { $unset : { activeWindow : 1 }});



三、MongoDB分片集群模擬非分片集合轉分片集合

模擬說明:暫時先不要給模擬數據庫和集合啟動分片功能,等創建好數據庫并插入數據后,再啟動分片功能。


1、分片集群創建非分片集合并插入數據
mongosh --host 192.168.91.61  --port 27017  -u root -p 123456### 創建school數據庫
use school### 創建student集合并插入數據
for (var i = 1; i <= 10000; i++){db.student.insert({number:i,"001":"xiaoming"});
}### 查看school數據庫student集合數據
use school
show collections;
db.student.find().limit(5)
db.student.find().count()

2、查看school數據庫分片情況

提示:MongoDB分片集群school數據庫student集合如果要開啟分片功能,需要先開啟school數據庫分片功能才能接著開啟student集合的分片功能。

mongosh --host 192.168.91.61  --port 27017  -u root -p 123456### 當前參數partitioned:為false說明school數據庫并沒有開啟分片功能,student集合也沒有開啟分片功能,當前參數primary: 'shard1'說明school數據庫只是分配在shard1節點上
[direct: mongos] config> sh.status()
…………………………………………database: {_id: 'school',primary: 'shard1',partitioned: false,version: {uuid: UUID('9e42a412-f191-40b5-9804-9f225cd5abb4'),lastMod: 1},lastMovedTimestamp: Timestamp({ t: 1718954817, i: 1 })},collections: {}}
]

3、school數據庫開啟分片功能
mongosh --host 192.168.91.61  --port 27017  -u root -p 123456### school數據庫開啟分片功能
use admin
sh.enableSharding("school")### 當前參數partitioned:為true說明school數據庫開啟分片功能
[direct: mongos] admin> sh.status()
…………………………………………database: {_id: 'school',primary: 'shard1',partitioned: true,version: {uuid: UUID('9e42a412-f191-40b5-9804-9f225cd5abb4'),lastMod: 1},lastMovedTimestamp: Timestamp({ t: 1718954817, i: 1 })},collections: {}}
]

4、school數據庫student集合開啟分片功能
mongosh --host 192.168.91.61  --port 27017  -u root -p 123456### school數據庫student集合開啟分片功能,提示以下錯誤原因在于當前school數據庫student集合已經有數據在里面(屬于非分片集合),并且插入的數據并沒有分片索引,所以,需要進入到school數據庫先創建student集合的分片索引。
[direct: mongos] admin> use admin
[direct: mongos] admin> sh.shardCollection( "school.student", { _id: "hashed" } )
MongoServerError[InvalidOptions]: Please create an index that starts with the proposed shard key before sharding the collection### 進入school數據庫創建student集合分片索引(”_id”索引名稱自定義)
[direct: mongos] school> use school
[direct: mongos] school> db.student.createIndex( { _id: "hashed" } )
[direct: mongos] school> db.student.getIndexes()
[{ v: 2, key: { _id: 1 }, name: '_id_' },{ v: 2, key: { _id: 'hashed' }, name: '_id_hashed' }
]### 開啟school數據庫student集合分片功能
use admin
sh.shardCollection( "school.student", { _id: "hashed" } )### 當前參數balancing值為true說明student集合開啟了balancer功能。當前chunkMetadata參數只分配在shard1節點上,但沒有分配在shard2節點和shard3節點,是否student沒有開啟分片功能?其實不是這樣子,原因在于當前student集合并沒有數據寫入,而且數據也很小,分片集群的Chunk數據塊默認是64MB,其實只要一個shard節點的一個Chunk數據塊就夠存儲了。如果我們把Chunk數據塊調整成1MB,然后我們在往student集合插入大量數據,那balancer進程就會檢查到有數據寫入到student集合就會觸發自動平衡student集合Chunk數據塊到shard1節點、shard2節點、shard3節點。
[direct: mongos] admin> sh.status()
…………………………………………database: {_id: 'school',primary: 'shard1',partitioned: true,version: {uuid: UUID('9e42a412-f191-40b5-9804-9f225cd5abb4'),lastMod: 1},lastMovedTimestamp: Timestamp({ t: 1718954817, i: 1 })},collections: {'school.student': {shardKey: { _id: 'hashed' },unique: false,balancing: true,chunkMetadata: [ { shard: 'shard1', nChunks: 1 } ],chunks: [{ min: { _id: MinKey() }, max: { _id: MaxKey() }, 'on shard': 'shard1', 'last modified': Timestamp({ t: 1, i: 0 }) }],tags: []}}}
]

5、調整MongoDB分片集群 Chunk大小

提示:本教程調整Chunk大小為1MB只是為了方便模擬測試,如果是生產環境推薦使用默認值或根據實際環境需求調整。

mongosh --host 192.168.91.61  --port 27017  -u root -p 123456### 調整chunk大小,默認64MB,chunk取值范圍 1MB~1024MB(2的整數倍取值),"value:1"代表調整每個chunk大小為1MB
use config
db.settings.updateOne( { _id: "chunksize" },{ $set: { _id: "chunksize", value: 1 } },{ upsert: true } )### 查看chunk大小,并且要確保當前參數autosplit為true狀態,才能讓Chunk自動分裂,autosplit屬性也是靠insert和update來觸發Chunk自動分裂的
[direct: mongos] config> db.settings.find()
[{ _id: 'balancer', mode: 'full', stopped: false },{ _id: 'autosplit', enabled: true },{ _id: 'chunksize', value: 1 }
]

6、開啟student集合balancer功能和設置autosplit屬性為true
mongosh --host 192.168.91.61  --port 27017  -u root -p 123456### 開啟student集合balancer功能
use config
sh.enableBalancing("school.student") ### 關閉student集合balancer功能
use config
sh.disableBalancing("school.student")### 查看school數據庫student集合是否開啟了balancer功能,如果參數balancing值為true說明開啟,false說明關閉
sh.status()

7、設置student集合balancer功能autosplit屬性為true
mongosh --host 192.168.91.61  --port 27017  -u root -p 123456### 設置autosplit屬性為true
use config
sh.disableAutoSplit()### 設置autosplit屬性為false
use config
sh.enableAutoSplit()### 查看student集合balancer功能autosplit屬性值
use config
db.settings.find()

8、查看school數據庫student集合Chunk數據塊在每個shard節點分配使用情況
mongosh --host 192.168.91.61  --port 27017  -u root -p 123456[direct: mongos] config> use school[direct: mongos] school> db.student.getShardDistribution()
Shard shard1 at shard1/192.168.91.61:27101,192.168.91.62:27101,192.168.91.63:27101
{data: '507KiB',docs: 10000,chunks: 1,'estimated data per chunk': '507KiB','estimated docs per chunk': 10000
}
---
Totals
{data: '507KiB',docs: 10000,chunks: 1,'Shard shard1': ['100 % data','100 % docs in cluster','52B avg obj size on shard']
}

9、模擬school數據庫student集合插入數據
mongosh --host 192.168.91.61  --port 27017  -u root -p 123456use school### student集合在原來1萬條數據再插入多5萬條數據
for (var i = 10001; i <= 60000; i++){db.student.insert({id:i,"003":"xiaoming"});
}### 查看school數據庫student集合數據
use school
show collections;
db.student.find().limit(5)
db.student.find().count()

10、查看school數據庫student集合Chunk數據塊在每個shard節點分配使用情況
mongosh --host 192.168.91.61  --port 27017  -u root -p 123456[direct: mongos] school> use school[direct: mongos] school> db.student.getShardDistribution()
Shard shard1 at shard1/192.168.91.61:27101,192.168.91.62:27101,192.168.91.63:27101
{data: '2.16MiB',docs: 46552,chunks: 1,'estimated data per chunk': '2.16MiB','estimated docs per chunk': 46552
}
---
Shard shard2 at shard2/192.168.91.61:27102,192.168.91.62:27102,192.168.91.63:27102
{data: '1.38MiB',docs: 29859,chunks: 1,'estimated data per chunk': '1.38MiB','estimated docs per chunk': 29859
}
---
Shard shard3 at shard3/192.168.91.61:27103,192.168.91.62:27103,192.168.91.63:27103
{data: '709KiB',docs: 14929,chunks: 1,'estimated data per chunk': '709KiB','estimated docs per chunk': 14929
}
---
Totals
{data: '4.24MiB',docs: 91340,chunks: 3,'Shard shard1': ['51.06 % data','50.96 % docs in cluster','48B avg obj size on shard'],'Shard shard2': ['32.62 % data','32.68 % docs in cluster','48B avg obj size on shard'],'Shard shard3': ['16.31 % data','16.34 % docs in cluster','48B avg obj size on shard']
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/94201.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/94201.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/94201.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mybatis過渡到mybatis-plus過程中需要注意的地方

將 MyBatis 升級為 MyBatis-Plus&#xff08;簡稱 MP&#xff09;是一個平滑過渡的過程&#xff0c;因為 MP 是 MyBatis 的增強工具&#xff08;而非替代&#xff09;&#xff0c;但仍有一些關鍵注意事項需要關注&#xff0c;以確保升級后功能兼容且能充分利用 MP 的特性&#…

openEuler系統中如何將docker安裝在指定目錄

在 openEuler 中&#xff0c;Docker 的默認數據存儲目錄為 /var/lib/docker&#xff08;程序文件通常安裝在系統默認路徑&#xff0c;一般無需修改&#xff09;。若需將 Docker 數據&#xff08;鏡像、容器、卷等&#xff09;存儲到指定目錄&#xff0c;可通過修改 Docker 配置…

2.4 我國金融市場的監管體制

1、國務院金融發展委員會職責 2、中國人民銀行職責

PHP - 實例屬性訪問與靜態方法調用的性能差異解析

觀察到了一個看似矛盾的現象&#xff1a;實例屬性訪問更快&#xff0c;但靜態方法調用更快。這實際上是兩種不同的操作&#xff0c;下面我將詳細解釋其中的原理和差異。1. 實例屬性訪問為什么快訪問機制class MyClass {public $instanceProp 1; }$obj new MyClass(); $value …

音視頻面試題集錦第 31 期

音視頻面試題集錦第 31 期&#xff1a; 1、I 幀、P 幀和 B 幀的概念及區別&#xff1f;2、視頻編碼中的碼率控制技術有哪些&#xff1f;3、音頻采樣參數有哪些&#xff1f;4、RTMP 和 HLS 協議各有什么特點&#xff1f;如何選擇&#xff1f;5、WebRTC 中的 ICE、STUN、TURN 各…

企業視頻庫管理高效策略

內容概要本文全面探討企業視頻庫管理的高效策略&#xff0c;旨在幫助組織優化視頻資源處理。首先&#xff0c;我們將介紹企業視頻庫管理的基本概念和核心價值。接著&#xff0c;深入分析智能分類核心技術如何通過AI算法實現視頻自動歸類。之后&#xff0c;闡述云集成實現路徑&a…

WebSocket和跨域問題

WebSocket 特點 WebSocket 是一種在單個 TCP 連接上進行全雙工通信的協議。簡單來說&#xff0c;它就像是在客戶端和服務器之間建立了一條"專用通道"&#xff0c;雙方可以隨時主動發送消息給對方&#xff0c;而不需要像HTTP那樣總是由客戶端發起請求。 同一時間、雙向…

微服務-19.什么是網關

一.網關曾經我們的項目是單體項目&#xff0c;前端只需要請求8080端口&#xff0c;就可以獲取所有需要的數據和服務并進行渲染。但是拆分成微服務后&#xff0c;會面臨幾大問題&#xff1a;1.但是現在我們將該單體項目拆分成了微服務項目&#xff0c;每個項目都有自己獨立的端口…

從字節碼層面剖析以太坊智能合約創建原理

1. 引言 閱讀完本文之后&#xff0c;將能理解一下字節碼含義&#xff1a; 608060405260405160893803806089833981016040819052601e916025565b600055603d565b600060208284031215603657600080fd5b5051919050565b603f80604a6000396000f3fe6080604052600080fdfea2646970667358221…

typora無需激活版及最新激活版方法!雙擊安裝就能用

介紹 Typora 是一款Markdown編輯器&#xff0c;支持實時預覽&#xff0c;所見即所得。跨平臺&#xff0c;支持Windows、macOS、Linux。適合寫作、筆記、技術文檔等。本教程將提供合法安全的安裝方案&#xff0c;并解決常見問題&#xff0c;助你高效完成部署&#xff01; 直接…

基于Java、GeoTools與PostGIS的對跖點求解研究

目錄 前言 一、對跖點簡介 1、地理學定義 2、人生哲學含義 二、對跖點求解 1、Java求解 2、Geotools求解 3、PostGIS求解 4、三種計算方法的對比 5、Leaflet展示對跖點 三、總結 前言 在地理信息系統&#xff08;GIS&#xff09;領域&#xff0c;對跖點&#xff08;A…

Linux-函數的使用-編寫監控腳本

Linux-函數的使用-編寫監控腳本前言一、監控cpu二、采集內存的使用信息三、采集磁盤和分區的使用信息四、顯示進程的信息前言 編寫監控腳本實現以下功能 監控cpu&#xff0c;內存&#xff0c;磁盤&#xff0c;進程等信息&#xff0c;每隔5分鐘記錄這些信息到日志文件里perform…

Authelia:開源雙因素認證與單點登錄解決方案

項目標題與描述 Authelia是一個開源的認證和授權服務器&#xff0c;專注于為應用程序提供雙因素認證&#xff08;2FA&#xff09;和單點登錄&#xff08;SSO&#xff09;功能。通過Web門戶&#xff0c;Authelia能夠作為身份和訪問管理&#xff08;IAM&#xff09;系統&#xff…

Apache Ozone 介紹與部署使用(最新版2.0.0)

目錄 一、軟件介紹 二、軟件架構 Ozone Manager&#xff08;OM&#xff09; Storage Container Manager&#xff08;SCM&#xff09; Containers Datanodes Storage Containers Recon Recon 和 Ozone Manager Recon 和 Storage Container Manager 三、安裝部署 準備…

Review --- Linux

Review — Linux Linux 是一種開源的類 Unix 操作系統內核&#xff0c;廣泛應用于服務器、嵌入式設備和個人計算機中。其核心特點是開源、穩定、安全和高度的可定制性。對于大學畢業生而言&#xff0c;掌握 Linux 的基本操作和原理是進入 IT 行業的重要技能之一。 Linux 的基本…

【msyql 】占用硬盤太大 ,那些文件可以清理

從目錄內容來看&#xff0c;這臺 MySQL 服務器上主要是 xxl-job 調度平臺的數據庫。占用空間最大的是&#xff1a;24G xxl_job_log.ibd這個文件是 xxl-job 的任務執行日志表&#xff0c;隨著時間推移&#xff0c;日志量會非常大。可以清理的文件和方法1. 清理 xxl_job_log 表數…

58 C++ 現代C++編程藝術7-模板友元

C 現代C編程藝術7-模板友元 文章目錄C 現代C編程藝術7-模板友元一、基礎應用場景 &#x1f9e9;1. 模板類聲明友元函數2. 普通類聲明模板函數為友元二、模板類互訪場景 ??1. 同類模板互訪&#xff08;一對一&#xff09;2. 異類模板互訪&#xff08;多對多&#xff09;三、高…

Undertow —— JBOSS 的社區版,redhat 下場維護的開源項目,頂頂好用的 Java web server

Undertow JBoss Community Undertow Undertow is a flexible performant web server written in java, providing both blocking and non-blocking API’s based on NIO. Undertow 是一個用 Java 編寫的靈活高性能 Web 服務器&#xff0c;提供基于 NIO 的阻塞和非阻塞 API。…

【AI智能體】Dify 搭建業務單據差異核對助手實戰詳解

目錄 一、前言 二、Dify介紹 2.1 Dify 是什么 2.2 Dify 核心特性 2.2.1 Dify特點 2.2.2 Dify 多模型支持 2.2.3 Dify 適應場景 2.2.4 基于Dify 搭建發票識別應用優勢 三、Dify 搭建業務單據核對助手實戰過程 3.1 前置準備 3.1.1 安裝必要的插件 3.2 完整操作步驟 3…

Centos編譯安裝Python3.10

gcc編譯源碼包 下載python源碼包并解壓 wget https://www.python.org/ftp/python/3.10.18/Python-3.10.18.tgz tar -xf Python-3.10.18.tgz cd Python-3.10.18系統編譯依賴環境安裝 sudo yum install zlib-devel ncurses-devel gdbm-devel nss-devel openssl-devel readline-de…