簡介
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,阻塞複製