《MongoDB權威指南》學習整理----MongoDB分片

簡介

MongoDB的分片和複製都是MongoDB爲了提供大數據高負載爲我們提供的提高性能的方式。兩者都是使用類似集羣(多個節點)的方式部署。不同之處在於,副本集中所有節點的存儲的數據時一致的。而分片中的每個節點存儲的數據一般都是不同的,類似於關係數據庫中的水平切分,或DB2中的分區表。而且和複製一樣,MongoDB可以自動化的處理分片、負載均衡,當然也可以人爲的手動分片。

分片說明

上文提到過,分片的基本思想是類似於水平切分,即根據集合中文檔的某個key將整個集合切分爲多個結構相同,值不同的集合並將他們分佈式的部署到多個mongoDB實例中。

當不使用分片的時候,與應用程序交互的MongoDB進程是mongod,當使用分片之後,與應用程序交互的是mongos進程,mongos下邊是多個mongod進程。而mongos、mongod對於應用程序來看都是一樣的。沒有區別。

片鍵

設置分片的時候,需要從集合文檔中選擇一個key,該key作爲對集合的分片依據,同時該key稱爲片鍵。

片鍵的選擇

片鍵的選擇決定了插入到集合的數據分佈,而我們最期望的是均衡的分佈片鍵,所以在選擇片鍵的時候我們需要認真考慮。

片鍵一般都是索引。

片鍵的選擇應遵循以下幾條規則:

  • 不選取小基數片鍵
  • 不選取具有明顯升、降序特徵的片鍵,例如時間
  • 不選取隨機片鍵

詳細的片鍵選擇,可以參閱《深入學習MongoDB》一書。

片鍵對查詢的影響

如果對key1分片,那麼在查詢的時候如果按key1爲條件查詢,那麼可以很好的利用分片,但是如果沒有將key1作爲查詢條件,那麼所有的分片都會被查詢,低效。

片就是保存子集合的容器,可以是集羣中的某個mongod實例,也可以是一個副本集。所以每個片中只能有一臺活躍(主)服務器。

Mongos

mongos是分片中的路由進程,負責與應用程序直接交互,分發客戶端請求,並將結果聚合後返回。它本身並不保存數據。

配置服務器

配置服務器存儲了分片集羣的配置信息:數據和片的對應關係。mongos進程會緩存、同步配置服務器的配置信息。同時,配置服務器並不需要很多空間和資源。

創建分片

啓動服務器

  • 首先啓動配置服務器:

mongod --dbpath 數據目錄 --port 端口號

  • 啓動mongos路由進程,mongos路由進程不需要數據目錄,只需要指定配置服務器鏈接:

mongos --port 端口號 --configdb ip:port

  • 啓動所有分片實例:

mongod --dbpath 數據目錄 --prot 端口號

  • 將分片實例添加到集羣中:

登錄shell,鏈接mongos進程,使用db.funCommand({addShard:'IP:PORT',allowLocal:true})

上邊的allowLocal屬性只有在開發環境,也就是單機多個MongoDB實例的時候纔會使用,生產中一般不會使用

  • 開啓數據庫分片功能

使用db.runCommand({'enablesharding':數據庫名})

  • 設定片鍵

使用db.runCommand({'shardcollection':'集合名稱','key':{key名稱:1}})

生產環境配置

上邊的操作是在開發環境中的分片配置,但是在生產環境中,需要更加健壯、穩定的配置。需要滿足一下條件:

  • 多個配置服務器。
  • 多個mongos服務器
  • 每個片都是一個副本集
  • 正確設置w,阻塞複製
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章