【Mongodb】Sharding 集群配置

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介:
mongodb的sharding集群由以下3个服务组成:
Shards  Server: 每个shard由一个或多个mongod进程组成,用于存储数据
Config  Server: 用于存储集群的Metadata信息,包括每个Shard的信息和chunks信息
Route   Server: 用于提供路由服务,由Client连接,使整个Cluster看起来像单个DB服务器
另外,Chunks是指MongoDB中一段连续的数据块,默认大小是200M,一个Chunk位于其中一台Shard服务器上
下面,搭建一个Cluster,它由4台服务器组成,包括3个Shard,3个Config,1个Route
搭建mongodb sharding 配置过程
1 创建数据存放目录
/opt/mongodata/r1
/opt/mongodata/r2
/opt/mongodata/r3
--注意配置顺序
rac1
mkdir  -p /opt/mongodata/config1
rac2
mkdir  -p /opt/mongodata/config2
rac3
mkdir  -p /opt/mongodata/config3
rac4
mkdir  -p /opt/mongodata/mongos
2 配置config
rac1
[mongodb@rac1 bin]$ ./mongod --configsvr --dbpath=/opt/mongodata/config1 --port 28001 --logpath=/opt/mongodata/config1/config.log &
[1] 19996
[mongodb@rac1 bin]$ all output going to: /opt/mongodata/config1/config.log
rac2
[mongodb@rac2 bin]$ ./mongod --configsvr --dbpath=/opt/mongodata/config2 --port 28002 --logpath=/opt/mongodata/config2/config.log &
[1] 27223
[mongodb@rac2 bin]$ all output going to: /opt/mongodata/config2/config.log
rac3
[mongodb@rac3 bin]$ ./mongod --configsvr --dbpath=/opt/mongodata/config3 --port 28003 --logpath=/opt/mongodata/config3/config.log &   
[1] 31020
[mongodb@rac3 bin]$ all output going to: /opt/mongodata/config3/config.log

3 配置路由设置
rac4
[mongodb@rac4 bin]$ ./mongos --chunkSize 1 --configdb "rac1:28001,rac2:28002,rac3:28003" --logpath /opt/mongodata/mongos/mongos.log &
NOTE:mongos 不需要-dbpath
4 配置sharding 节点
rac1
[mongodb@rac1 bin]$ ./mongod -shardsvr -dbpath=/opt/mongodata/r1 -port 27018 -logpath=/opt/mongodata/r1/27018.log &
rac2
[mongodb@rac2 bin]$ ./mongod -shardsvr -dbpath=/opt/mongodata/r2 -port 27019 -logpath=/opt/mongodata/r2/27019.log &
rac3
[mongodb@rac3 bin]$ ./mongod -shardsvr -dbpath=/opt/mongodata/r3 -port 27020 -logpath=/opt/mongodata/r3/27020.log &
5 在路由服务器上进行添加shard配置:
addshard : 添加 Shard Server,相关的命令还有 listshards 和 removeshard。如果是要添加replica set 的shard 其语法是:db.runCommand({addshard:'replica set 的名字/IP:PORT,[IP:PORT,...]'});
enablesharding : 用于设置可以被分布存储的数据库。
激活指定数据库的分片功能,这样数据库中的不同的collections会被分配到不同的shard上面,然而同一个collection会在同一个shard上面。
shardcollection : 用于设置具体被切块的集合名称,且必须指定 Shard Key,系统会自动创建索引。要进行collection级别的shard,必须执行
db.runCommand( { shardcollection : “”,key : });
namespace : 是collection的名字
shardkeypatternobject:片健,对一个集合进行分片时要设置一个字段或者说键作为拆分的依据。
Note:
1 要进行collection级别的shard 必须先激活数据库级别的shard。
2 Sharded Collection 只能有一个 unique index,且必须是 shard key。
官方文档:a sharded collection can have only one unique index, which must exist on the shard key.NO other unique indexes can exist on the collection. 
mongos> db.runCommand({addshard:'10.250.7.225:27018'});
{ "shardAdded" : "shard0000", "ok" : 1 }
mongos> db.runCommand({addshard:'10.250.7.249:27019'});
{ "shardAdded" : "shard0001", "ok" : 1 }
mongos> db.runCommand({addshard:'10.250.7.241:27020'});
{ "shardAdded" : "shard0002", "ok" : 1 }
当然如果是replica set + sharding 架构也可以使用db.runCommand({addshard:'replica set 的名字/IP:PORT,[IP:PORT,...]',name:"shard的名字",maxSize;N});
Name:用于指定每个shard的名字,不指定的话系统将自动分配
maxSize:指定各个shard可使用的最大磁盘空间,单位megabytes
mongos> 
mongos> db.runCommand({"enablesharding": "test"})
{ "ok" : 1 }
mongos> db.runCommand({listshards:1});
{
        "shards" : [
                {
                        "_id" : "shard0000",
                        "host" : "10.250.7.225:27018"
                },
                {
                        "_id" : "shard0001",
                        "host" : "10.250.7.249:27019"
                },
                {
                        "_id" : "shard0002",
                        "host" : "10.250.7.241:27020"
                }
        ],
        "ok" : 1
}
mongos> printShardingStatus();
--- Sharding Status --- 
  sharding version: { "_id" : 1, "version" : 3 }
  shards:
        {  "_id" : "shard0000",  "host" : "10.250.7.225:27018" }
        {  "_id" : "shard0001",  "host" : "10.250.7.249:27019" }
        {  "_id" : "shard0002",  "host" : "10.250.7.241:27020" }
  databases:
        {  "_id" : "admin",  "partitioned" : false,  "primary" : "config" }
        {  "_id" : "test",  "partitioned" : true,  "primary" : "shard0000" }

