2015年6月17日 星期三

【MongoDB】Sharding Introduction

Sharding Introduction

Sharding是用於跨多個機器儲存時的一種技術。MongoDB使用Sharding支援部署大量資料集,及高存取流量操作。

Purpose of Sharding

應用程式在處理大資料集跟高存取量時,對單一Service上的資料庫系統,是一個很高的挑戰。
高查詢率會消耗CPU資源,大資料集所需容量,超過單一機器所能負荷。執行時的記憶體使用量,超過單一機器所能提供,進而挑戰機器的disk I/O。為了解決上述問題,資料庫系統有2個基本方法,重直擴展【 vertical scaling和【sharding.
重直擴展Vertical scaling):增加CPU及增加Storage的容量,但這些都是有極限的。高效率的系統有大量的cup及 高記憶體,比小系統的成本還高。另外雲端系統供應商也許只提供使用者,小的instance,依照這個結論,重直擴展是有它最大的極限。
碎片化(Sharding):也可稱為水平擴展,分割的資料集及分散的資料,被存在數個不同的Service上或shard上,每一個碎片(shard)都是一個獨立的資料庫跟集合體,數個shards可以組成一個邏輯資料庫(logical database



  • 碎片化(Sharding)可以減少對每一個shard的操作,以新增為例新增資料應用程式只需要,存取某個記錄的shard

  • 碎片化(Sharding)可以減少每Server所需的stroage。以1TB的資料為例,可以存在4shardshard只需用256GB,如果有40shard只需要25GB.

Sharding in MongoDB

MongoDBsharding是透過shared Clusterconfiguration來實作。


  Sharded Cluster有幾元件組成:shardsquery routers config Servers.
碎片組(Shards):用來儲存資料。提供高可用度及一致性的資料。在正式環境中,Sharded Cluster裡的每一個shard(碎片),都是一個複製資料集
Query Routers:也可稱為 mongos instances,透過client Application及直接操作去佔用一個或多個碎片(Shard)。查詢程序或操作特定shards(碎片組)進而回傳結果會client。一個shared Cluster會包含多個Query Router去分開執行一個Client所發出的Request1client可以發出多個request給1個query Router。多數的shared clusters會有多有個query router.
Config servers:存放clustermetadata。包括cluster中的資料集與shards的對照,Query Router用這些matadata去操作做特定的shards。正式的shared cluster會有3個config Server

Data Partitioning

MongoDB是以collection層級,做分散資料或碎化(shards)。利用shard key達到碎化(shard)一個collection中的資料。

Shard Keys

碎化(shard)一個collection,需要去找出shard keyShard key會是index欄位或是一個複合式index而這個複合index存在每一個documentMongoDb劃分shard key值並將值寫入數個chunk而且分在數個不同的Shards。劃分shard key值,MongoDb使用range based partitioning or hash based partitioning其中一種方式。

Range Based Sharding


Hash Based Sharding


Splitting

Splitting是一支background Service,當一個chunk成長到specified chunk size的設定值時,會自動一分為二。

Balancing

balancer這支background service會去管理chkunk的搬移。當碎化(Shard)collectioncluster分配不平均時,blanacer會從最多chunkshard搬移chunk至最少的shard,直到整個collect平均為止。

Adding and Removing Shards from the Cluster

新增1shardcluster,因為shard沒有chunk,導致shard分配不平均。MongoDB會開始馬上搬資料到新的shard,這個動作會花一些時間,直到cluster達到平均的狀態。
刪除1個shard會先將其中的所有chunk搬到其它的shard,直到全部搬完及更新metadata後,才可以移除shard

沒有留言:

張貼留言