您的位置:首页 > 数据库 > Mongodb

MongoDB分片群集

shitihuo 2019-01-22 23:58 1011 查看 http://blog.51cto.com/13871362

一、关于分片

1、什么是分片

高数据量和吞吐量的数据库应用会对单机的性能造成较大压力,大的查询会将单机的CPU耗尽,大的数据量对单机的存储压力比较大,最终会耗尽系统的内存而将压力转移到磁盘IO上。
MongoDB分片是使用多个服务器存储数据的方法,以支持巨大的数据存储和对数据进行操作。分片技术可以满足MongoDB数据量大量增长的需求,当一台MongoDB服务器不足以存储海量数据或不足以提供可接受的读写吞吐量时,我们就可以通过在多台服务器上分割数据,使得数据库系统能存储和处理更多的数据。

2、MongoDB分片优势

(1)分配为应对高吞吐量与大数据量提供了方法。
(2)使用分片减少了每个分片需要处理的请求数,因此,通过水平扩展,群集可以提高自己的存储容量和吞吐量。比如,当插入一条数据时,应用只需要访问存储这条数据的分片。
(3)使用分片减少了每个分片存储的数据。
(4)分片的优势在提供类似线性增长的架构,提高数据可用性,提高大型数据库查询服务器的性能。当MongoDB单点数据库服务器存储成为瓶颈、单点数据库服务器的性能成为瓶颈或者需要部署大型应用以充分利用内存时,可以使用分片技术。MongoDB分片的结构如下:

3、MongoDB分片群集的组成

MongoDB分片群集主要有如下三个主要组件:
Shard:分片服务器,用于存储实际的数据块,实际生产环境中一个shard server角色可由几台服务器组成一个 Replica Set承担,防止主机单点故障。
Config Server:配置服务器,存储了整个分片群集的配置信息,其中包括chunk信息。
Router:前端路由,客户端由此接入,且让整个集群看上去像一个单一数据库,前端应用可以透明使用。
MongoDB分片群集的组成如下图:

二、简单部署MongoDB群集

系统环境:
1台路由实列(端口27017)
1台配置实列(端口37017)
2台Shard实列(端口47017,47018)

1、源码编译安装MongoDB3.2

yum install openssl-devel -y    //安装依赖包
tar zxvf mongodb-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}   //创建多实列库
mkdir /data/mongodb/logs
touch /data/mongodb/logs/mongodb{1,2,3}.log //创建对应的日志文件
chmod -R 777 /data/mongodb/logs/*.log   //提权
ulimit -n 25000 //设置每个进程可打开的文件数
ulimit -u 25000 //设置最大进程数

2、部署配置服务器(config server)
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

做对mongodb/bin下的常用命令做一个软件链接

ln -s /usr/local/mongodb/bin/mongo /usr/bin/mongo
ln -s /usr/local/mongodb/bin/mongod /usr/bin/mongod

开启配置服务器的实列

mongod -f /usr/local/mongodb/bin/mongodb1.conf


3、部署分片服务器

cp -p mongodb1.conf mongodb2.conf   //复制主配置文件对应第一台shard实列
cp -p mongodb2.conf mongodb3.conf   //对应第二台实列
vi mongodb2.conf    //修改对应的端口号和相应的路径


mongod -f mongodb2.conf //分别开启分片服务器实列
mongod -f mongodb3.conf


4、启动路由服务器

./mongos --port 27017 --fork --logpath=/usr/local/mongodb/bin/route.log --configdb 192.168.80.100:37017 --chunkSize 1


5、进入路由实例中启动分片服务器

mongo   //进入实列,默认端口27017
show dbs        //查看配置的大小


sh.status()    //查看分片状态,没有分片服务器

sh.addShard("192.168.80.100:47017")     //添加分片服务器
sh.addShard("192.168.80.100:47018")


sh.status()


6、验证数据分片功能

use kgc
for(var i=1;i<=50000;i++)db.users.insert({"id":i,"name":"jerry"+i}) //插入数据
注意:ulimit指定了每个进程的文件数量25000,因此要插入大于25000的数据才能体现出分片功能
db.users.find().limit(5)    //查看是否创建成功
sh.enableSharding("kgc")    //启用数据库分片
sh.status()

db.users.createIndex({"id":1})  //创建索引
sh.shardCollection("kgc.users",{"id":1})  //对数据集合分片id=n就是数据以n为单位分块
sh.status()


7、分片管理
添加标签

sh.addShardTag("shard0000","sales00")
sh.addShardTag("shard0001","sales01")

连接配置服务器

db.chunks.findOne()     //查看分块信息
db.collections.find()   //查看分片集合信息
db.databases.find()     //查看分片数据库信息

添加分片服务器

mkdir -p /data/mongodb/mongodb4
touch /data/mongodb/logs/mongodb4.log
chmod -R 777 /data/mongodb/logs/*.log
cp -p mongodb3.conf mongodb4.conf
vi mongodb4.conf

mongod -f mongodb4.conf     //开启实例
mongo   //进入前端路由服务器
sh.addShard("192.168.80.100:47019")     //添加分片服务器
sh.status() //查看分片状态


删除分片节点

use admin   //进入管理模块
db.runCommand({"removeshard":"192.168.80.100:47019"})

标签:  mongodb 集群 分片