mongos> db.runCommand({shardcollection:'test.yql',key:{_id:1}, unique : true});
{ "collectionsharded" : "test.yql", "ok" : 1 }

mongos> use test
switched to db test
mongos> 
mongos> db.yql.insert({id:1,val:"this is a message on rac4 mongos !"});
mongos> db.yql.insert({id:2,val:"this is a message on rac4:27020 --2011-11-02 9:47!"});
mongos> db.yql.insert({id:2,val:"this is a message on rac4:27020 --2011-11-02 9:49!"});
mongos> db.yql.insert({id:3,val:"this is a message on rac4:27020 --2011-11-02 9:50!"});
mongos> db.yql.insert({id:4,val:"this is a message on rac4:27020 --2011-11-02 9:52!"});
mongos> db.yql.insert({id:5,val:"this is a message on rac4:27020 --2011-11-02 9:53!"});
mongos> db.yql.insert({id:6,val:"this is a message on rac4:27020 --2011-11-02 9:55!"});
mongos> db.yql.insert({id:7,val:"this is a message on rac4:27020 --2011-11-02 9:56!"});
mongos> db.yql.insert({id:8,val:"this is a message on rac4:27020 --2011-11-02 9:56!"});
mongos> db.yql.insert({id:9,val:"this is a message on rac4:27020 --2011-11-02 9:57!"});
mongos> db.yql.insert({id:10,val:"this is a message on rac4:27020 --2011-11-02 9:58!"});
mongos> db.yql.insert({id:11,val:"this is a message on rac4:27020 --2011-11-02 9:59!"});
mongos> db.yql.insert({id:12,val:"this is a message on rac4:27020 --2011-11-02 10:00!"});
mongos> db.yql.insert({id:13,val:"this is a message on rac4:27020 --2011-11-02 10:01!"});
mongos> db.yql.insert({id:14,val:"this is a message on rac4:27020 --2011-11-02 10:02!"});
mongos> db.yql.insert({id:15,val:"this is a message on rac4:27020 --2011-11-02 10:03!"});
mongos> db.yql.insert({id:16,val:"this is a message on rac4:27020 --2011-11-02 10:04!"});
mongos> db.yql.find();
{ "_id" : ObjectId("4eb298b3adbd9673afee95e3"), "id" : 1, "val" : "this is a message on rac4 mongos !" }
{ "_id" : ObjectId("4eb2995badbd9673afee95e4"), "id" : 2, "val" : "this is a message on rac4:27020 --2011-11-02 9:47!" }
{ "_id" : ObjectId("4eb29962adbd9673afee95e5"), "id" : 2, "val" : "this is a message on rac4:27020 --2011-11-02 9:49!" }
{ "_id" : ObjectId("4eb29970adbd9673afee95e6"), "id" : 3, "val" : "this is a message on rac4:27020 --2011-11-02 9:50!" }
{ "_id" : ObjectId("4eb2997badbd9673afee95e7"), "id" : 4, "val" : "this is a message on rac4:27020 --2011-11-02 9:52!" }
{ "_id" : ObjectId("4eb29985adbd9673afee95e8"), "id" : 5, "val" : "this is a message on rac4:27020 --2011-11-02 9:53!" }
{ "_id" : ObjectId("4eb299eaadbd9673afee95e9"), "id" : 6, "val" : "this is a message on rac4:27020 --2011-11-02 9:55!" }
{ "_id" : ObjectId("4eb299f3adbd9673afee95ea"), "id" : 7, "val" : "this is a message on rac4:27020 --2011-11-02 9:56!" }
{ "_id" : ObjectId("4eb29a59adbd9673afee95eb"), "id" : 8, "val" : "this is a message on rac4:27020 --2011-11-02 9:56!" }
{ "_id" : ObjectId("4eb29a59adbd9673afee95ec"), "id" : 9, "val" : "this is a message on rac4:27020 --2011-11-02 9:57!" }
{ "_id" : ObjectId("4eb29a59adbd9673afee95ed"), "id" : 10, "val" : "this is a message on rac4:27020 --2011-11-02 9:58!" }
{ "_id" : ObjectId("4eb29a59adbd9673afee95ee"), "id" : 11, "val" : "this is a message on rac4:27020 --2011-11-02 9:59!" }
{ "_id" : ObjectId("4eb29a59adbd9673afee95ef"), "id" : 12, "val" : "this is a message on rac4:27020 --2011-11-02 10:00!" }
{ "_id" : ObjectId("4eb29a59adbd9673afee95f0"), "id" : 13, "val" : "this is a message on rac4:27020 --2011-11-02 10:01!" }
{ "_id" : ObjectId("4eb29a59adbd9673afee95f1"), "id" : 14, "val" : "this is a message on rac4:27020 --2011-11-02 10:02!" }
{ "_id" : ObjectId("4eb29a59adbd9673afee95f2"), "id" : 15, "val" : "this is a message on rac4:27020 --2011-11-02 10:03!" }
{ "_id" : ObjectId("4eb29a59adbd9673afee95f3"), "id" : 16, "val" : "this is a message on rac4:27020 --2011-11-02 10:04!" }
db..stats() 可以查看具体的 Shard 存储信息 
mongos> db.yql.stats();
{
        "sharded" : true,
        "flags" : 1,
        "ns" : "test.yql",
        "count" : 17,
        "numExtents" : 1,
        "size" : 1616,
        "storageSize" : 8192,
        "totalIndexSize" : 8176,
        "indexSizes" : {
                "_id_" : 8176
        },
        "avgObjSize" : 95.05882352941177,
        "nindexes" : 1,
        "nchunks" : 1,
        "shards" : {
           "shard0000" : { --表示yql被拆分到了 10.250.7.225这台机器上了
                        "ns" : "test.yql",
                        "count" : 17,
                        "size" : 1616,
                        "avgObjSize" : 95.05882352941177,
                        "storageSize" : 8192,
                        "numExtents" : 1,
                        "nindexes" : 1,
                        "lastExtentSize" : 8192,
                        "paddingFactor" : 1,
                        "flags" : 1,
                        "totalIndexSize" : 8176,
                        "indexSizes" : {
                                "_id_" : 8176
                        },
                        "ok" : 1
                }
        },
        "ok" : 1
}
mongos> 
相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
3月前
|
存储 NoSQL 算法
MongoDB保姆级指南(中):从副本集群、分片集群起航,探索分布式存储的趋势!
本文一起来聊聊MongoDB集群,顺带以MongoDB集群为起点,共同探讨一下分布式存储的发展趋势~
235 15
|
4月前
|
自然语言处理 运维 NoSQL
MongoDB集群同步
实现 MongoDB Cluster-to-Cluster 即集群同步的工具是:mongosync 详情可参考如下官方文档: https://www.mongodb.com/zh-cn/docs/cluster-to-cluster-sync/current/quickstart/ 以上这个地址的文档一看就是机器翻译的,可能有不恰当的地方,但基本可参考使用。 以下是本次在某项目地配置集群同步的简要步骤,可参考使用。
87 6
|
3月前
|
存储 运维 NoSQL
轻松上手:逐步搭建你的高可用MongoDB集群(分片)
【8月更文挑战第13天】在数据激增的背景下,传统单机数据库难以胜任。MongoDB作为流行NoSQL数据库,采用分片技术实现水平扩展,有效处理海量数据。分片将数据分散存储,提高并发处理能力和容错性,是高可用架构基石。构建MongoDB集群需理解shard、config server和router三组件协同工作原理。通过具体实例演示集群搭建流程,包括各组件的启动及配置,确保数据高可用性和系统稳定性。合理规划与实践可构建高效稳定的MongoDB集群,满足业务需求并支持未来扩展。
92 0
|
3月前
|
NoSQL MongoDB Windows
MongoDB 读写分离——Windows MongoDB 副本集配置
MongoDB 读写分离——Windows MongoDB 副本集配置
68 0
|
5月前
|
存储 负载均衡 NoSQL
MongoDB的架构设计基于三种集群模式
【6月更文挑战第5天】MongoDB的架构设计基于三种集群模式
226 3
|
4月前
|
存储 NoSQL 关系型数据库
MongoDB的配置服务器和复制机制
【7月更文挑战第2天】MongoDB配置服务器存储分片和权限元数据,支持在主节点故障时保持读服务。关键组件,性能影响显著。复制集包含Primary和Secondary,通过oplog实现数据同步,类似MySQL binlog。oplog的幂等性可能导致大量set操作,且大小受限,可能导致从节点需全量同步。读写分离提升效率,主从切换确保高可用。
52 0
|
5月前
|
安全 NoSQL 程序员
老程序员分享:mongodb4.xxx安装,和基本配置
老程序员分享:mongodb4.xxx安装,和基本配置
51 0
|
6月前
|
监控 NoSQL 安全
【MongoDB 专栏】MongoDB 的复制集:高可用性配置
【5月更文挑战第10天】MongoDB的复制集是实现数据高可用性的重要机制,由主节点和次节点构成,主节点处理写操作,次节点同步数据确保一致。在主节点故障时,次节点自动提升接替,保证服务不间断。通过复制集,可实现数据保护、持续服务,适用于关键业务系统和数据备份。配置时需关注网络稳定性、节点性能和数据一致性。案例显示,复制集能有效保障服务高可用,防止数据丢失和业务中断,是现代数据库管理的关键工具。在数据驱动的世界,复制集为高可用性提供了坚实保障。
142 0
【MongoDB 专栏】MongoDB 的复制集:高可用性配置
|
6月前
|
DataWorks NoSQL 关系型数据库
DataWorks操作报错合集之在使用 DataWorks 进行 MongoDB 同步时遇到了连通性测试失败,实例配置和 MongoDB 白名单配置均正确,且同 VPC 下 MySQL 可以成功连接并同步,但 MongoDB 却无法完成同样的操作如何解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
102 1
|
6月前
|
存储 缓存 NoSQL