MongoDB分片 在部署和維護管理 中常見事項的總結


分片(sharding是MongoDB將大型集合分割到不同服務器(或者說集群)上所采用的方法,主要為應對高吞吐量與大數據量的應用場景提供了方法。

和既有的分庫分表、分區方案相比,MongoDB的最大區別在於它幾乎能自動完成所有事情,只要告訴MongoDB要分配數據,它就能自動維護數據在不同服務器之間的均衡。

 

一. 分片的集群組件

 

 

1.Mongos 【路由】  

作為請求的訪問入口,所有的請求都由mongos來路由、分發、合並,這些動作對客戶端driver透明,用戶連接mongos就像連接mongod一樣使用。Mongos會根據請求類型及shard key將請求路由到對應的Shard。

2.Config Server  【配置服務器】  

 存儲Sharding Cluster 的所有元數據,所有的元數據都存儲在config數據庫;

*保存每個分片上的chunk的信息 * 保存chunk上的片鍵范圍。

3. Shard  【分片】 

存儲應用數據記錄。

 

二. 分片優勢

1.對集群進行抽象,讓集群“不可見”,分片對應用系統是透明的。

Mongos是專有路由進程,其會將客戶端發來的請求准確無誤的路由到集群中的一個或者一組服務器上,同時會把接收到的響應拼裝起來發回到客戶端。

2.保證集群總是可讀寫

將MongoDB的分片和復制集功能結合使用,在確保數據分片到多台服務器的同時,也確保了每分數據都有相應的備份,可以確保有服務器壞掉時,其他的從庫可以立即接替壞掉的部分繼續工作。提高了集群的可用性和可靠性。

3.使集群易於擴展

當系統需要更多的空間和資源的時候,MongoDB使我們可以按需方便的擴充系統容量。

 

 三. 分片部署注意事項(常見錯誤)

 

1.配置可復制集作為分片節點與配置單獨使用的可復制集基本一樣。但啟動參數中需指定—shardsvr參數。

   否則,在啟動數據庫分片時報錯:{"code" : 193,"ok" : 0, "errmsg" : "Cannot accept sharding commands if not started with --shardsvr“}。

2.創建配置服務器集群時,不能設置見證節點。

   否則,報錯 "errmsg" : "Arbiters are not allowed in replica set configurations being used for config servers"。

3.配置Mongos 實例時,請不要配置dbpath參數。

   否則,設置dbpath參數,服務無法正常啟動,報錯:Error parsing INI config file: unrecognised option 'dbpath'。

4.配置Mongos 實例時,需設置Keyfile。

   否則,不設置Keyfile,Service無法正常啟動, 報錯:2018-05-10T15:30:26.791+0800 W SHARDING [mongosMain] Error initializing sharding state, sleeping for 2 seconds and trying again :: caused by :: Unauthorized: Error loading clusterID :: caused by :: not authorized on config to execute command { find: “version”, readConcern: { level: “majority”, afterOpTime: { ts: Timestamp 1525937413000|2, t: 1 } }, maxTimeMS: 30000 

5.分片集合設置。

   分片不會默認生成,需要先在數據庫中啟動分片(sh.enableSharding(“DBName”)),然后再設置集合分片(sh.shardCollection(“Collection”{片鍵}))

 

四. 分片管理的注意事項(常用命令)

1.檢查shards 配置及狀態  

db.runCommand({listshards:1})

2. 檢查數據庫主片的地址以及是否分區

db.getSiblingDB("config").databases.find()

3. 檢查數據塊的數量

db.chunks.count()  --需切換到配置數據庫(config

4. 查看分片的詳細信息,包括數據庫信息和范圍信息 

sh.status()

5. 索引是優化查詢性能的重要手段。當在分片集合上聲明索引時,每個分片都會為自己的集合部分定義單獨的索引。分片集合只允許在_id字段和分片鍵上建立唯一索引。

6. 分割和遷移 MongoDB底層依賴2個機制來保持集群的平衡:分割和遷移。

分割是把一個大的數據塊分割為2個更小的數據塊的過程。遷移就是在分片之間移動數據塊的過程。當某些分片服務器包含的數據塊數據量大大超過其他分片服務器時就會觸發遷移的過程,這個觸發器叫做遷移回合(migration round)

     6.1 遷移觸發條件

     

     6.2 查看Balancer 進程是否開啟 sh.getBalancerState()

     6.3 停Balancer 進程 sh.stopBalancer()開啟Balancer 進程

           

     6.4. 默認情況下 Balancer 進程一直在運行,為了降低Balancer進程對系統的運行,可以為Balancer進程設置運行時間窗口,讓Balancer進程在指定的時間窗口操作。

            6.4.1 例如設置Balancer進程在23:00到6:00時間窗口內執行。db.settings.update({ _id : "balancer" }, { $set : { activeWindow : { start : "23:00", stop : "6:00" } } }, true )  ;

           

            6.4.2 刪除Balancer進程運行時間窗口

            

       6.5. 查看塊的范圍

             6.5.1 如果集合數據量較小,可以直接通過sh.status()查看

            6.5.2 如果集合數據量較大,sh.status()無法反應此集合的分塊信息。此時,可通過執行以下命令查看printShardingStatus(db.getSisterDB("config"),1);

            6.5.3 也可將命令切換到config數據庫下,執行db.chunks.find()查看。可以輸入制定參數,例如,查看分片repsms2,集合cloud-docs.PushMessageRecord的塊情況(cloud-docs為數據庫名稱)

                    db.chunks.find({"shard" : "repsms2","ns" : "cloud-docs.PushMessageRecord"}).pretty()

 

五. 備注

         分片集群管理的數據量比較大,並且分片的架構相對比較復雜。所以,一定在業務需求需要上分片時,再上分片,且不可准求“炫”的技術而上分片。另外,上線后,相關的監控一定要部署,逐漸完善。

 

本文版權歸作者所有,未經作者同意不得轉載,謝謝配合!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM