MongoDB分片原理及架構詳解
什么是MongoDB分片
MongoDB分片是指將數(shù)據(jù)庫拆分成多份,把它們分散到不同的機器上,從而實現(xiàn)不需要功能強大的服務器就可以存儲更多的數(shù)據(jù)和處理更多的請求。
MongoDB分片的基本思想就是將集合切分成小塊,這些塊分散到若干分片里面,每個分片只負責總數(shù)據(jù)的一部分。
對于應用程序來說,不必知道哪個分片對應哪些數(shù)據(jù),甚至不需要知道數(shù)據(jù)已經(jīng)被分片。當應用程序查詢數(shù)據(jù)時,只需要連接一個前置路由即可。這個前置路由通過查詢配置服務器獲取數(shù)據(jù)所在的目標分片,從而獲取目標數(shù)據(jù)。
MongoDB分片的目的
高數(shù)據(jù)量和吞吐量的數(shù)據(jù)庫應用會對單機的性能造成較大壓力,大的查詢量會將單機的CPU耗盡,大的數(shù)據(jù)量對單機的存儲壓力較大,最終會耗盡系統(tǒng)的內(nèi)存而將壓力轉移到磁盤IO上。
為了解決這些問題,有兩個基本的方法: 垂直擴展和水平擴展。
垂直擴展:增加更多的CPU和存儲資源來擴展容量。
水平擴展:將數(shù)據(jù)集分布在多個服務器上,水平擴展即分片。
分片為應對高吞吐量與大數(shù)據(jù)量提供了方法。使用分片減少了每個分片需要處理的請求數(shù),因此,通過水平擴展,集群可以提高自己的存儲容量和吞吐量。舉例來說,當插入一條數(shù)據(jù)時,應用只需要訪問存儲這條數(shù)據(jù)的分片。
使用分片減少了每個分片存儲的數(shù)據(jù)。例如,如果數(shù)據(jù)庫1TB的數(shù)據(jù)集,并有4個分片,然后每個分片可能僅持有256 GB的數(shù)據(jù)。如果有40個分片,那么每個切分可能只有25GB的數(shù)據(jù)。

MongoDB分片架構

MongoDB分片架構中,有三個角色:
Mongos :就是上面提到的路由器,是和客戶端打交道的模塊。Mongos本身沒有任何數(shù)據(jù),它也不知道該怎么處理這數(shù)據(jù),而是通過Config Server來獲??;
Config Server:配置服務器,所有Shard節(jié)點的信息、分片功能的一些配置信息都存儲在Config Server里,可以理解為真正數(shù)據(jù)的元數(shù)據(jù);
Sh
ard:真正數(shù)據(jù)存儲的位置,以Chunk為單位存儲。
Mongos本身并不持久化數(shù)據(jù),所有Shard集群的元數(shù)據(jù)都會存儲到Config Server里,而用戶的數(shù)據(jù)會分散存儲到各個Shard。Mongos啟動后,會從Config Server加載元數(shù)據(jù),開始提供服務,將用戶的請求正確路由到對應的分片上。
Shard Key
可以說,Shard Key(中文翻譯成片鍵)是MongoDB實現(xiàn)分片的依仗!
MongoDB中數(shù)據(jù)的分片以集合為基本單位,集合中的數(shù)據(jù)通過Shard Key被分成多部分。其實Shard Key就是在集合中選了一個鍵,用該鍵的值作為數(shù)據(jù)拆分的依據(jù)。
舉個例子,假設有個存儲人員信息的文檔集合,如果選擇名字"name"作為Shard Key,那么第一分片可能會存放名字以 A-F 開頭的文檔。第二分片存 G-P 開頭的文檔,第三分片存Q-Z的文檔。
一個好的Shard Key對分片至關重要。
有一點需要注意,一個自增的Shard Key對寫入和數(shù)據(jù)均勻分布不是很友好,因為自增的Shard Key總會在一個分片上寫入,后續(xù)達到某個閥值才可能會寫到別的分片上。但是反過來講,按Shard Key查詢(讀取)會非常高效。