热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MongoDB数据库中配置sharding的方法

一、概述要构建一个MongoDBShardingCluster,需要三种角色:ShardServer即存储实际数据的分片,每个Shard可以是一个mongod实例,也可以是一组mongod实例构成的ReplicaSet。为了实现每个Shard内部的auto-failover,MongoDB官方建议每个Shard为一组R
一、概述
要构建一个 MongoDB Sharding Cluster,需要三种角色:
Shard Server
即存储实际数据的分片,每个Shard可以是一个mongod实例,也可以是一组mongod实例构成的Replica Set。为了实现每个Shard内部的auto-failover,MongoDB官方建议每个Shard
为一组Replica Set。
Config Server
为了将一个特定的collection存储在多个shard中,需要为该collection指定一个shard key,例如{age: 1} ,shard key可以决定该条记录属于哪个chunk。Config Servers就是用来存储:所有shard节点的配置信息、每个chunk的shard key范围、chunk在各shard的分布情况、该集群中所有DB和collection的sharding配置信息。
Route Process
这是一个前端路由,客户端由此接入,然后询问Config Servers需要到哪个Shard上查询或保存记录,再连接相应的Shard进行操作,最后将结果返回给客户端。客户端只需要将原本发给mongod的查询或更新请求原封不动地发给Routing Process,而不必关心所操作的记录存储在哪个Shard上。

二、Sharding配置
192.168.4.93
192.168.4.94
192.168.4.89
在3台机器上面做主从配置,首先需要在3台机器上面的,相同路径下已经安装好mongodb(安装在/usr/local/mongodb/bin/mongod),并且在单机模式下可以正常启动。参考 MongoDB单机安装和使用 。
为了避免不必要的错误,保证3台机器之间能够互相访问,端口不受限制,如果是本地测试机,最好是关掉防火墙(service iptables stop)。
完成上面的工作外,执行下面操作流程
1、94,89两台机器作为Shard Server,在上面分别启动下面命令(先要创建/data/database/mongodb_s,以及/data/logs/日志文件夹):
/usr/local/mongodb/bin/mongod --shardsvr --fork
--dbpath=/data/database/mongodb_s
--logpath=/data/logs/mongodb_s.log --port=27200 --oplogSize 128
--logappend --journal
2、93机器作为Config Server和Route Process(同样需要创建对应的数据库文件夹/data/database/mongodb_c)
启动Config Server
/usr/local/mongodb/bin/mongod --configsvr --fork
--dbpath=/data/database/mongodb_c
--logpath=/data/logs/mongodb_c.log --port=30001 --oplogSize 128
--logappend --journal
启动 Route Process,指定了Config Server的ip和端口,注意这个智能是奇数。chunkSize这一项是用来指定chunk的大小的,单位是MB,默认大小
为200MB,为了方便测试Sharding效果,我们把chunkSize指定为 1MB
/usr/local/mongodb/bin/mongos --cOnfigdb=192.168.4.93:30001
--fork --logpath=/data/logs/mongodb_r.log --port=20001 --logappend
--chunkSize=1
3、配置Sharding
a、在93机器上面执行
/usr/local/mongodb/bin/mongo --port 20001
> use admin
switched to db admin
> db.adminCommand({addshard:"192.168.4.94:27200"}) 添加Shard Server
{ "shardAdded" : "shard0000", "ok" : 1 }
> db.adminCommand({addshard:"192.168.4.89:27200"})
{ "shardAdded" : "shard0001", "ok" : 1 }
> db.adminCommand({enablesharding:"test"}) -设置分片存储的数据库
{ "ok" : 1 }
> db.adminCommand({shardcollection:"test.users",key:{_id:1}}) --设置分片的集合名称,且必须指定Shard Key,系统会自动创建索引
{ "collectionsharded" : "test.users", "ok" : 1 }
b、验证test库
查看users表的属性
db.users.stats()
{
"sharded" : true,
"ns" : "test.users",
"count" : 0,
"size" : 0,
"avgObjSize" : NaN,
"storageSize" : 47822848,
"nindexes" : 1,
"nchunks" : 1,
"shards" : {
"shard0000" : {
"ns" : "test.users",
"count" : 0,
"size" : 0,
"storageSize" : 47822848,
"numExtents" : 9,
"nindexes" : 1,
"lastExtentSize" : 14495232,
"paddingFactor" : 1,
"flags" : 1,
"totalIndexSize" : 8192,
"indexSizes" : {
"_id_" : 8192
},
"ok" : 1
}
},
"ok" : 1
}
插入数据,然后再查看状态,可以看到数据已经储存到2个shard

