简介
高数据量和吞吐量的数据库应用会对单机的性能造成较大压力,大的查询量会将单机的CPU耗尽,大的数据量对单机的存储压力较大,最终会耗尽系统的内存而将压力转移到磁盘IO上
MongoDB分片是使用多个服务器存储数据的方法,以支持巨大的数据存储和对数据进行操作。分片技术可以满足MongoDB数据量大量增长的需求,当一台MongoDB服务器不足以存储海量数据或不足以提供可接受的读写吞吐量时,可以通过在多台服务器上分割数据,使得数据库系统能存储和处理更多的数据
分片优势
分片为应对高吞吐量与大数据量提供了方法
- 使用分片减少了每个分片需要处理的请求数,因此,通过水平扩展,群集可以提高自己的存储容量和吞吐量。比如,当插入一条数据时,应用只需要访问存储这条数据的分片
- 使用分片减少每个分片存储的数据
分片的优势在于提供类似线性增长的架构,提高数据可用性,提高大型数据库查询服务器的性能。当MongoDB单点数据库服务器存储成为瓶颈、单点数据库服务器的性能成为瓶颈或者需要部署大型应用以充分利用内存时,可以使用分片技术
MongoDB分片群集主要三个组件
Shard:分片服务器,用于存储实际的数据块,实际生产环境中一个shard server 角色可以由几台服务器组成一个Peplica Set 承担,防止主机单点故障。
Config Server:配置服务器,存储了整个分片群集的配置信息,其中包括chunk信息。
Routers:前端路由,客户端由此接入,且让整个群集看上去像单一数据库,前端应用可以透明使用。
一、源码安装MongoDB
1、安装相关依赖包
[root@localhost ~]# yum -y install gcc gcc-c++ openssl-devel
2、解压MongoDB
[root@localhost ~]# tar xvfz mongodb-linux-x86_64-3.2.1.tgz #免配置,免编译
[root@localhost ~]# mv mongodb-linux-x86_64-3.2.1 /usr/local/mongodb
3、创建相关实例目录及其文件
[root@localhost ~]# cd /usr/local/mongodb/
[root@localhost mongodb]# mkdir etc #创建配置文件目录
[root@localhost mongodb]# mkdir log #创建日志文件目录
[root@localhost ~]# mkdir -p /usr/local/mongodb/data/mongodb1 #创建相关数据目录
[root@localhost ~]# mkdir -p /usr/local/mongodb/data/mongodb2
[root@localhost ~]# mkdir -p /usr/local/mongodb/data/mongodb3
[root@localhost ~]# mkdir -p /usr/local/mongodb/data/mongodb4
[root@localhost ~]# touch /usr/local/mongodb/etc/mongodb{1,2,3,4}.conf #创建配置文件
[root@localhost ~]# touch /usr/local/mongodb/log/mongodb{1,2,3,4}.log #创建日志文件
[root@localhost ~]# chmod 777 /usr/local/mongodb/log/*.log #修改日志权限
4、修改内核资源限制
ulimit -n 25000 #指定同一时间最多可开启的文件数
ulimit -u 25000 #用户最多可开启的程序数目
5、优化路径
[root@localhost ~]# ln -s /usr/local/mongodb/etc/ /etc/
[root@localhost ~]# ln -s /usr/local/mongodb/bin/ /usr/bin/
6、修改主配置文件
[root@localhost ~]# vim /etc/mongodb1.conf
port=37017
dbpath=/usr/local/mongodb/data/mongodb1
logpath=/usr/local/mongodb/log/mongodb1.log
logappend=true #日志追加
fork=true #工作模式
maxConns=5000 #最大连接数
storageEngine=mmapv1 #存储引擎
configsvr=true #指定配置服务器角色
7、启动服务
[root@localhost ~]# mongod -f /etc/mongodb1.conf
[root@localhost ~]# netstat -anpt | grep '37017'
8、编辑启动脚本
[root@localhost ~]# vim /etc/init.d/mongodb
#!/bin/bash
# descript:Mongodb Server Control Script
# Author: GuiHaiYiDao TEL:139741741741
# date:long long ago
instance=$1
action=$2
case "$action" in
'start')
mongod -f /etc/"$instance".conf
;;
'stop')
mongod -f /etc/"$instance".conf --shutdown
;;
'restart')
mongod -f /etc/"$instance".conf --shutdown
mongod -f /etc/"$instance".conf
;;
esac
[root@localhost ~]# chmod +x /etc/init.d/mongodb
[root@localhost ~]# /etc/init.d/mongodb mongodb1 start #启动
二、部署分片群集
1、部署配置服务器
源码包安装已经配置过了,端口号37017,略……
2、部署分片服务器
[root@localhost ~]# vim /etc/mongodb2.conf #部署第1个分片服务器
port=47017
dbpath=/usr/local/mongodb/data/mongodb2
logpath=/usr/local/mongodb/log/mongodb2.log
logappend=true
fork=true
maxConns=5000
storageEngine=mmapv1
shardsvr=true #指定分片服务器角色
[root@localhost ~]# vim /etc/mongodb3.conf #部署第2个分片服务器
port=47018
dbpath=/usr/local/mongodb/data/mongodb3
logpath=/usr/local/mongodb/log/mongodb3.log
logappend=true
fork=true
maxConns=5000
storageEngine=mmapv1
shardsvr=true
[root@localhost ~]# /etc/init.d/mongodb mongodb2 start
[root@localhost ~]# /etc/init.d/mongodb mongodb3 start
3、优化内存(其中一个节点内存不足,可以从其他节点获得)
[root@localhost ~]# sysctl -w vm.zone_reclaim_mode=0
[root@localhost ~]# echo never > /sys/kernel/mm/transparent_hugepage/enabled #开启大页面存储
[root@localhost ~]# echo never > /sys/kernel/mm/transparent_hugepage/defrag
4、启动路由服务器
[root@localhost ~]# mongos --port 27017 --fork --logpath=/usr/local/mongodb/bin/route.log --configdb 192.168.100.77:37017 --chunkSize 1
#解析
--port: #指定端口号,MongoDB默认端口为27017
--fork: #指定工作模式
--logpath: #日志路径
--configdb: #指定配置服务器
--chunkSize: #指定数据块大小
5、启动分片服务器
1).查看分片状态信息
[root@localhost ~]# mongo --port 27017 #!!!!注意是27017
mongos> show dbs
config 0.031GB
local 0.031GB
mongos> sh.status() #查看分片状态信息
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("5b964a6d17b453754b82ab72")
}
shards: #此时查看并没有分片服务器状态
active mongoses:
"3.2.1" : 1
balancer:
Currently enabled: yes
Currently running: no
Failed balancer rounds in last 5 attempts: 0
Migration Results for the last 24 hours:
No recent migrations
databases:
2).添加分片服务器
mongos> sh.addShard("192.168.100.77:47017")
mongos> sh.addShard("192.168.100.77:47018")
3).再次查看分片状态
mongos> sh.status()
--- Sharding Status ---
……
shards: #查看分片服务器已经添加成功
{ "_id" : "shard0000", "host" : "192.168.100.77:47017" }
{ "_id" : "shard0001", "host" : "192.168.100.77:47018" }
6、实现分片功能
1).添加数据
mongos> use school
mongos> for(var i=1; i<=10000; i++) db.student.insert({"id":i,"name":"Jack"+i})
mongos> db.student.find().limit(5)
mongos> db.student.count() #查看总共10个条目
2).查看分片状态信息
mongos> sh.status()
--- Sharding Status ---
……
databases:
{ "_id" : "school", "primary" : "shard0000", "partitioned" : false } #partitioned为"false"代表"school"数据库尚未分片
3).启用数据库分片
mongos> sh.enableSharding("school")
mongos> sh.status()
4).创建索引对集合进行分片
mongos> use school
mongos> db.student.createIndex({"id":1}) #创建索引,"1"代表升序;"-1"代表降序
mongos> sh.shardCollection("school.student",{"id":1}) #使用创建的索引对集合进行分片
mongos> sh.status()
三、分片管理
1、创建相应的测试数据
mongos> use school
mongos> for(var i=1; i<=50000; i++) db.student2.insert({"id":i,"name":"Tom"+i})
mongos> db.student2.createIndex({"id":1})
mongos> sh.shardCollection("school.student2",{"id":1})
mongos> sh.status() #对应条目数范围指向相应的分片
2、添加标签(方便识别)
mongos> db.student2.stats()
mongos> sh.addShardTag("shard0000","stu00")
mongos> sh.addShardTag("shard0001","stu01")
mongos> sh.status()
3、连接配置服务器
[root@localhost mongodb]# mongo --port 37017
configsvr> use config
configsvr> db.databases.find() #查看数据库信息
configsvr> db.collections.find() #查看集合信息
configsvr> db.chunks.find() #查看数据块信息
4、添加分片
[root@localhost ~]# vim /etc/mongodb4.conf
port=47019
dbpath=/usr/local/mongodb/data/mongodb4
logpath=/usr/local/mongodb/log/mongodb4.log
logappend=true
fork=true
maxConns=5000
storageEngine=mmapv1
shardsvr=true
[root@localhost ~]# /etc/init.d/mongodb mongodb4 start #启动第4个实例
[root@localhost ~]# mongo --port 27017
mongos> sh.addShard("192.168.100.77:47019") #添加分片
mongos> sh.status()
5、删除分片
[root@localhost ~]# mongo --port 27017
mongos> use admin
mongos> db.runCommand({"removeshard":"192.168.100.77:47019"})
mongos> sh.status()