【MongoDB】Sharding分片概念及原理
面對海量的數據,如何提升數據讀寫效率?了解過DB的應該都知道數據庫的分區,分區是主要提升數據查詢的效率。面對海量數據的IO能力限制以及擴展性,Sharding是一個利器,我們不用關心具體的實現,從而實現性能的提升。
Sharding不是一門技術,而是一個理念,解決數據的水平擴展,突破單節點的IO限制。很多成熟的NoSQL以及NewSQL就自帶了sharding實現,使用者直接指定需要分片的字段,集群就可以自行分片了。
sharding是share nothing的簡寫,在不同的片區,數據互不干擾。和傳統的分區不同,數據庫分區是物理數據庫實現的技術,目的是為了在操作數據庫時減少SQL設計的讀寫范圍,提升讀數據的時間。sharding是面對分布式的存儲,將查詢進行并行處理。
sharding是負責數據的一個子集中一臺或多臺服務器,如果有多臺服務器,每一臺服務器都是一個數據的副本,通常我們在replica set中可以設定副本數。一般來說,在定義了分片key字段后,sharding有三種方式:
按號段
hash取模
用戶自定義
很多nosql和newSQL已經實現了sharding技術,下面以MongoDB和Mysql cluster為例來詳細介紹。
MongoDB
在指定了分片字段(shard key)后,mongoDB集群會將數據自行進行分區,通過數據量進行分片。同時他會對每一分片進行區間劃分,每一區間又各自存儲不同范圍的數據。這么做目的是為了進行數據的合理轉移,減少因為大數據量的轉移帶來的網絡開銷,影響使用。通常塊定義大小是200M,定義過大,會導致移動數據大帶來的網絡開銷,過小,又會帶來管理開銷。
mongoDB在移動數據使之達到平衡的工作,由一個平衡器進程來做,自動化完成,你無需關心其中細節。平衡器的目標不僅是平衡,還需要最小化遷移量。
用戶不會直接的訪問mongo分片,二是通過mongoDB的終端mongos來訪問,其會轉移所有的請求到對應的分片,而所有的配置,都保存在mongod配置服務器上,mongod是輕量的進程,通常可以運行在任何的mongo集群服務器上。
使用mongo集群需要注意對數據的統計,如果一個分片移動正在進行,那么在兩個分片都會保存該數據,直到移動完成,才會在原有分片上將數據刪除。所以如果分片不合理造成頻繁的移動,那么極有可能是統計出很多多余的數據。
另外,如果需要對數據超過一個字段進行唯一性驗證,通常我們設置了一個字段索引,并按照該字段索引進行分片,這時針對另外一個需要唯一性的字段,寫入時必須要檢測是否已經存在,假設有兩個應用程序進程,同時檢測,這時會得到都沒有的結果,然后同時寫入,導致重復字段。解決的方式是必須在寫前對所有集群加鎖,但會嚴重影響集群的性能。
總結
以上是生活随笔為你收集整理的【MongoDB】Sharding分片概念及原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASP.NET Core开发常见“坑”
- 下一篇: SQLServer 查看耗时较多的SQL