什麼是MongoDB分片 MongoDB分片是指將資料庫拆分成多份,把它們分散到不同的機器上,從而實現不需要功能強大的伺服器就可以存儲更多的數據和處理更多的請求。 MongoDB分片的基本思想就是將集合切分成小塊,這些塊分散到若幹分片裡面,每個分片只負責總數據的一部分。 對於應用程式來說,不必知道哪 ...
什麼是MongoDB分片
MongoDB分片是指將資料庫拆分成多份,把它們分散到不同的機器上,從而實現不需要功能強大的伺服器就可以存儲更多的數據和處理更多的請求。
MongoDB分片的基本思想就是將集合切分成小塊,這些塊分散到若幹分片裡面,每個分片只負責總數據的一部分。
對於應用程式來說,不必知道哪個分片對應哪些數據,甚至不需要知道數據已經被分片。當應用程式查詢數據時,只需要連接一個前置路由即可。這個前置路由通過查詢配置伺服器獲取數據所在的目標分片,從而獲取目標數據。
MongoDB分片的目的
高數據量和吞吐量的資料庫應用會對單機的性能造成較大壓力,大的查詢量會將單機的CPU耗盡,大的數據量對單機的存儲壓力較大,最終會耗盡系統的記憶體而將壓力轉移到磁碟IO上。
為瞭解決這些問題,有兩個基本的方法: 垂直擴展和水平擴展。
垂直擴展:增加更多的CPU和存儲資源來擴展容量。
水平擴展:將數據集分佈在多個伺服器上,水平擴展即分片。
分片為應對高吞吐量與大數據量提供了方法。使用分片減少了每個分片需要處理的請求數,因此,通過水平擴展,集群可以提高自己的存儲容量和吞吐量。舉例來說,當插入一條數據時,應用只需要訪問存儲這條數據的分片。
使用分片減少了每個分片存儲的數據。例如,如果資料庫1TB的數據集,並有4個分片,然後每個分片可能僅持有256 GB的數據。如果有40個分片,那麼每個切分可能只有25GB的數據。
MongoDB分片架構
MongoDB分片架構中,有三個角色:
- Mongos :就是上面提到的路由器,是和客戶端打交道的模塊。Mongos本身沒有任何數據,它也不知道該怎麼處理這數據,而是通過Config Server來獲取;
- Config Server:配置伺服器,所有Shard節點的信息、分片功能的一些配置信息都存儲在Config Server里,可以理解為真正數據的元數據;
- Sh
ard:真正數據存儲的位置,以Chunk為單位存儲。
Mongos本身並不持久化數據,所有Shard集群的元數據都會存儲到Config Server里,而用戶的數據會分散存儲到各個Shard。Mongos啟動後,會從Config Server載入元數據,開始提供服務,將用戶的請求正確路由到對應的分片上。
Shard Key
可以說,Shard Key(中文翻譯成片鍵)是MongoDB實現分片的依仗!
MongoDB中數據的分片以集合為基本單位,集合中的數據通過Shard Key被分成多部分。其實Shard Key就是在集合中選了一個鍵,用該鍵的值作為數據拆分的依據。
舉個例子,假設有個存儲人員信息的文檔集合,如果選擇名字"name"作為Shard Key,那麼第一分片可能會存放名字以 A-F 開頭的文檔。第二分片存 G-P 開頭的文檔,第三分片存Q-Z的文檔。
一個好的Shard Key對分片至關重要。
有一點需要註意,一個自增的Shard Key對寫入和數據均勻分佈不是很友好,因為自增的Shard Key總會在一個分片上寫入,後續達到某個閥值才可能會寫到別的分片上。但是反過來講,按Shard Key查詢(讀取)會非常高效。