在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()