Mongodb Sharding 分片

Mongodb Sharding

介绍 Sharding in MongoDB

分片组建:

Shards(建议用Replica)、Query Routers、Config Servers。

Shards store the data. To provide high availability and dataconsistency, in a production sharded cluster, each shard is a replica
set
 [1].For more information on replica sets, see ReplicaSets.

Query Routers, or mongos instances,
interface with clientapplications and direct operations to the appropriate shard or shards. Thequery router processes and targets operations to shards and then returnsresults to the clients. A sharded cluster can contain more than one queryrouter to divide
the client request load. A client sends requests to one queryrouter. Most sharded clusters have many query routers.

Config servers store thecluster’s metadata. This data contains a mapping of the cluster’s data set tothe shards. The query router uses this
metadata to target operations tospecific shards. Production sharded clusters have exactly 3 config servers.


[1]


For development and testing purposes only, each shard can be a single mongod instead
of a replica set. Donot deploy production clusters without 3 config servers.

分片类型:Range和Hash

比较总结:线性用range散列用hash。

详细的就不从官网复制了。

环境准备:

分片结构分布如下:

ShardServer 1:27020

ShardServer 2:27021

ShardServer 3:27022

ShardServer 4:27023

ConfigServer :27100

RouteProcess:40000

ShardServer 5:27024(模拟新增服务节点)

步骤一:启动Shard Server

mongod--port 27020 --dbpath=F:\DingSai\Mongodb\shard\rs1\data --logpath=F:\DingSai\Mongodb\shard\rs1\logs\mongodb.log --logappend

mongod--port 27021 --dbpath=F:\DingSai\Mongodb\shard\rs2\data --logpath=F:\DingSai\Mongodb\shard\rs2\logs\mongodb.log --logappend

mongod--port 27022 --dbpath=F:\DingSai\Mongodb\shard\rs3\data --logpath=F:\DingSai\Mongodb\shard\rs3\logs\mongodb.log --logappend

mongod--port 27023 --dbpath=F:\DingSai\Mongodb\shard\rs4\data  --logpath=F:\DingSai\Mongodb\shard\rs4\logs\mongodb.log--logappend

步骤二: 启动ConfigServer

mongod--port 27100 --dbpath=F:\DingSai\Mongodb\shard\config\data--logpath=F:\DingSai\Mongodb\shard\config\logs\mongodb.log --logappend

注意:这里我们完全可以像启动普通mongodb服务一样启动,不需要添加—shardsvr和configsvr参数。因为这两个参数的作用就是改变启动端口的,所以我们自行指定了端口就可以。

步骤三: 启动RouteProcess

mongos --port 40000 --configdblocalhost:27100 --logpath=F:\DingSai\Mongodb\shard\RouteProcess\logs\route.log --chunkSize 500

mongos启动参数中,chunkSize这一项是用来指定chunk的大小的,单位是MB,默认大小为200MB.

步骤四: 配置Sharding

接下来,我们使用MongoDB Shell登录到mongos,添加Shard节点

bin/mongoadmin --port 40000

MongoDBshell version: 2.0.7

connectingto: 127.0.0.1:40000/admin

use admin

mongos>db.runCommand({ addshard:"localhost:27020" })

mongos>db.runCommand({ addshard:"localhost:27021" })

mongos>db.runCommand({ addshard:"localhost:27022" })

mongos>db.runCommand({ addshard:"localhost:27023" })

--可以添加节点名db.runCommand({addshard : "192.168.253.212:27017",  "name" : "XXX Server" });

--对数据库 ding 启用分片

mongos>db.runCommand({ enablesharding:"ding" })

--对数据库  ding 下面的  c2  表,启用分片--按照 _id 列进行分片

mongos>db.runCommand({shardcollection: "ding.c2", key: {_id:1}}

步骤五:测试

插入数据:

mongoadmin --port 40000

--切换数据库

useding

##插入5万行

mongos>for(var i=0;i<500;i++){ db.c2.insert({name:‘dingsai‘+i,seq:i}) }

##查看记录

mongos>  db.c2.find().count()

--查看分片状态

db.printShardingStatus()

或者sh.status();

mongos> db.printShardingStatus()

---Sharding Status ---

sharding version: {

"_id" : 1,

"version" : 4,

"minCompatibleVersion" : 4,

"currentVersion" : 5,

"clusterId" :ObjectId("54dffdc6d33e0feb326a8f90")

}

shards:

{ "_id" : "shard0000", "host" : "localhost:27020" }

{ "_id" : "shard0001", "host" : "localhost:27021" }

{ "_id" : "shard0002", "host" : "localhost:27022" }

{ "_id" : "shard0003", "host" : "localhost:27023" }

databases:

{ "_id" : "ding", "partitioned" : true, "primary" : "shard0001" }

ding.c2

shard key: {"_id" : 1 }

chunks:

shard0000       1

shard0001       1

shard0002       1

{ "_id" : {"$minKey" : 1 } } -->> { "_id" :ObjectId("54e009d6752aea9c8fc3d25a") } on :shard0000 Timestamp(2, 0)

{ "_id" :ObjectId("54e009d6752aea9c8fc3d25a") } -->> { "_id" :ObjectId("54e00a76752aea9c8fc3e684") } on :shard0001 Timestamp(3, 1)

{ "_id" :ObjectId("54e00a76752aea9c8fc3e684") } -->> { "_id" :{ "$maxKey" : 1 } } on :shard0002 Timestamp(3, 0)

}

