MongoDB分片概述
什麼是分片
- 高數據量和吞吐量的數據庫對單機的性能造成較大的壓力,大的查詢 量會將單機的CPU耗盡,大的數據對單機的儲存壓力較大,最終會耗盡系統的內存而將壓力轉移到磁盤IO上。
- MongoDB分片是使用多個服務器存儲數據的方法,以支持巨大的數據庫存儲和對數據進行操作。分片技術可以滿足MongoDB數據大量增長的需求,當一MongoDB服務器不足以存儲海量數據或不足以提供可接受的讀寫吞吐量時,我們就可以通過在多臺服務器上分割數據,使得數據庫系統能存儲和處理更多的數據。
MongoDB分片優勢
- 分片爲應對高吞吐量與大數據量提供了方法。
- 1)、使分片減少了每個分片需要處理的請求數,因此,通過水平擴展,羣集可以提高自己的存儲容量和吞吐量。比如,當插入一條數據時,應用只需要訪問存儲這條數據的分片。
- 2)、使用分片減少每一個分片存儲的數據。
- 分片的優勢在於提供類似線性的架構,提高數據可用性,提高大型數據庫查詢服務器的性能。當MongoDB單點數據庫服務器存儲成爲瓶頸、單點數據庫服務器的性能成爲瓶頸或者需要部署大型應用以充分利用內存時,可以使用分片技術。
MongoDB分片羣集組成
- MongoDB分片羣集主要有如下三個主要組件:
- 1)、Shard:分片服務器,用於存儲實際的數據塊,實際生產環境中一個shard server角色可由幾臺服務器組成一個Replica Set 承擔,防止主機節點故障。
- 2)、Config Server:配置服務器,存儲了整個分片羣集的配置信息,其中包括chunk信息。
- 3)、Routers:前端路由,客戶端由此接入,且讓整個羣集看上去像單一數據庫,前端應用可以透明使用。
分片羣集的簡單部署
-
在一臺物理服務器上部署一個簡單結構的MongoDB分片羣集:
1臺路由實例(端口27017)。
1臺配置實例(端口37017)。
3臺Shard實例(端口47017、47018、47019)。
1、安裝MongoDB 3.2
yum install openssl-devel -y
tar zxvf /opt/abc/mongodb-linux-x86_64-3.2.1.tgz -C /opt/ #將掛載的壓縮包解壓縮
cd /opt
mv mongodb-linux-x86_64-3.2.1/ /usr/local/mongodb
mkdir -p /data/mongodb/mongodb{1,2,3,4} #數據存儲目錄
mkdir /data/mongodb/logs #日誌文件存儲目錄
touch /data/mongodb/logs/mongodb{1,2,3,4}.log #日誌文件
chmod -R 777 /data/mongodb/logs/*.log
ulimit -n 25000 #最多打開文件個數,重啓後失效
ulimit -u 25000 #最多打開進程數,重啓後失效
2、配置服務器
cd /usr/local/mongodb/bin/
vim mongodb1.conf
port=37017 #端口號
dbpath=/data/mongodb/mongodb1 #數據存儲目錄
logpath=/data/mongodb/logs/mongodb1.log #日誌文件存儲目錄
logappend=true
fork=true
maxConns=5000
storageEngine=mmapv1
configsvr=true #配置成配置服務器
3、分片服務器
- 三臺分片服務器配置相同,只需更改端口號、數據存儲目錄和日誌存儲目錄即可;
cp -p mongodb1.conf mongodb2.conf
vim mongodb2.conf
port=47017 #端口號
dbpath=/data/mongodb/mongodb2 #數據存儲目錄
logpath=/data/mongodb/logs/mongodb2.log #日誌文件存儲目錄
logappend=true
fork=true
maxConns=5000
storageEngine=mmapv1
shardsvr=true #配置成分片服務器
- 啓動服務器
ln -s /usr/local/mongodb/bin/mongo /usr/bin/mongo
ln -s /usr/local/mongodb/bin/mongod /usr/bin/mongod
mongod -f /etc/mongod1.conf
mongod -f /etc/mongod2.conf
mongod -f /etc/mongod3.conf
mongod -f /etc/mongod4.conf
4、啓動路由服務器
./mongos --port 27017 --fork --logpath=/usr/local/mongodb/bin/route.log --configdb 192.168.27.153:37017 --chunkSize 1
#--port指定對方連接入口
#--fork後臺運行
#--logpath指定日誌文件存儲路徑
#--configdb指定給誰處理
5、啓用分片服務器
mongo
sh.addShard("192.168.27.153:47017")
sh.addShard("192.168.27.153:47018")
sh.status()
6、啓用分片存儲功能
use kgc
for (var i=1;i<=50000;i++)db.users.insert({"id":i,"name":"zhangsan"+i})
db.users.createIndex({"id":1}) #對users表創建索引
sh.enableSharding("kgc") #啓用kgc數據庫分片
sh.shardCollection("kgc.users",{"id":1}) #表分片
sh.status()
7、給分片添加標籤
sh.addShardTag("shard0000","test01")
sh.addShardTag("shard0001","test02")
sh.status()
8、添加或刪除分片服務器
- 1)、添加分片服務器
mongo #進入路由服務器
sh.addShard("192.168.27.153:47019")
sh.status()
- 2)、刪除分片服務器
use admin
db.runCommand({"removeshard":"192.168.27.153:47019"})
sh.status()