在Mongodb裏面存在另外一種集羣,就是分片技術,能夠知足MongoDB數據量大量增加的需求。前端
當MongoDB存儲海量的數據時,一臺機器可能不足以存儲數據,也可能不足以提供可接受的讀寫吞吐量。這時,咱們就能夠經過在多臺機器上分割數據,使得數據庫系統能存儲和處理更多的數據。linux
複製全部的寫入操做到主節點mongodb
延遲的敏感數據會在主節點查詢數據庫
單個副本集限制在12個節點vim
當請求量巨大時會出現內存不足。服務器
本地磁盤不足app
垂直擴展價格昂貴ide
MongoDB原理圖示:測試
上圖中主要有以下所述三個主要組件:優化
Shard:
用於存儲實際的數據塊,實際生產環境中一個shard server角色可由幾臺機器組個一個replica set承擔,防止主機單點故障
Config Server:
mongod實例,存儲了整個 ClusterMetadata,其中包括 chunk信息。
Query Routers:
前端路由,客戶端由此接入,且讓整個集羣看上去像單一數據庫,前端應用能夠透明使用。
MongoDB分片實驗步驟演示:
安裝配置MongoDB
yum install openssl-devel -y
tar zxvf mongodb-linux-x86_64-3.2.1.tgz -C /opt/
mv /opt/mongodb-linux-x86_64-3.2.1/ /usr/local/mongodb
優化命令
ln -s /usr/local/mongodb/bin/mongo /usr/bin/mongo
ln -s /usr/local/mongodb/bin/mongod /usr/bin/mongod
創建四臺分片羣集日誌文件和數據存儲路徑
mkdir -p /data/mongodb/mongodb{1,2,3,4}
mkdir -p /data/mongodb/logs
touch /data/mongodb/logs/mongodb{1,2,3,4}.log
chmod 777 /data/mongodb/logs/*.log
進程優化
ulimit -u 25000 #用戶最大進程數
ulimit -n 25000 #用戶可打開最大文件數量
配置三個主要組件
-----------------------配置config server------------------
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 //指定爲配置服務器
內存分攤:某節點內存不足時,從其餘節點分配內存
sysctl -w vm.zone_reclaim_mode=0
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
--------------------------配置shard server----------------------
配置shard1
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 #shard模式
配置shard2
cp -p mongodb2.conf mongodb3.conf
vim mongodb3.conf
port=47018
dbpath=/data/mongodb/mongodb3
logpath=/data/mongodb/logs/mongodb3.log
logappend=true
fork=true
maxConns=5000
storageEngine=mmapv1
shardsvr=true
啓動MongoDB
mongod -f mongodb1.conf
mongod -f mongodb2.conf
mongod -f mongodb3.conf
------------------------開啓路由模式-----------------
./mongos --port 27017 --fork --logpath=/usr/local/mongodb/bin/route.log --configdb 192.168.218.130:37017 --chunkSize 1
------------------------------啓動分片-------------------
mongo
sh.addShard("192.168.218.130:47017") #添加分片服務器
sh.addShard("192.168.218.130:47018")
mongos> use kgc #創建數據進行測試
mongos> for(var i=1;i<=10000;i++)db.users.insert({"id":i,"name":"tom"+i})
db.users.find().limit(5)
此時查看狀態,分片顯示false
sh.status()
databases:
{ "_id" : "kgc", "primary" : "shard0000", "partitioned" : false }
mongos> sh.enableSharding("kgc") #開啓庫分片
{ "ok" : 1 }
此時查看狀態,分片顯示true
sh.status()
databases:
{ "_id" : "kgc", "primary" : "shard0000", "partitioned" : true }
db.users.createIndex({"id":1}) #創建分片索引
"ok" : 1
sh.shardCollection("kgc.users",{"id":1}) #開啓表數據分片
{ "collectionsharded" : "kgc.users", "ok" : 1 }
此時查看狀態,可見詳細分片信息
sh.status()
{ "id" : { "$minKey" : 1 } } -->> { "id" : 4682 } on : shard0001 Timestamp(2, 0)
{ "id" : 4682 } -->> { "id" : 9364 } on : shard0000 Timestamp(2, 1)
{ "id" : 9364 } -->> { "id" : { "$maxKey" : 1 } } on : shard0000 Timestamp(1, 2)
-------------------------分片管理------------------------
添加標籤
mongos> sh.addShardTag("shard0000","shard00")
mongos> sh.addShardTag("shard0001","shard01")
sh.status()
{ "_id" : "shard0000", "host" : "192.168.218.130:47017", "tags" : [ "shard00" ] }
{ "_id" : "shard0001", "host" : "192.168.218.130:57017", "tags" : [ "shard01" ] }
查看分片信息
[root@localhost bin]# mongo --port 37017
use config
configsvr> show collections
db.databases.find() 查看是否分片
db.collections.find() 查看集合
db.chunks.find() 查看分片信息
刪除分片節點
use admin
db.runcommand({"removeshard":"192.168.218.130:67017")
sh.status()