時間:2024-03-08 08:50作者:下載吧人氣:22
前言
在MongoDB(版本 3.2.9)中,分片集群(sharded cluster)是一種水平擴展數據庫系統性能的方法,能夠將數據集分布式存儲在不同的分片(shard)上,每個分片只保存數據集的一部分,MongoDB保證各個分片之間不會有重復的數據,所有分片保存的數據之和就是完整的數據集。分片集群將數據集分布式存儲,能夠將負載分攤到多個分片上,每個分片只負責讀寫一部分數據,充分利用了各個shard的系統資源,提高數據庫系統的吞吐量。
數據集被拆分成數據塊(chunk),每個數據塊包含多個doc,數據塊分布式存儲在分片集群中。MongoDB負責追蹤數據塊在shard上的分布信息,每個分片存儲哪些數據塊,叫做分片的元數據,保存在config server上的數據庫 config中,一般使用3臺config server,所有config server中的config數據庫必須完全相同。通過mongos能夠直接訪問數據庫config,查看分片的元數據;mongo shell 提供 sh 輔助函數,能夠安全地查看分片集群的元數據信息。
對任何一個shard進行查詢,只會獲取collection在當前分片上的數據子集,不是整個數據集。Application 只需要連接到mongos,對其進行的讀寫操作,mongos自動將讀寫請求路由到相應的shard。MongoDB通過mongos將分片的底層實現對Application透明,在Application看來,訪問的是整個數據集。
一,主分片
在分片集群中,不是每個集合都會分布式存儲,只有使用sh.shardCollection()顯式將collection分片后,該集合才會分布式存儲在不同的shard中。對于非分片集合(un-sharded collection),其數據只會存儲在主分片(Primary shard)中,默認情況下,主分片是指數據庫最初創建的shard,用于存儲該數據庫中非分片集合的數據。每個數據庫都有一個主分片。
Each database in a sharded cluster has a primary shard that holds all the un-sharded collections for that database. Each database has its own primary shard.
例如,一個分片集群有三個分片:shard1,shard2,shard3,在分片shard1創建一個數據庫blog。如果將數據庫bolg分片,那么MongoDB會自動在shard2,shard3上創建一個結構相同的數據庫blog,數據庫blog的Primary Shard是Shard1。
圖示,Collection2的主分片是ShardA。
使用 movePrimary
命令變更數據庫默認的Primary shard,非分片集合將會從當前shard移動到新的主分片。
db.runCommand( { movePrimary : “test”, to : “shard0001” } )
網友評論