> db.users.stats()
{
"sharded" : true,
"ns" : "test.users",
"count" : 200000,
"size" : 19200000,
"avgObjSize" : 96,
"storageSize" : 69071104,
"nindexes" : 1,
"nchunks" : 18,
"shards" : {
"shard0000" : {
"ns" : "test.users",
"count" : 61997,
"size" : 5951712,
"avgObjSize" : 96,
"storageSize" : 47822848,
"numExtents" : 9,
"nindexes" : 1,
"lastExtentSize" : 14495232,
"paddingFactor" : 1,
"flags" : 1,
"totalIndexSize" : 2596864,
"indexSizes" : {
"_id_" : 2596864
},
"ok" : 1
},
"shard0001" : {
"ns" : "test.users",
"count" : 138003,
"size" : 13248288,
"avgObjSize" : 96,
"storageSize" : 21248256,
"numExtents" : 7,
"nindexes" : 1,
"lastExtentSize" : 10066176,
"paddingFactor" : 1,
"flags" : 1,
"totalIndexSize" : 5758976,
"indexSizes" : {
"_id_" : 5758976
},
"ok" : 1
}
},
"ok" : 1
}
>
c、现有表sharding
插入数据,

> db.users2.stats() 数据只保存一个shard上面
{
"ns" : "test.users2",
"sharded" : false,
"primary" : "shard0000",
"ns" : "test.users2",
"count" : 200000,
"size" : 19200000,
"avgObjSize" : 96,
"storageSize" : 53806336,
"numExtents" : 11,
"nindexes" : 1,
"lastExtentSize" : 13045504,
"paddingFactor" : 1,
"flags" : 1,
"totalIndexSize" : 8323072,
"indexSizes" : {
"_id_" : 8323072
},
"ok" : 1
}
> db.adminCommand({shardcollection:"test.users2",key:{_id:1}}) 对该集合做sharding
{ "collectionsharded" : "test.users2", "ok" : 1 }
> db.users2.stats() 查看数据已经储存到2个shard中
{
"sharded" : true,
"ns" : "test.users2",
"count" : 200000,
"size" : 19200000,
"avgObjSize" : 96,
"storageSize" : 54502656,
"nindexes" : 1,
"nchunks" : 37,
"shards" : {
"shard0000" : {
"ns" : "test.users2",
"count" : 194539,
"size" : 18675744,
"avgObjSize" : 96,
"storageSize" : 53806336,
"numExtents" : 11,
"nindexes" : 1,
"lastExtentSize" : 13045504,
"paddingFactor" : 1,
"flags" : 1,
"totalIndexSize" : 8101888,
"indexSizes" : {
"_id_" : 8101888
},
"ok" : 1
},
"shard0001" : {
"ns" : "test.users2",
"count" : 5461,
"size" : 524256,
"avgObjSize" : 96,
"storageSize" : 696320,
"numExtents" : 4,
"nindexes" : 1,
"lastExtentSize" : 524288,
"paddingFactor" : 1,
"flags" : 1,
"totalIndexSize" : 237568,
"indexSizes" : {
"_id_" : 237568
},
"ok" : 1
}
},
"ok" : 1
}
>
d、添加移除 Shard Server
移除Server
> db.adminCommand({removeshard:"192.168.4.89:27200"})
{
"msg" : "draining started successfully",
"state" : "started",
"shard" : "shard0001",
"ok" : 1
}
> db.users2.stats()
{
"sharded" : true,
"ns" : "test.users2",
"count" : 200000,
"size" : 19200000,
"avgObjSize" : 96,
"storageSize" : 53806336,
"nindexes" : 1,
"nchunks" : 37,
"shards" : {
"shard0000" : {
"ns" : "test.users2",
"count" : 200000,
"size" : 19200000,
"avgObjSize" : 96,
"storageSize" : 53806336,
"numExtents" : 11,
"nindexes" : 1,
"lastExtentSize" : 13045504,
"paddingFactor" : 1,
"flags" : 1,
"totalIndexSize" : 11526144,
"indexSizes" : {
"_id_" : 11526144
},
"ok" : 1
}
},
"ok" : 1
}
添加Server
db.adminCommand({addshard:"192.168.4.89:27200"})
{
"ok" : 0,
"errmsg" : "can't add shard 192.168.4.89:27200 because a local
database 'test' exists in another shard0000:192.168.4.94:27200"
}
这个时候再添加,因为test已经存在了,去89那台上面执行
> use test
> db.dropDatabase()
{ "dropped" : "test", "ok" : 1 }
然后再添加
> db.adminCommand({addshard:"192.168.4.89:27200"})
{ "shardAdded" : "shard0001", "ok" : 1 }
查看users状态,已经重新分片了,下面的信息显示数据还在复制过程中,你看到shard0001位54619,等数据复制后应该是10000
> db.users2.stats()
{
"sharded" : true,
"ns" : "test.users2",
"count" : 200000,
"size" : 19200000,
"avgObjSize" : 96,
"storageSize" : 64988416,
"nindexes" : 1,
"nchunks" : 37,
"shards" : {
"shard0000" : {
"ns" : "test.users2",
"count" : 145381,
"size" : 13956576,
"avgObjSize" : 96,
"storageSize" : 53806336,
"numExtents" : 11,
"nindexes" : 1,
"lastExtentSize" : 13045504,
"paddingFactor" : 1,
"flags" : 1,
"totalIndexSize" : 7479296,
"indexSizes" : {
"_id_" : 7479296
},
"ok" : 1
},
"shard0001" : {
"ns" : "test.users2",
"count" : 54619,
"size" : 5243424,
"avgObjSize" : 96,
"storageSize" : 11182080,
"numExtents" : 6,
"nindexes" : 1,
"lastExtentSize" : 8388608,
"paddingFactor" : 1,
"flags" : 1,
"totalIndexSize" : 4055040,
"indexSizes" : {
"_id_" : 4055040
},
"ok" : 1
}
},
"ok" : 1
}
3、其他命令
> db.adminCommand({ listshards: 1 })列出全部的sharding服务器
{
"shards" : [
{
"_id" : "shard0000",
"host" : "192.168.4.94:27200"
},
{
"_id" : "shard0001",
"host" : "192.168.4.89:27200"
}
],
"ok" : 1
}
> db.adminCommand({ isdbgrid:1 }) 判断是否是sharding
{ "isdbgrid" : 1, "hostname" : "booksir.om", "ok" : 1 }
> printShardingStatus() 查看sharding信息
--- Sharding Status ---
sharding version: { "_id" : 1, "version" : 3 }
shards:
{ "_id" : "shard0000", "host" : "192.168.4.94:27200" }
{ "_id" : "shard0001", "host" : "192.168.4.89:27200" }
databases:
{ "_id" : "admin", "partitioned" : false, "primary" : "config"
}
{ "_id" : "test", "partitioned" : true, "primary" : "shard0000"
}
test.users chunks:
shard0001 9
shard0000 9
{ "_id" : { $minKey : 1 } } -->> { "_id" :
ObjectId("50060bc893ba26048a6bbb17") } on : shard0001 { "t" :
21000, "i" : 0 }
{ "_id" : ObjectId("50060bc893ba26048a6bbb17") } -->> {
"_id" : ObjectId("50060bc993ba26048a6beac8") } on : shard0001 { "t"
: 22000, "i" : 0 }
{ "_id" : ObjectId("50060bc993ba26048a6beac8") } -->> {
"_id" : ObjectId("50060bcd93ba26048a6c19d9") } on : shard0001 { "t"
: 23000, "i" : 0 }
{ "_id" : ObjectId("50060bcd93ba26048a6c19d9") } -->> {
"_id" : ObjectId("50060bce93ba26048a6c4ae1") } on : shard0001 { "t"
: 24000, "i" : 0 }
{ "_id" : ObjectId("50060bce93ba26048a6c4ae1") } -->> {
"_id" : ObjectId("50060bce93ba26048a6c7621") } on : shard0001 { "t"
: 25000, "i" : 0 }
{ "_id" : ObjectId("50060bce93ba26048a6c7621") } -->> {
"_id" : ObjectId("50060bd393ba26048a6cad44") } on : shard0001 { "t"
: 26000, "i" : 0 }
{ "_id" : ObjectId("50060bd393ba26048a6cad44") } -->> {
"_id" : ObjectId("50060bd493ba26048a6cdb4c") } on : shard0001 { "t"
: 27000, "i" : 0 }
{ "_id" : ObjectId("50060bd493ba26048a6cdb4c") } -->> {
"_id" : ObjectId("50060bd793ba26048a6d0979") } on : shard0001 { "t"
: 28000, "i" : 0 }
{ "_id" : ObjectId("50060bd793ba26048a6d0979") } -->> {
"_id" : ObjectId("50060bd893ba26048a6d3aac") } on : shard0001 { "t"
: 29000, "i" : 0 }
{ "_id" : ObjectId("50060bd893ba26048a6d3aac") } -->> {
"_id" : ObjectId("50060bd993ba26048a6d6bb3") } on : shard0000 { "t"
: 29000, "i" : 1 }
{ "_id" : ObjectId("50060bd993ba26048a6d6bb3") } -->> {
"_id" : ObjectId("50060bda93ba26048a6d96c2") } on : shard0000 { "t"
: 13000, "i" : 0 }
{ "_id" : ObjectId("50060bda93ba26048a6d96c2") } -->> {
"_id" : ObjectId("50060bdb93ba26048a6dc560") } on : shard0000 { "t"
: 14000, "i" : 0 }
{ "_id" : ObjectId("50060bdb93ba26048a6dc560") } -->> {
"_id" : ObjectId("50060bdc93ba26048a6df4bb") } on : shard0000 { "t"
: 15000, "i" : 0 }
{ "_id" : ObjectId("50060bdc93ba26048a6df4bb") } -->> {
"_id" : ObjectId("50060bdd93ba26048a6e222d") } on : shard0000 { "t"
: 16000, "i" : 0 }
{ "_id" : ObjectId("50060bdd93ba26048a6e222d") } -->> {
"_id" : ObjectId("50060bde93ba26048a6e533e") } on : shard0000 { "t"
: 17000, "i" : 0 }
{ "_id" : ObjectId("50060bde93ba26048a6e533e") } -->> {
"_id" : ObjectId("50060bdf93ba26048a6e8230") } on : shard0000 { "t"
: 18000, "i" : 0 }
{ "_id" : ObjectId("50060bdf93ba26048a6e8230") } -->> {
"_id" : ObjectId("50060be093ba26048a6eb2e7") } on : shard0000 { "t"
: 19000, "i" : 0 }
{ "_id" : ObjectId("50060be093ba26048a6eb2e7") } -->> {
"_id" : { $maxKey : 1 } } on : shard0000 { "t" : 20000, "i" : 0
}
test.users2 chunks:
shard0001 18
shard0000 19
too many chunksn to print, use verbose if you want to force
print