数据存储在三个节点上

新增分片节点开启服务:

bin/mongod--port 27024 --dbpath=F:\DingSai\Mongodb\shard\rs5\data --logpath=F:\DingSai\Mongodb\shard\rs5\logs\mongodb.log --logappend

登录RouteProcess:

mongoadmin --port 40000

useadmin

增加27024

mongos>db.runCommand({addshard : "localhost:27024"});

删除分片节点

删除sharding节点时,需要一定的时间,多次执行删除语句可查看当前删除中的状态

删除27021-shard0001分片开始删除

mongos>  db.runCommand({removeShard :"shard0001" });

{

"msg" : "drainingstarted successfully",

"state" : "started",

"shard" :"shard0001",

"note" : "you need todrop or movePrimary these databases",

"dbsToMove" : [

"ding"

],

"ok" : 1

}

 查看当前删除状态 删除中

mongos>db.runCommand({removeShard : "shard0001" });

{

"msg" : "draining ongoing",

"state" : "ongoing",

"remaining" : {

"chunks" :NumberLong(0),

"dbs" : NumberLong(1)

},

"note" : "you need todrop or movePrimary these databases",

"dbsToMove" : [

"ding"

],

"ok" : 1

}

查看当前删除状态 删除完成

mongos>db.runCommand({removeShard : "shard0001" });

{

"ok" : 0,

"errmsg" : "removeShardmay only be run against the admin database.",

"code" : 13

}

再次查看parding状态

ongos>db.printShardingStatus()

--Sharding Status ---

