數據庫應用——MongoDB分片

                                                         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})}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章