MongoDB数据库中配置sharding
作者:路霄峰_121 | 来源:互联网 | 2014-05-28 16:53
这里先介绍sharding的架构和几个基本概念术语。shardserver:shardserver可以使一个mongod实例,也可以是replicaset。configsever:为了将指定collection存储在多个shard中,那么就需要个key来进行分割,configserver存储各个节点的配置信息。shar
这里先介绍sharding的架构和几个基本概念术语。
shard server :shard server可以使一个mongod实例,也可以是replica set。
config sever:为了将指定collection存储在多个shard中,那么就需要个key来进行分割,config
server存储各个节点的配置信息。shard key的范围,以及分布情况。
route process:由此介入客户端,通过询问config
server,确定到那个shard上面查询,在连接相应的shard操作,不保存数据和配置信息。
由于资源限制,在一台机子上做一下实验
Shard Server 1:30000
Shard Server 2:30001
Config Server :40000
Route Process:50000
步骤:
启动shard server 1和2
[mongo@172_16_3_216 mongo]$ mkdir -p /mongo/shard/data0
[mongo@172_16_3_216 mongo]$ mkdir -p /mongo/shard/data1
[mongo@172_16_3_216 mongo]$ touch shard.log
[mongo@172_16_3_216 mongo]$ mongod --shardsvr --port 30000 --dbpath
/mongo/shard/data0 --fork --logpath shard.log --directoryperdb
[mongo@172_16_3_216 mongo]$ touch shard1.log
[mongo@172_16_3_216 mongo]$ mongod --shardsvr --port 30001 --dbpath
/mongo/shard/data1 --fork --logpath shard1.log --directoryperdb
启动config server
[mongo@172_16_3_216 mongo]$ mkdir -p /mongo/shard/config
[mongo@172_16_3_216 mongo]$ touch config.log
[mongo@172_16_3_216 mongo]$ mongod --configsvr --port 40000
--dbpath /mongo/shard/config --fork --logpath config.log
--directoryperdb
启动route process
[mongo@172_16_3_216 mongo]$ touch route.log
[mongo@172_16_3_216 mongo]$ mongos --port 50000 --configdb
localhost:40000 --fork --logpath route.log --chunkSize 2
初始化sharding
mongo admin --port 50000
MongoDB shell version: 1.8.4
connecting to: 127.0.0.1:50000/admin
>
db.runCommand({addshard:"localhost:30000"})
----添加shard1
{ "shardAdded" : "shard0000", "ok" : 1 }
>
db.runCommand({addshard:"localhost:30001"})
-----添加shard2
{ "shardAdded" : "shard0001", "ok" : 1 }
>
db.runCommand({enablesharding:"test"})
---对数据库test分片
{ "ok" : 1 }
>
db.runCommand({shardcollection:"test.tb1",key:{_id:1}})
---对数据库test中tb1按_id作为key
{ "collectionsharded" : "test.tb1", "ok" : 1 }
验证sharding
> for (var i=1;i<=50000;i++)
db.tb1.insert({age:i,name:"hank",addr:"HangZhou"})
> db.tb1.stats()
{
"sharded" : true,
"ns" : "test.tb1",
"count" : 50000,
"size" : 3600016,
"avgObjSize" :
72.00032,
"storageSize" :
13975552,
"nindexes" : 1,
"nchunks" : 4,
"shards" : {
"shard0000" : {
"ns" : "test.tb1",
"count" : 17888,
"size" : 1287944,
"avgObjSize" : 72.00044722719142,
"storageSize" : 2793472,
"numExtents" : 5,
"nindexes" : 1,
"lastExtentSize" : 2097152,
"paddingFactor" : 1,
"flags" : 1,
"totalIndexSize" : 753664,
"indexSizes" : {
"_id_" : 753664
},
"ok" : 1
},
"shard0001" : {
"ns" : "test.tb1",
"count" : 32112,
"size" : 2312072,
"avgObjSize" : 72.00024912805182,
"storageSize" : 11182080,
"numExtents" : 6,
"nindexes" : 1,
"lastExtentSize" : 8388608,
"paddingFactor" : 1,
"flags" : 1,
"totalIndexSize" : 1343488,
"indexSizes" : {
"_id_" : 1343488
},
"ok" : 1
}
},
"ok" : 1
}
查看sharding信息:
> db.runCommand({listshards:1})
{
"shards" : [
{
"_id" : "shard0000",
"host" : "localhost:30000"
},
{
"_id" : "shard0001",
"host" : "localhost:30001"
}
],
"ok" : 1
}
新增shard server:
[mongo@172_16_3_216 mongo]$ mkdir -p /mongo/shard/data2
[mongo@172_16_3_216 mongo]$ touch shard2.log
[mongo@172_16_3_216 mongo]$ mongod --shardsvr --port 30002
--dbpath /mongo/shard/data2 --fork --logpath shard2.log
--directoryperdb
> db.runCommand({ addshard:"localhost:30002" })
{ "shardAdded" : "shard0002", "ok" : 1 }
> db.runCommand({listshards:1})
{
"shards" : [
{
"_id" : "shard0000",
"host" : "localhost:30000"
},
{
"_id" : "shard0001",
"host" : "localhost:30001"
},
{
"_id" : "shard0002",
"host" : "localhost:30002"
}
],
"ok" : 1
}
如果分片的表继续有插入数据,那么数据就会分配到新加的片上,而且会根据sharding key进行数据的迁移,和重新分布。
所以建议在添加删除节点的时候,建议避开高峰期,在业务最低谷的时候操作。
删除shard server:
> use admin
switched to db admin
> db.runCommand({"removeshard" : "localhost:30002"});
{
"msg" : "draining
started successfully",
"state" : "started",
"shard" :
"shard0002",
"ok" : 1
}
很简单,remove就可以了,原来的数据会按照key分配到剩下的shard server上。
最后> db.printShardingStatus()可以查看sharding的信息。注意:操作都是在route
process上面,不要登录到shard server操作。
推荐阅读
第一步java代码条件匹配与之对应的mongo数据查询第二步:java代码分组查询与之所对应的mongodb中sheel与所得出的表点击某个_id字段进入,所得出的图表为第三步:在 ...
[详细]
蜡笔小新 2024-11-17 14:07:35
本文介绍了NoSQL数据库的概念及其应用场景,重点解析了MongoDB的基本特性、数据结构以及常用操作。MongoDB是一个高性能、高可用且易于扩展的文档数据库系统。 ...
[详细]
蜡笔小新 2024-11-15 10:24:19
在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ...
[详细]
蜡笔小新 2024-11-11 18:27:44
V8不仅是一款著名的八缸发动机,广泛应用于道奇Charger、宾利Continental GT和BossHoss摩托车中。自2008年以来,作为Chromium项目的一部分,V8 JavaScript引擎在性能优化和技术创新方面取得了显著进展。该引擎通过先进的编译技术和高效的垃圾回收机制,显著提升了JavaScript的执行效率,为现代Web应用提供了强大的支持。持续的优化和创新使得V8在处理复杂计算和大规模数据时表现更加出色,成为众多开发者和企业的首选。 ...
[详细]
蜡笔小新 2024-11-09 15:56:40
小王详解:内部网络中最易理解的NAT原理剖析,挑战你的认知极限 ...
[详细]
蜡笔小新 2024-11-07 15:11:42
本文讨论了一种特定的查询需求,即在提到某一品牌时同时查询到哪些其他品牌,并分析了不同数据库对这种需求的支持情况。 ...
[详细]
蜡笔小新 2024-11-15 15:38:27
本文介绍了多种开源数据库及其核心数据结构和算法,包括MySQL的B+树、MVCC和WAL,MongoDB的tokuDB和cola,boltDB的追加仅树和mmap,levelDB的LSM树,以及内存缓存中的一致性哈希。 ...
[详细]
蜡笔小新 2024-11-14 12:53:50
本文档详细介绍了如何在OpenShift 4.x环境中部署一个包含MongoDB数据库和Node.js后端及前端的多层应用程序。通过逐步指导,读者可以轻松完成整个部署过程。 ...
[详细]
蜡笔小新 2024-11-14 11:29:04
探讨在 MongoDB 副本集中因故障导致只剩两个从节点时的解决方案和影响 ...
[详细]
蜡笔小新 2024-11-12 15:37:28
在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ...
[详细]
蜡笔小新 2024-11-11 19:36:19
### 优化后的摘要本学习指南旨在帮助读者全面掌握 Bootstrap 前端框架的核心知识点与实战技巧。内容涵盖基础入门、核心功能和高级应用。第一章通过一个简单的“Hello World”示例,介绍 Bootstrap 的基本用法和快速上手方法。第二章深入探讨 Bootstrap 与 JSP 集成的细节,揭示两者结合的优势和应用场景。第三章则进一步讲解 Bootstrap 的高级特性,如响应式设计和组件定制,为开发者提供全方位的技术支持。 ...
[详细]
蜡笔小新 2024-11-09 16:58:21
本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ...
[详细]
蜡笔小新 2024-11-09 14:47:28
本指南介绍了 `requests` 库的基本使用方法,详细解释了其七个主要函数。其中,`requests.request()` 是构建请求的基础方法,支持其他高级功能的实现。此外,我们还重点介绍了如何使用 `requests.get()` 方法来获取 HTML 网页内容,这是进行网页数据抓取和解析的重要步骤。通过这些基础方法,读者可以轻松上手并掌握网页数据抓取的核心技巧。 ...
[详细]
蜡笔小新 2024-11-08 17:56:30
本文详细解析了 Oracle 数据库中的字符集机制,通过图表展示了不同字符集之间的转换过程,并针对中文乱码问题提供了有效的解决方案。文章深入探讨了字符集配置、数据迁移和兼容性问题,为数据库管理员和开发人员提供了实用的参考和指导。 ...
[详细]
蜡笔小新 2024-11-08 11:50:24
Kubernetes 在云原生环境中的应用日益广泛,然而集群管理的复杂性也随之增加。为了提高管理效率,本文推荐了七款专业工具,这些工具不仅能够简化日常操作,还能提升系统的稳定性和安全性。从自动化部署到监控和故障排查,这些工具覆盖了集群管理的各个方面,帮助管理员更好地应对挑战。 ...
[详细]
蜡笔小新 2024-11-07 17:01:31