sharding version: {

"_id" : 1,

"version" : 4,

"minCompatibleVersion" : 4,

"currentVersion" : 5,

"clusterId" :ObjectId("54dffdc6d33e0feb326a8f90")

shards:

{ "_id" : "shard0000", "host" : "localhost:27020" }

{ "_id" : "shard0001", "host" : "localhost:27021",  "draining" :true }

{ "_id" : "shard0002", "host" : "localhost:27022" }

{ "_id" : "shard0003", "host" : "localhost:27023" }

{ "_id" : "shard0004", "host" : "localhost:27024" }

databases:

{ "_id" : "ding", "partitioned" : true, "primary" : "shard0001" }

ding.c2

shard key: {"_id" : 1 }

chunks:

shard0000       1

shard0003       1

shard0002       1

{ "_id" : {"$minKey" : 1 } } -->> { "_id" :ObjectId("54e009d6752aea9c8fc3d25a") } on :shard0000 Timestamp(2, 0)

{ "_id" :ObjectId("54e009d6752aea9c8fc3d25a") } -->> { "_id" :ObjectId("54e00a76752aea9c8fc3e684") } on :shard0003 Timestamp(4, 0)

{ "_id" :ObjectId("54e00a76752aea9c8fc3e684") } -->> { "_id" :{ "$maxKey" : 1 } } on :shard0002 Timestamp(3, 0)

ongos>

发现:shard0001号机器状态为draining:true

数据也已经从shard0001移到别的节点上。

节点损坏查询:

1.  关闭27002端口节点

2.查看损坏节点信息:mongos>use config

switchedto db config

mongos>db.mongos.find()

{"_id" : "hpo-PC:40000", "ping" :ISODate("2015-02-15T03:36:40.670Z"), "up" : 5762,"waiting" : false, "mongoVersion" : "2.6.6" }

mongos>

3.重启27002后正常使用

步骤六:数据备份

导出ding数据库 到ding文件夹

mongodump-db ding -out F:\DingSai\Mongodb\bin\ding\ -h localhost:40000

总结:

什么时候使用Sharding

1.  复制所有的写入操作到主节点

2.  延迟的敏感数据会在主节点查询

3.  单个副本集限制在12个节点

4.  当请求量巨大时会出现内存不足。

5.  本地磁盘不足

6.  垂直扩展价格昂贵

以上只是简单的实现,官网推荐使用副本集(Replica Set)作为分片节点。解决系统单点问题。

改天有时间再实现。

问题:

Windows32位有2G文件限制,使用的时候注意。

IMPORTANT

Ittakes time and resources to deploy sharding. If your system has already reachedor exceeded its capacity, it will be difficult to deploy sharding withoutimpacting your application.

Asa result, if you think you will need to partition your database in the future,do not wait until your system is over capacity to enable sharding.

时间: 2024-11-08 22:10:14

Mongodb Sharding 分片的相关文章

57-4 数据库分片概念及mongodb sharding的实现

04 数据库分片的概念及mongodb sharding的实现 配置环境: node1: 192.168.1.121 CentOS release 6.7 node2: 192.168.1.122 CentOS release 6.7 node3: 192.168.1.123 CentOS release 6.7 [[email protected] ~]# vim /etc/hosts 添加 192.168.1.121   node1 192.168.1.122   node2 192.168

第五部分 架构篇 第十六章 MongoDB Sharding 架构(理解分片)

1.简介 这是一种将海量的数据水平扩展的数据库集群系统,数据分表存储在sharding的各个节点上,使用者通过简单的配置就可以很方便地构建一个分布式的MongoDB集群. 那么首先我们应该理解何为分片(sharding)以及它的基本工作模式. 2.什么是分片 分片(sharding)是MongoDB用来将大型集合分割到不同服务器(或者说一个集群)上所采用的方法,尽管分片起源于关系型数据库分区,但它(像MongoDB大部分方面一样)完全是另外一回事. 和你可能使用过的任何分区方案相比,MongoD

MongoDB整理笔记のSharding分片

这是一种将海量的数据水平扩展的数据库集群系统,数据分表存储在sharding 的各个节点上,使用者通过简单的配置就可以很方便地构建一个分布式MongoDB 集群.MongoDB 的数据分块称为 chunk.每个 chunk 都是 Collection 中一段连续的数据记录,通常最大尺寸是 200MB,超出则生成新的数据块.要构建一个 MongoDB Sharding Cluster,需要三种角色:    Shard Server    即存储实际数据的分片,每个Shard 可以是一个mongod

MongoDB 自动分片 auto sharding

MongoDB部署实验系列文章 MongoDB做为NoSQL数据库,最近几年持续升温,越来越多的企业都开始尝试用MongoDB代替原有Database做一些事情.MongoDB也在集群,分片,复制上也有相当不错的的表现.我通过将做各种MongoDB的部署实验进行介绍. 原网址:http://blog.fens.me/mongodb-shard/ 第三篇 MongoDB 自动分片 auto sharding,分为6个部分 初始化文件目录 启动shard节点 配置shard节点 插入数据分片实验 删

MongoDB Sharding Cluster分片集群

MongoDB Sharding Cluster 第1章 分片技术简述: sharding是MongoDB用来将大型集合分割高不同服务器上所采用的方法,尽管分片起源于关系型数据库分区,但MongoDB分片完全又是另一回事 和mysql分区方案相比,MongoDB的最大区别在于它几乎能自动完成所有事情,只要告诉MongoDB要分配数据,它就能自动维护数据在不同的服务器之间的均衡 1.1 分片的目的: ?  垂直扩展:增加更多的cpu和存储资源来扩展容量,也属于硬件扩展 ?  水平扩展:将数据集分布

MongoDB 搭建分片集群

在MongoDB(版本 3.2.9)中,分片是指将collection分散存储到不同的Server中,每个Server只存储collection的一部分,服务分片的所有服务器组成分片集群.分片集群(Sharded Clustered)的服务器分为三中类型:Router(mongos),Config Server 和 Shard(Replica Set 或 Standalone mongod).使用分片集群,不需要使用强大的计算机,就能存储更多的数据,处理更大的负载.分布式数据库系统的设计目的是:

【MongoDB】在window系统下搭建MongoDB的分片系统(一)

这篇主要讲述分片集群的主要原理 坦白说,刚看到这个分片系统(Sharding)有点蒙,感觉有点太高大上了.看美国作家Kyle Banker<Mongodb in action>没有明白.又查询资料,首先对与分片的做个说明.从其他书本上看的,说分片这是一种将海量数据水平扩展的数据库集群系统,数据分表存储在sharding的各个节点上,使用者通过简单的配置就可以很方便地够将一个分布式MongoDB集群. 一.角色说明 要构建一个MongoDB分片集群,需要三个角色: shard server  即

MongoDB 分布式分片集群 [四]

MongoDB的分布式分片集群(sharding cluster)配置Sharding cluster介绍这是一种可以水平扩展的模式,在数据量很大时特给力,实际大规模应用一般会采用这种架构去构建monodb系统.要构建一个 MongoDB Sharding Cluster,需要三种角色:Shard Server: mongod 实例,用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组个一个relica set承担,防止主机单点故障.Config Server: m

部署Sharding分片

这是一种将海量的数据水平扩展的数据库集群系统,数据分表存储在sharding 的各个节点上,使用者通过简单的配置就可以很方便地构建一个分布式MongoDB 集群. MongoDB 的数据分块称为 chunk.每个 chunk 都是 Collection 中一段连续的数据记录,通常最大尺寸是 200MB,超出则生成新的数据块. 要构建一个 MongoDB Sharding Cluster,需要三种角色: Shard Server 即存储实际数据的分片,每个Shard 可以是一个mongod 实例,