雲計算Shard 分片集群解析

2021-12-30 10:31:19 字數 3440 閱讀 2520

要構建乙個 mongodb sharding cluster,需要三種角色:

shard server

即儲存實際資料的分片,每個shard可以是乙個mongod例項,也可以是一組mongod例項構成的replication set。為了實現每個shard內部的auto-failover(自動故障切換),mongodb官方建議每個shard為一組replica set。

config server

為了將乙個特定的collection儲存在多個shard中,需要為該collection指定乙個shard key(片鍵),例如 ,shard key可以決定該條記錄屬於哪個chunk(分片是以chunk為單位,後續會介紹)。config servers就是用來儲存:所有shard節點的配置資訊、每個chunk的shard key範圍、chunk在各shard的分布情況、該集群中所有db和collection的sharding配置資訊。

route process

這是乙個前端路由,客戶端由此接入,然後詢問config servers需要到哪個shard上查詢或儲存記錄,再連線相應的shard進行操作,最後將結果返回給客戶端。客戶端只需要將原本發給mongod的查詢或更新請求原封不動地發給routing process,而不必關心所操作的記錄儲存在哪個shard上。(所有操作在mongos上操作即可)

下面我們在同一臺物理機器上構建乙個簡單的 sharding cluster:

mkdir -p ./data/shard/s0 ./data/shard/s1 #建立資料目錄

mkdir -p ./data/shard/log # 建立日誌目錄

./bin/mongod --port 27017 --dbpath /usr/local/mongodb/data/shard/s0 --fork --logpath /usr/local/mongodb/data/shard/log/s0.log # 啟動shard server例項1

./bin/mongod --port 27018 --dbpath /usr/local/mongodb/data/shard/s1 --fork --logpath /usr/local/mongodb/data/shard/log/s1.log # 啟動shard server例項2

mkdir -p ./data/shard/config #建立資料目錄

./bin/mongod --port 27027 --dbpath /usr/local/mongodb/data/shard/config --fork --logpath /usr/local/mongodb/data/shard/log/config.log #啟動config server例項

注意,這裡我們完全可以像啟動普通mongodb服務一樣啟動,不需要新增—shardsvr和configsvr引數。因為這兩個引數的作用就是改變啟動埠的,所以我們自行指定了埠就可以

./bin/mongos --port 4000 --configdb localhost:27027 --fork --logpath /usr/local/mongodb/data/shard/log/route.log --chunksize=1 # 啟動route server例項mongos啟動引數中,chunksize這一項是用來指定chunk的大小的,單位是mb,預設大小為200mb,為了方便測試sharding效果,我們把chunksize指定為 1mb。意思是當這個分片中插入的資料大於1m時開始進行資料轉移

# 我們使用mongodb shell登入到mongos,新增shard節點

./bin/mongo admin --port 40000 #此操作需要連線admin庫

> db.runcommand() #新增 shard server 或者用 sh.addshard()命令來新增,下同;

> db.runcommand()

> db.runcommand() #設定分片儲存的資料庫

> db.runcommand(}) # 設定分片的集合名稱。且必須指定shard key,系統會自動建立索引,然後根據這個shard key來計算

> sh.status(); #檢視片的狀態

> printshardingstatus(db.getsisterdb("config"),1); # 檢視片狀態(完整版);

> db.stats(); # 檢視所有的分片伺服器狀態

注意這裡我們要注意片鍵的選擇,選擇片鍵時需要根據具體業務的資料形態來選擇,切不可隨意選擇,實際中尤其不要輕易選擇自增_id作為片鍵,除非你很清楚你這麼做的目的,具體原因我不在此分析,根據經驗推薦一種較合理的片鍵方式,「自增字段+查詢字段」,沒錯,片鍵可以是多個欄位的組合。

另外這裡說明一點,分片的機制:mongodb不是從單篇文件的級別,絕對平均的散落在各個片上, 而是n篇文件,形成乙個塊"chunk",優先放在某個片上, 當這片上的chunk,比另乙個片的chunk區別比較大時(>=3) ,會把本片上的chunk,移到另乙個片上, 以chunk為單位,維護片之間的資料均衡。

也就是說,一開始插入資料時,資料是只插入到其中一塊分片上的,插入完畢後,mongodb內部開始在各片之間進行資料的移動,這個過程可能不是立即的,mongodb足夠智慧型會根據當前負載決定是立即進行移動還是稍後移動。

在插入資料後,立馬執行db.users.stats();兩次可以驗證如上所說。

這種分片機制,節省了人工維護成本,但是由於其是優先往某個片上插入,等到chunk失衡時,再移動chunk,並且隨著資料的增多,shard的例項之間,有chunk來回移動的現象,這將會為伺服器帶來很大的io開銷,解決這種開銷的方法,就是手動預先分片;

以shop.user表為例

sh.shardcollection(『shop.user』,); # user錶用userid做shard key

for(var i=1;i<=40;i++) ) } # 預先在1k 2k...40k這樣的界限切好chunk(雖然chunk是空的), 這些chunk將會均勻移動到各片上.

通過mongos新增user資料. 資料會新增到預先分配好的chunk上, chunk就不會來回移動了.

一般mongodb如果真的到了分片的級別後,那片伺服器避無可免的要用到複製集,部署的基本思路同上,只需要注意兩點:

sh.addshard( host ) server:port or setname/server:port # 如果是複製集的片伺服器,我們應該複製集的名稱寫在前面比如

sh.addshard('ras/192.168.42.168:27017'); # 27017也就是複製集中的primary

另外在啟動本機的mongod服務的時候,最好把ip也給寫進去,否則有可能會有不可預知的錯誤;

雲計算 Ubuntu DNS配置 可用集群入口

一台伺服器和若干pc組成的簡單區域網。伺服器安裝ubuntu server,開啟dns服務。伺服器的ip 10.82.82.22 目標 能夠將dns.yjs.cf解析成10.82.82.22 能夠將10.82.82.22解析成dns.yjs.cf 原理 實質上是配置兩個對映檔案,為了能夠找到兩個對映...

雲計算HDFS1 0解析

雲計算hdfs1.0解析。1 本質hdfs hadoop distributed?file?system 是一種適合執行在通用檔案上的分布式檔案系統架構圖 2 特點 儲存並管理pb資料 處理非結構化資料 高度容錯 write once read many訪問模式 無資料一致性問題 不適合做 儲存小檔...

雲計算 分布式計算 平行計算 網格計算 集群

平行計算 平行計算是相對於序列計算來說的。可分為時間上的並行和空間上的並行。時間上的並行就是指流水線技術。而空間上的並行則是指用多個處理器併發的執行計算。比如基於cuda程式設計。平行計算的目的就是提供單處理器無法提供的效能 處理器能力或儲存器 使用多處理器求解單個問題。總結 並行的主體 處理器。程...