MongoDB分片集群原理、搭建及测试详解
随着技术的发展,目前数据库系统对于海量数据的存储和高效访问海量数据要求越来越高,MongoDB分片机制就是为了解决海量数据的存储和高效海量数据访问而生。
MongoDB分片集群由mongos路由进程(轻量级且非持久化进程)、复制集组成的片shards(分片一般基于复制集故障转移和冗余备份功能)、一组配置服务器(存储元数据信息,一般冗余3台)构成。
一、部署MongoDB分片集群
mongod参数可以通过"mongod --help"查看。
mongos参数可以通过"mongos --help"查看。
1、配置复制集rs0:
参考文档:http://www.cnblogs.com/wcwen1990/p/8053860.html
创建rs0复制集数据目录、日志目录和配置文件。
rs0配置文件:
cat /home/mongodb/db_rs0/config_rs0/rs0.conf
dbpath = /home/mongodb/db_rs0/data/rs0
logpath = /home/mongodb/db_rs0/logs/rs0.log
logappend = true
journal = true
port = 40000
fork = true
maxConns = 5000
bind_ip = 0.0.0.0
replSet = rs0
shardsvr = true
auth = false
2、配置复制集rs1:
参考文档:http://www.cnblogs.com/wcwen1990/p/8053860.html
创建rs1复制集数据目录、日志目录和配置文件。
rs1配置文件:
cat /home/mongodb/db_rs1/config_rs1/rs1.conf
dbpath = /home/mongodb/db_rs1/data/rs1
logpath = /home/mongodb/db_rs1/logs/rs1.log
logappend = true
journal = true
port = 40001
fork = true
maxConns = 5000
bind_ip = 0.0.0.0
replSet = rs1
shardsvr = true
auth = false
3、配置configura服务器,共3台:
configura服务器也是一个mongod进程,它与我们熟悉的普通mongod进程没有本质区别,只是它上面的数据库和集合存储的是分片集群的元数据信息。
创建configura服务器的数据目录、日志目录和配置文件。
configura配置文件:
cat /home/mongodb/db_configs/config_cfgserver/cfgserver.conf
dbpath = /home/mongodb/db_configs/data/db_config
logpath = /home/mongodb/db_configs/logs/config.log
logappend = true
port = 40002
maxConns = 5000
bind_ip = 0.0.0.0
replSet = cfgset
configsvr = true
auth = false
fork = true
4、配置路由服务器:
mongos路由进程功能为整个分片集群构建一个统一的访问客户端,使复杂的分片集群对用户来说是透明的。上文提到过mongos路由进程是一个轻量级且非持久化的进程,其原因是它不需要像其他进程一样创建数据目录dbpath,只需要创建一个日志目录即可。
mongos配置文件内容如下:
cat /home/mongodb/mongos/cfg_mongos.conf
logpath = /home/mongodb/mongos/logs/mongos.log
logappend = true
port = 40003
fork = true
maxConns = 5000
bind_ip = 0.0.0.0
configdb = cfgset/db01:40002,db02:40002,db03:40002
5、分别启动步骤1、步骤2、步骤3、步骤4配置的9个mongod进程和1个mongos进程:
1)启动三个rs0复制集:
bin/mongod --config /home/mongodb/db_rs0/config_rs0/rs0.conf
2)启动三个rs1复制集:
bin/mongod --config /home/mongodb/db_rs1/config_rs1/rs1.conf
3)启动三个配置服务器,并且初始化配置服务器:
bin/mongod --config /home/mongodb/db_configs/config_cfgserver/cfgserver.conf
登录配置服务器:
bin/mongo --port 40003
执行初始化操作:
rs.initiate({_id:"cfgset",configsvr:true, members:[{_id:1,host:"db01:40002"},{_id:2,host:"db02:40002"},{_id:3,host:"db03:40002"}]})
4)启动mongos服务器:
bin/mongos --config /home/mongodb/mongos/cfg_mongos.conf
6、添加各个分片到集群
上面已经完成了两个片(复制集)、三个配置服务器、一个路由服务器的配置工作。接下来,我们要将各个分片添加到集群中。
1)打开一个mongo客户端连接mongos服务器:
bin/mongo --port 40003
2)添加两个分片到集群:
sh.addShard("rs0/db01:40000,db02:40000")
sh.addShard("rs1/db01:40001,db02:40001")
3)通过sh.status()检查上面配置是否正确:
MongoDB Enterprise mongos> sh.status()
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("5a37e16fd7903ab63ab90ebf")
}
shards:
{ "_id" : "rs0", "host" : "rs0/db01:40000,db02:40000", "state" : 1 }
{ "_id" : "rs1", "host" : "rs1/db01:40001,db02:40001", "state" : 1 }
active mongoses:
"3.6.0" : 1
autosplit:
Currently enabled: yes
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:
{ "_id" : "config", "primary" : "config", "partitioned" : true }
4)查看分片集群数据库信息:
MongoDB Enterprise mongos> show dbs
admin 0.000GB
config 0.000GB
MongoDB Enterprise mongos> db
test
MongoDB Enterprise mongos> use config
switched to db config
MongoDB Enterprise mongos> show collections
changelog
chunks
lockpings
locks
migrations
mongos
shards
tags
transactions
version
至此,MongoDB分片集群部署成功,生产部署还需要调整一些参数,这部门内容可以通过--help查看参数详情。
三、测试MongoDB分片集群
1、向集群插入文档:
MongoDB Enterprise mongos> use chavin
switched to db chavin
MongoDB Enterprise mongos> db.users.insert({userid:1,username:"ChavinKing",city:"beijing"})
WriteResult({ "nInserted" : 1 })
MongoDB Enterprise mongos> db.users.find()
{ "_id" : ObjectId("5a37eabafa5fcca8c960e893"), "userid" : 1, "username" : "ChavinKing", "city" : "beijing" }
2、查看分片集群状态:
MongoDB Enterprise mongos> sh.status()
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("5a37e16fd7903ab63ab90ebf")
}
shards:
{ "_id" : "rs0", "host" : "rs0/db01:40000,db02:40000", "state" : 1 }
{ "_id" : "rs1", "host" : "rs1/db01:40001,db02:40001", "state" : 1 }
active mongoses:
"3.6.0" : 1
autosplit:
Currently enabled: yes
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:
{ "_id" : "chavin", "primary" : "rs1", "partitioned" : false } //数据库chavin目前不支持分片("partitioned" : false),数据库文件存储在rs1片上("primary" : "rs1")
{ "_id" : "config", "primary" : "config", "partitioned" : true }
config.system.sessions
shard key: { "_id" : 1 }
unique: false
balancing: true
chunks:
rs0 1
{ "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : rs0 Timestamp(1, 0)
3、MongoDB分片是针对集合的,要想使集合支持分片,首先需要使其数据库支持分片,为数据库chavin启动分片:
MongoDB Enterprise mongos> sh.enableSharding("chavin")
{
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1513614275, 5),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1513614275, 5)
}
4、为分片字段建立索引,同时为集合指定片键:
MongoDB Enterprise mongos> db.users.ensureIndex({city:1}) //创建索引
{
"raw" : {
"rs1/db01:40001,db02:40001" : {
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
},
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1513614344, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1513614344, 1)
}
MongoDB Enterprise mongos> sh.shardCollection("chavin.users",{city:1}) //启用集合分片,为其指定片键
{
"collectionsharded" : "chavin.users",
"collectionUUID" : UUID("a5de7086-115c-44a3-984e-3db8d945dbab"),
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1513614387, 13),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1513614387, 13)
}
5、再次查看分片集群状态:
MongoDB Enterprise mongos> sh.status()
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("5a37e16fd7903ab63ab90ebf")
}
shards:
{ "_id" : "rs0", "host" : "rs0/db01:40000,db02:40000", "state" : 1 }
{ "_id" : "rs1", "host" : "rs1/db01:40001,db02:40001", "state" : 1 }
active mongoses:
"3.6.0" : 1
autosplit:
Currently enabled: yes
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:
{ "_id" : "chavin", "primary" : "rs1", "partitioned" : true } //此时chavin数据库已经支持分片
chavin.users
shard key: { "city" : 1 }
unique: false
balancing: true
chunks:
rs1 1
{ "city" : { "$minKey" : 1 } } -->> { "city" : { "$maxKey" : 1 } } on : rs1 Timestamp(1, 0) //目前存在一个片,存储在rs1上
{ "_id" : "config", "primary" : "config", "partitioned" : true }
config.system.sessions
shard key: { "_id" : 1 }
unique: false
balancing: true
chunks:
rs0 1
{ "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : rs0 Timestamp(1, 0)
6、向集群插入测试数据:
MongoDB Enterprise mongos> for(var i=1;i<1000000;i++) db.users.insert({userid:i,username:"chavin"+i,city:"beijing"})
MongoDB Enterprise mongos> for(var i=1;i<1000000;i++) db.users.insert({userid:i,username:"dbking"+i,city:"changsha"})
7、再次查看分片集群状态:
MongoDB Enterprise mongos> sh.status()
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("5a37e16fd7903ab63ab90ebf")
}
shards:
{ "_id" : "rs0", "host" : "rs0/db01:40000,db02:40000", "state" : 1 }
{ "_id" : "rs1", "host" : "rs1/db01:40001,db02:40001", "state" : 1 }
active mongoses:
"3.6.0" : 1
autosplit:
Currently enabled: yes
balancer:
Currently enabled: yes
Currently running: no
Failed balancer rounds in last 5 attempts: 0
Migration Results for the last 24 hours:
1 : Success
databases:
{ "_id" : "chavin", "primary" : "rs1", "partitioned" : true }
chavin.users
shard key: { "city" : 1 }
unique: false
balancing: true
chunks:
rs0 1
rs1 2
{ "city" : { "$minKey" : 1 } } -->> { "city" : "beijing" } on : rs0 Timestamp(2, 0) //分片1,存储在rs0中,并且标注了范围
{ "city" : "beijing" } -->> { "city" : "guangdong" } on : rs1 Timestamp(2, 1) //分片2,存储在rs1中,并且标注了范围
{ "city" : "guangdong" } -->> { "city" : { "$maxKey" : 1 } } on : rs1 Timestamp(1, 3) //分片3,存储在rs1中,并且标注了范围
{ "_id" : "config", "primary" : "config", "partitioned" : true }
config.system.sessions
shard key: { "_id" : 1 }
unique: false
balancing: true
chunks:
rs0 1
{ "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : rs0 Timestamp(1, 0)
8、更加详细的分析需要从集合changelog入手分析:
db.changelog.find()可以查看到具体的动作信息,这里不再赘述。
MongoDB分片集群原理、搭建及测试详解的更多相关文章
- MongoDB分片集群环境搭建记录
--创建配置服务器mongod.exe --logpath "G:\USERDATA\MONGODB\Test2\Log\mongodb.log" --logappend --db ...
- 分布式文档存储数据库之MongoDB分片集群
前文我们聊到了mongodb的副本集以及配置副本集,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13953598.html:今天我们来聊下mongodb的分片 ...
- 搭建MongoDB分片集群
在部门服务器搭建MongoDB分片集群,记录整个操作过程,朋友们也可以参考. 计划如下: 用5台机器搭建,IP分别为:192.168.58.5.192.168.58.6.192.168.58.8.19 ...
- Windows 搭建MongoDB分片集群(二)
在本篇博客中我们主要讲描述分片集群的搭建过程.配置分片集群主要有两个步骤,第一启动所有需要的mongod和mongos进程.第二步就是启动一个mongos与集群通信.下面我们一步步来描述集群的搭建过程 ...
- Windows 搭建MongoDB分片集群(一)
一.角色说明 要构建一个MongoDB分片集群,需要三个角色: shard server 即存储实际数据得分片,每个shard 可以是一个Mongod实例,也可以是一组mongod实例构成得Repl ...
- MongoDB 分片集群技术
在了解分片集群之前,务必要先了解复制集技术! 1.1 MongoDB复制集简介 一组Mongodb复制集,就是一组mongod进程,这些进程维护同一个数据集合.复制集提供了数据冗余和高等级的可靠性,这 ...
- MongoDB 分片集群实战
背景 在如今的互联网环境下,海量数据已随处可见并且还在不断增长,对于如何存储处理海量数据,比较常见的方法有两种: 垂直扩展:通过增加单台服务器的配置,例如使用更强悍的 CPU.更大的内存.更大容量的磁 ...
- (转)MongoDB 分片集群技术
1.1 MongoDB复制集简介 一组Mongodb复制集,就是一组mongod进程,这些进程维护同一个数据集合.复制集提供了数据冗余和高等级的可靠性,这是生产部署的基础. 1.1.1 复制集的目的 ...
- centos HA高可用集群 heartbeat搭建 heartbeat测试 主上停止heartbeat服务 测试脑裂 两边都禁用ping仲裁 第三十二节课
centos HA高可用集群 heartbeat搭建 heartbeat测试 主上停止heartbeat服务 测试脑裂 两边都禁用ping仲裁 第三十二节课 heartbeat是Linu ...
随机推荐
- iOS如何在应用中添加图标更换功能
一.在info.plist中设置图标信息 首先将需要更换的图标按照下面的方式声明,以便我们能够正常调用文件和方法.注意,每个图标的图标名称和对应的文件名要一一对应. 二.在工程根目录下添加图标文件 图 ...
- 积木式编程——自制app点灯
技术:51单片机.串口.蓝牙.积木式编程 概述 这里简单入门了积木式编程,做了个简易APP用来开灯关灯,当然你可以继续添加内容,可以做智能家居.遥控汽车和环境监控等等. 详细 代码下载:http: ...
- 前端学习-jQuery
老师博客:https://www.cnblogs.com/yuanchenqi/articles/6070667.html day43,day44 jquery 中文文档:http://jquery. ...
- Linux下C语言执行shell命令
有时候在代码中需要使用到shell命令的情况,下面就介绍一下怎么在C语言中调用shell命令: 这里使用popen来实现,关于popen的介绍,查看 http://man7.org/linux/man ...
- shell md5sum
md5sum out.a echo "fd_limit=$(ulimit -n), fd_used=$(ll /proc/4741/fd | wc -l)" 需找句柄,及fd ...
- SAP Tax Service可以取代TAXBRA / RVABRA吗?(翻译) 跨国贸易云税务解决方案
这篇文章的内容基于Fausto Motter 的一篇文章,他在SAP社区用葡萄牙语写了一篇文章,讨论如何用云解决方案取代巴西税收计算.我翻译了他的部分文章,添加并修改了一些内容,目标是帮助全球的SA ...
- 第四百一十六节,Tensorflow简介与安装
第四百一十六节,Tensorflow简介与安装 TensorFlow是什么 Tensorflow是一个Google开发的第二代机器学习系统,克服了第一代系统DistBelief仅能开发神经网络算法.难 ...
- Houdini技术体系 基础管线(一) : Houdini与Houdini Engine的安装
Houdini 下载与安装 在官网 https://www.sidefx.com/download/ 下载最新的Production Build 版本,当前是16.5版本,需要注册帐号 PS:公司内网 ...
- idea中git颜色不显示或者文件右键没有git按钮解决方法
VCS--->Enable Version Control Integration,然后选择git就可以了
- 【Dubbo 源码解析】03_Dubbo Protocol&Filter
Protocol & Filter Dubbo 服务暴露和服务引用都是通过的 com.alibaba.dubbo.rpc.Protocol 来实现的.它是一个 SPI 扩展. @SPI(&qu ...