MongoDB分片
一、MongoDB分片概述
1、什麼是分片
高數據量和吞吐率的數據庫應用會對單擊性能造成較大壓力,大查詢會耗盡CPU,大數據會耗盡內存而將壓力轉移到硬盤上
分片是使用多個服務器存儲數據的方法,以支持巨大的數據存儲和對數據進行操作。
2、分片優勢
分片爲應對高吞吐量與大數據提供了方法
(1)使用分片減少了每個分片需要處理的請求數,通過水平擴展,集羣可以提高自己的存儲量和吞吐量
(2)使用分片減少了每個分片存儲的數據
(3)優勢:提供類似線性增長的架構、提高數據可用性,提高大型數據庫查詢服務器的性能。
3、分片集羣的組成
MongoDB分片集羣主要有三個組件
(1)Shard:分片服務器,用於存儲實際的數據塊,實際生產環境中一個shard server角色可由幾臺服務器組成一個Replica Set承擔,防止主機單點故障
(2)Config Server:配置服務器,存儲了整個分片集羣的配置信息,其中包括chunk信息
(3)Routers:前端路由,客戶端由此接入,且讓整個集羣看上去像單一數據庫,前端應用可以透明使用
二、部署MongoDB分片集羣
1、部署:
(1)集羣配置
①1臺路由實例:27017
②1臺配置實例:37017
③2臺Shard實例:47017/47018
(2)部署配置服務器
①編輯mongodb1.conf文件
1)port=37017
2)configsvr=ture
3)啓動服務
(3)部署分片服務器
①編輯mongodb2.conf和3.conf
1)port=47017/47018
2)shardsvr=ture
3)啓動服務
(4)啓動路由服務器
①mongos --port 27017 --fork --logpath=/usr/local/mongodb/bin/route.log --configdb 192.168.11.101:37017 --chunkSize 1
(5)啓用分片服務器
①登錄路由實例後可用sh.status()查看分片狀態信息
②添加分片服務器:sh.addShard(“192.168.11.101:47017”)
2、實現分片功能
(1)啓用test數據庫分片:sh.enableSharding(“test”)
(2)添加索引:db.testtable.createIndex({“pid”:1})
(3)分片:sh.shardCollection(“test.testtable”,{“pid”:1})
三、MongoDB分片管理
1、片鍵的選擇
(1)針對自動增長ID列分片
數據大多順序插入到一個分片上,可以提供無限數量的分片,但可能導致單一且不可分散的熱點。
(2)針對低基數的列分片
由於字段值有限,導致分片有限
(3)針對隨機數的列分片
可以有效分散熱點,但數據越大,性能越差
2、分片的維護
(1)查看分片狀態信息
使用db.sales.stats()可以查看sales集合的分片信息
(2)給分片添加標籤
可使用db.addShardTag()命令給分片添加一個標籤
(3)連接配置服務器
配置服務器存儲了分片的詳細信息,可使用db.chunks.findOne()查詢
(4)添加或刪除sharding server
①配置sharding server後通過sh.addShard()命令添加
②刪除:db.runCommand({“removeshard”:”192.168.11.101:27014”})
四、手動分片及平衡器
1、平衡器
(1)當Mongos成爲均衡器之後,判斷各個分片中使用塊的數量,不關心數據量的大小。只有在分片數量不對稱的時候,纔會啓動。移動過程發生在塊數最大與最小的分片之間。
(2)查詢平衡器狀態:sh.getBalancerState()
(3)設置平衡器狀態:sh.setBalancerState(false)
(4)限制平衡器運行時間段:
db.settings.update({"_id":"balancer"},"$set":{"activeWindow":{"start":"23:00","stop":"04:00"}}),true)
2、手動預分片
(1)手動分片不需要給表設置索引,直接:sh.shardCollection('kgc.user',{user_id:1})
(2)手動分片:sh.splitAt(數據庫.集合,{分割策略})
for(var i=1;i<=10;i++){sh.splitAt('kgc1.user',{user_id:i*1000})}