MongoDB Sharding Cluster是一种可以水平扩展的模式,在数据量很大时特给力,一直想研究一下,要构建一个MongoDB Sharding Cluster,需要三种角色:
1. Shard Server: mongod实例,用于存储实际的数据块,实际生产环境中一个Shard Server角色可由几台机器组个一个Replica Set承担,防止主机单点故障。
2. Config Server: mongod实例,存储了整个Cluster Metadata,其中包括Chunk信息。
3. Route Server: mongos实例,前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用。
Sharding架构图如下:
因为是实验环境,我这里只是用一台Linux服务器,基本信息如下:
1. 3个分片Sharding
2. 每一个分片由3个节点构成1主2备的Replica Set
3. 3个配置节点Configsvr
4. 1个路由节点Mongos
分片复制集A(三个分片节点构成一个复制集):127.0.0.1:10000 127.0.0.1:10001 127.0.0.1:10002
分片复制集B(三个分片节点构成一个复制集):127.0.0.1:20000 127.0.0.1:20001 127.0.0.1:20002
分片复制集C(三个分片节点构成一个复制集):127.0.0.1:30000 127.0.0.1:30001 127.0.0.1:30002
Configsvr(三个配置服务器节点):127.0.0.1:40000 127.0.0.1:40001 127.0.0.1:40002
Mongos(一个路由节点):127.0.0.1:50000
详细操作步骤如下:
1. 下载并安装MongoDB,并创建MongoDB用户
- tar zxvf mongodb-linux-i686-2.0.4.tgz -C /usr/local/
-
mv /usr/local/mongodb-linux-i686-2.0.4/ /usr/local/mongodb/
-
ln -s /usr/local/mongodb/bin/* /usr/bin/
-
- groupadd -g 20001 mongodb
- useradd -u 20001 -g mongodb mongodb
-
- su - mongodb
2. 创建相关目录
- mkdir -p /home/mongodb/data/shard1/r0
- mkdir -p /home/mongodb/data/shard1/r1
- mkdir -p /home/mongodb/data/shard1/r2
- mkdir -p /home/mongodb/data/shard1/config
-
- mkdir -p /home/mongodb/data/shard2/r0
- mkdir -p /home/mongodb/data/shard2/r1
- mkdir -p /home/mongodb/data/shard2/r2
- mkdir -p /home/mongodb/data/shard2/config
-
- mkdir -p /home/mongodb/data/shard3/r0
- mkdir -p /home/mongodb/data/shard3/r1
- mkdir -p /home/mongodb/data/shard3/r2
- mkdir -p /home/mongodb/data/shard3/config
3. 创建Sharding和Replica Set
(1) 创建并配置第一组
- mongod -shardsvr -replSet shard1 -port 10000 -dbpath /home/mongodb/data/shard1/r0 -oplogSize 64 -logpath /home/mongodb/data/shard1/r0.log -logappend -fork
- mongod -shardsvr -replSet shard1 -port 10001 -dbpath /home/mongodb/data/shard1/r1 -oplogSize 64 -logpath /home/mongodb/data/shard1/r1.log -logappend -fork
- mongod -shardsvr -replSet shard1 -port 10002 -dbpath /home/mongodb/data/shard1/r2 -oplogSize 64 -logpath /home/mongodb/data/shard1/r2.log -logappend -fork
-
- mongo 127.0.0.1:10000/admin
-
-
config={_id: 'shard1', members: [{_id: 0, host: '127.0.0.1:10000'}, {_id: 1, host: '127.0.0.1:10001'}, {_id: 2, host: '127.0.0.1:10002'}]}
- rs.initiate(config);
(2) 创建并配置第二组
- mongod -shardsvr -replSet shard2 -port 20000 -dbpath /home/mongodb/data/shard2/r0 -oplogSize 64 -logpath /home/mongodb/data/shard2/r0.log -logappend -fork
- mongod -shardsvr -replSet shard2 -port 20001 -dbpath /home/mongodb/data/shard2/r1 -oplogSize 64 -logpath /home/mongodb/data/shard2/r1.log -logappend -fork
- mongod -shardsvr -replSet shard2 -port 20002 -dbpath /home/mongodb/data/shard2/r2 -oplogSize 64 -logpath /home/mongodb/data/shard2/r2.log -logappend -fork
-
- mongo 127.0.0.1:20000/admin
-
-
config={_id: 'shard2', members: [{_id: 0, host: '127.0.0.1:20000'}, {_id: 1, host: '127.0.0.1:20001'}, {_id: 2, host: '127.0.0.1:20002'}]}
- rs.initiate(config);
(3) 创建并配置第三组
- mongod -shardsvr -replSet shard3 -port 30000 -dbpath /home/mongodb/data/shard3/r0 -oplogSize 64 -logpath /home/mongodb/data/shard3/r0.log -logappend -fork
- mongod -shardsvr -replSet shard3 -port 30001 -dbpath /home/mongodb/data/shard3/r1 -oplogSize 64 -logpath /home/mongodb/data/shard3/r1.log -logappend -fork
- mongod -shardsvr -replSet shard3 -port 30002 -dbpath /home/mongodb/data/shard3/r2 -oplogSize 64 -logpath /home/mongodb/data/shard3/r2.log -logappend -fork
-
- mongo 127.0.0.1:30000/admin
-
-
config={_id: 'shard3', members: [{_id: 0, host: '127.0.0.1:30000'}, {_id: 1, host: '127.0.0.1:30001'}, {_id: 2, host: '127.0.0.1:30002'}]}
- rs.initiate(config);
4. 启动三个配置服务节点Configsvr
- mongod -configsvr -dbpath /home/mongodb/data/shard1/config -port 40000 -logpath /home/mongodb/data/shard1/config.log -logappend -fork
- mongod -configsvr -dbpath /home/mongodb/data/shard2/config -port 40001 -logpath /home/mongodb/data/shard2/config.log -logappend -fork
- mongod -configsvr -dbpath /home/mongodb/data/shard3/config -port 40002 -logpath /home/mongodb/data/shard3/config.log -logappend -fork
5. 启动一个路由点Mongos
- mongos -configdb 127.0.0.1:40000,127.0.0.1:40001,127.0.0.1:40002 -port 50000 -chunkSize 5 -logpath /home/mongodb/data/mongos.log -logappend -fork
6. 配置分片
- mongo 127.0.0.1:50000/admin
-
-
db.runCommand({addshard:"shard1/127.0.0.1:10000,127.0.0.1:10001,127.0.0.1:10002",name:"ShardSetA"})
-
db.runCommand({addshard:"shard2/127.0.0.1:20000,127.0.0.1:20001,127.0.0.1:20002",name:"ShardSetB"})
-
db.runCommand({addshard:"shard3/127.0.0.1:30000,127.0.0.1:30001,127.0.0.1:30002",name:"ShardSetC"})
7. 查看配置结果
- mongos> db.runCommand({listshards: 1})
- {
-
"shards" : [
- {
-
"_id" : "ShardSetA",
-
"host" : "shard1/127.0.0.1:10000,127.0.0.1:10001,127.0.0.1:10002"
- },
- {
-
"_id" : "ShardSetB",
-
"host" : "shard2/127.0.0.1:20000,127.0.0.1:20001,127.0.0.1:20002"
- },
- {
-
"_id" : "ShardSetC",
-
"host" : "shard3/127.0.0.1:30000,127.0.0.1:30001,127.0.0.1:30002"
- }
- ],
-
"ok" : 1
- }
- mongos>
8. 如果不激活数据库分片,数据库只会存在一个Shard中,一旦激活数据库分片,数据库中不同的Collection将被存放在不同的Shard上,但一个Collection仍旧存放在同一个Shard上,要使单个Collection也分片,还需单独对Collection作些操作。
- mongos> db.runCommand({enablesharding:"test"});
-
{ "ok" : 1 }
9. 要使单个Collection也分片存储,需要给Collection指定一个分片key,通过以下命令操作:
- mongos> db.runCommand({shardcollection:"test.c1",key:{id:1}})
-
{ "collectionsharded" : "test.c1", "ok" : 1 }
10. 查看Collection分片信息
- mongos> for (var i = 1; i <= 13210; i++) db.c1.save({id:i,value1:"1234567890",value2:"1234567890",value3:"1234567890",value4:"1234567890"});
- mongos> db.c1.stats();
- {
-
"sharded" : false,
-
"primary" : "config",
-
"ns" : "admin.c1",
-
"count" : 13210,
-
"size" : 1690880,
-
"avgObjSize" : 128,
-
"storageSize" : 2793472,
-
"numExtents" : 5,
-
"nindexes" : 1,
-
"lastExtentSize" : 2097152,
-
"paddingFactor" : 1,
-
"flags" : 1,
-
"totalIndexSize" : 457856,
-
"indexSizes" : {
-
"_id_" : 457856
- },
-
"ok" : 1
- }
分享到:
相关推荐
MongoDB Sharding 机制分析 MongoDB Sharding 机制是 MongoDB 中的一种机制,用于将数据水平切分到不同的物理节点,以...因此,MongoDB 的 Sharding 机制可以解决单机性能极限的问题,提高数据库的可扩展性和可靠性。
MongoDB 3.2 是一款高性能、开源的NoSQL数据库系统,在分布式环境下提供了丰富的功能支持,特别是其Sharding(分片)特性,使得它能够很好地支持大规模数据处理场景。本文将围绕基于MongoDB 3.2构建的真实生产环境...
1. **Config Server**:配置服务器存储每个shard节点的配置信息、每个chunk的shard key范围、chunk在各shard的分布情况以及集群中所有DB和collection的sharding配置信息。 2. **Replica Set**:主从配置(master-...
- MongoDB的组件介绍(如mongod、mongos、config servers等)。 - 复制集(Replica Sets)的原理与配置方法。 - 分片集群(Sharded Cluster)的设计思路和实现方式。 5. **数据模型设计** - 如何有效地设计...
### 高可用的MongoDB集群 #### 一、概述 MongoDB是一款强大的、开源的、模式自由的文档型数据库,采用C++语言...通过以上步骤,我们可以成功搭建起一个高可用的MongoDB集群,以满足各种复杂的数据存储和访问需求。
在本文档中,我们将详细介绍如何在CentOS 7.0系统上搭建基于MongoDB 3.4.3版本的集群环境,包括分片(sharding)和副本集(replica sets)的配置。本文档将介绍相关概念、环境准备、机器规划及端口分配、集群搭建的...
6. **管理**:MongoDB提供了丰富的管理工具,如`mongoimport`和`mongoexport`用于数据导入导出,以及`mongodump`和`mongorestore`用于备份和恢复。 MongoDB 3.2.22版本虽然已经相对老旧,但它仍是一个稳定可靠的...
MongoDB是一款广泛使用的开源文档数据库系统,以其灵活性、可扩展性和高性能而闻名。在实际运行中,MongoDB的性能调优是一项关键任务,它能够帮助我们优化查询速度、提高资源利用率,确保系统的稳定运行和高效服务。...
例如,可以通过调整缓存设置、使用 Sharding 或 Replication 来提高 Solr 集群的性能和可用性。此外,Solr 支持多种数据源,不仅限于 MySQL,还包括 Oracle、MongoDB 等。 总之,将 MySQL 数据导入 Solr 5.3.1 需要...