推荐阅读
  • Allegro总结:1.防焊层(SolderMask):又称绿油层,PCB非布线层,用于制成丝网印板,将不需要焊接的地方涂上防焊剂.在防焊层上预留的焊盘大小要比实际的焊盘大一些,其差值一般 ... [详细]
  • Abp+MongoDb改造默认的审计日志存储位置
    一、背景在实际项目的开发当中,使用AbpZero自带的审计日志功能写入效率比较低。其次审计日志数据量中后期十分庞大,不适合与业务数据存放在一起。所以我们可以重新实现A ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • MongoDB用户验证auth的权限设置及角色说明
    本文介绍了MongoDB用户验证auth的权限设置,包括readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase、cluster相关的权限以及root权限等角色的说明和使用方法。 ... [详细]
  • centos php部署到nginx 404_NodeJS项目部署到阿里云ECS服务器全程详解
    本文转载自:http:www.kovli.com20170919ecs-deploy作者:Kovli本文详细介绍如何部署NodeJS项目到阿里云ECS上, ... [详细]
  • step1.为mongodb添加admin管理员root@12.154.29.163:~#mongoMongoDBshellversionv3.4.2connectingto:mo ... [详细]
  • 一、前言在数据库中,慢查询日志通常是用来进行优化数据库,MySQL中存在慢查询,Mongodb中也是如此。在Mongo中的慢查询属于Mon ... [详细]
  • 今天我们学习,数据库mongodb的使用,最下面有mongodb的下载链接。pipinstallpymongo首先安装pymongo,然后在需要用到的地方importpymongo ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
author-avatar
公民不是百姓2
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有