MongoDB分片概述
1、什么是分片
- 高数据量和吞吐量的数据库应用会对单机的性能造成较大压力,大的查询量会将单机的CPU耗尽,大的数据量对单机的存储压力较大,最终会耗尽系统的内存而将压力转移到磁盘IO上。
- MongoDB分片是使用多个服务器存储数据的方法,以支持巨大的数据存储和对数据进行操作。分片技术可以满足MongoDB数据量大量增长的需求,当一台服务器存储量不够时,可以通过再外接一台分片服务器,使得数据库系统能够存储更多的数据
2、MongoDB分片优势
- 使用分片减少了每个分片需要处理的请求数,因此,通过水平扩展,群集可以提高自己的存储容量和吞吐量,比如,当插入一条数据时,应用只需要访问存储这条数据的分片。
- 使用分片减少了每个分片存储的数据。
- 优势在于提供类似线性增长的架构,提高数据可用性,提高大数据库查询服务器的性能,当MongoDB单点数据库服务器存储成为瓶颈、单点数据库服务器的性能成为瓶颈或者需要部署大型应用以充分利用内存时,可以使用分片技术。
3、MongoDB分片群集的构成
- shard:分片服务器,用于存储实际的数据块,实际生产环境中一个shard server角色可由几台服务器组成一个replica set承担,防止主机单点故障。
- config server:配置服务器,存储了整个分片群集的配置信息,其中包括chunk信息。
- routers:前端路由,客户端由此接入,且让整个群集看上去像单一数据库,前端应用可以透明使用。
MongoDB分片群集部署
群集环境
分片服务器 | 对应配置文件 | 服务端口设定 |
---|---|---|
配置服务器 | mongod1.conf | 37017 |
分片服务器1 | mongod2.conf | 47017 |
分片服务器2 | mongod3.conf | 47018 |
分片服务器3 | mongod4.conf | 47019 |
路由服务器 | mongod.conf | 27017 |
安装MongoDB3.2
- 注:此处选择MongoDB3.2版本是由于在MongoDB3.4版本以后安全性增加,针对分片管理时需要设置下面分片服务器在一个复制集当中,此处为了简化操作选择MongoDB2.3版本,最新版本分片群集管理相关内容后续将会补充。
- MongoDB2.3版本可在MongoDB官方网站下载:https://www.mongodb.com/
- 安装环境包
yum install openssl-devel -y
- 解压软件包,创建工作目录及日志文件
tar zxvf mongdb-linux-x86_64-3.2.1.tgz -C /opt
mv mongodb-linux-x86_64-3.2.1/ /usr/local/mongodb
mkdir -p /data/mongodb/mongodb{1,2,3,4,5}
mkdir /data/mongodb/logs
touch /data/mongodb/logs/mongodb{1,2,3,4,5}.log
chmod -R 777 /data/mongodb/logs/*.log
- 进行系统内存和文件优化
ulimit -n 25000
ulimit -u 25000
- 创建每个节点配置文件
- 配置服务器
vim /etc/mongod1.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
- 创建MongoDB常用命令软连接,方便系统识别,可直接使用
ln -s /usr/local/mongodb/bin/mongo /usr/bin/mongo
ln -s /usr/local/mongodb/bin/mongod /usr/bin/mongod
- 创建分片服务器的配置文件,包含mongodb3.conf和mongodb4.conf
vim /etc/mongodb2.conf
port=47017 //其他两个分片服务器端口分别为47018和47019
dbpath=/data/mongodb/mongodb2 //工作目录也要更换
logpath=/data/mongodb/logs/mongodb2.log //日志文件也要更改
logappend=true
fork=true
maxConns=5000
storageEngine=mmapv1
shardsvr=true //设置为分片服务器功能
- 启动服务器
mongod -f mongodb1.conf
mongod -f mongodb2.conf
mongod -f mongodb3.conf
mongod -f mongodb4.conf
- 启动路由服务器
- 路由服务器不需要创建工作目录与日志文件,在启动时可通过命令指定即可
./mongos --port 27017 --fork --logpath=/usr/local/mongodb/bin/route.log --configdb 192.168.144.113:37017 --chunkSize 1
//客户端通过27017端口访问,工作模式为fork,日志文件位置及配置文件位置,交给配置服务器的37017去处理调度分片服务器
- 当启用路由服务器出现如下内容表示启动成功
2018-07-16T21:54:55.081+0800 W SHARDING [main] Running a sharded cluster with fewer than 3 config servers should only be done for testing purposes and is not recommended for production.
about to fork child process, waiting until server is ready for connections.
forked process: 3058
child process started successfully, parent exiting
路由服务器添加分片服务器
- 为了能够让路由服务器通过配置服务器找到分片服务器,需要在路由服务器中添加分片服务器信息
- 进入路由服务器
mongo
mongos> show dbs
mongos> sh.status() //此时查看shards下为空,没有分片服务器
mongos> sh.addShard("192.168.144.113:47017") //添加分片服务器
mongos> sh.addShard("192.168.144.113:47018")
mongos> sh.status() //再次查看shards下有了分片服务器
启用分片存储功能
- 当路由服务器可以找到分片服务器后,并不能将数据存储在不同的分片服务器中,需要开启此功能才可以。
- 首先查看分片存储功能有没有打开。
mongos> use kgc //创建数据库
mongos> for(var i=1;i<=10000;i++)db.users.insert({"id":i,"name":"jack"+i}) //创建一万条数据
mongos> sh.status() //查看数据库分片信息
databases:
{ "_id" : "kgc", "primary" : "shard0000", "partitioned" : false } //当看到false时表示分片存储功能未开启
- 想要对数据库中某一集合采取数据分片存储,首先需要对集合里面的数控建立一个索引,然后指定将数据库中的集合分片即可。操作如下:
mongos> db.users.createIndex({"id":1}) //对users集合创建索引
mongos> sh.shardCollection("kgc.users",{"id":1}) //集合分片
mongos> sh.status()
- 当查看到如图状态时,表示分片存储已经完成。
分片服务管理
- 为了方便看清与记忆,我们可以将不同分片服务器添加标记。
- 当数据量不断增大时,MongoDB的分片存储功能可实现在线扩容,也就是增加分片服务器,使得数据可自动平均分片存储,避免了单点故障与免停机维护。
添加标签
- 在进行完分片服务器启动与分片存储功能后
mongos> sh.addShardTag("shard0000","first")
mongos> sh.addShardTag("shard0001","second") //添加标签
mongos> sh.removeShardTag("shard0000","sales01") //删除标签
- 当看到如下图所示,表示标签添加成功。
链接配置服务器
- 由于所有通过路由服务器对分片服务器的操作都是通过配置服务器完成的,所以,可以进入配置服务器查看。
mongo --port 37017
configsvr> use config //配置数据库
configsvr> show collections
....
collections //集合信息
chunks //分片节点信息
databases //数据库信息
....
configsvr> db.chunks.findOne()
configsvr> db.collections.find()
configsvr> db.databases.find()
添加分片服务器
- 动态添加分片服务器,自动可以平均分片存储
- 首先启动需要添加的分片服务器
mongod -f mongodb4.conf
mongo //进入路由服务器
mongos> sh.addShard("192.168.144.113:47019") //添加分片服务器
mongos> sh.status() //查看状态
chunks:
shard0000 4
shard0001 5
shard0002 2
如图:
删除分片服务器
- 当删除一个分片服务器时,也就是模拟单点故障时,配置服务器会将数据库中的数据重新分配,平均存储到其他分片服务器上,也不会丢失数据。
mongos> use admin
mongos> db.runCommand({"removeshard":"192.168.144.113:47019"})
- 模拟单点故障,如图结果
原文地址:http://blog.51cto.com/13659253/2146967