MongoDB 搭建分片集群

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

一,配置服务器

config server 存储分片的元数据,元数据包括每个分片的块(chunk)列表和每个chunk包含数据的范围。路由服务区(Router)从config server上获取分片的元数据,使用元数据将读写操作路由到正确的分片上。

The metadata includes the list of chunks on every shard and the ranges that define the chunks. The mongos instances cache this data and use it to route read and write operations to the correct shards.

config server的读写操作是非常少的,config server将分片的元数据存储在config 数据库中,只有当分片的元数据变化时,比如 chunk migration,chunk split,才会修改config server中的数据。只有在mongos 第一次启动或重启时,或者分片的元数据变化时,mongos才会读取config server中的数据。mongos在读取分片的元数据之后,会缓存在本地。

Config servers store the cluster’s metadata in the config database. The mongos instances cache this data and use it to route reads and writes to shards. MongoDB only writes data to the config servers when the metadata changes, such as

  • after a chunk migration, or
  • after a chunk split.

MongoDB reads data from the config server in the following cases:

  • A new mongos starts for the first time, or an existing mongos restarts.
  • After change in the cluster metadata, such as after a chunk migration.

实际上,config server是mongod,只不过设置 --configsvr 选项。

--configsvr 指定mongod作为一个config server

二,mongos 路由服务器

mongos 为MongoDB提供路由服务,处理从application layer发送的查询请求,定位数据所在的分片,对分片上的查询结果进行combine,以完成分布式数据查询。从Application来看,mongos担当的角色是一个MongoDB Instance,隐藏了从分片上query和combine数据的复杂过程。

mongos 的重要参数

--config <filename>, -f <filename> 指定mongos 运行的参数

--configdb 指定config server列表,格式是:config-svr:port,config-svr:port

--chunkSize 指定data block的大小,单位是MB,默认值是64

--port 指定mongos 监听的TCP的端口号,默认值是27017

--logpath 指定mongos 记录日志的路径,默认情况下,MongoDB将现存的日志文件重命名,而不是重写。By default, MongoDB will move any existing log file rather than overwrite it. To instead append to the log file, set the --logappend option.

三,搭建分片集群

1,Shard

分片(Shard)用于存储数据,可以是Replica Set,也可以是Standalone,由于每个Shard都保存collection的一部分数据,如果shard 出现故障,那么collection就会变得不完整。在产品环境中,每一个shard都是一个replica set。

2,config server

config server 保存着每个分片和数据之间的映射,即数据存储在哪个分片上,或者说,每个分片上存储哪些数据,一个doc只能存储在一个分片上。分片的元数据极端重要,必须为config server 启用日志功能,确保元数据保存到disk中。最好使用3台config server,每台config server都应该位于单独的物理机上,最好是分布在不同地理位置的机器。

创建三台config server:cfg-srv1,cfg-svr2,cfg-svr3,其配置文件分别位于:

  • cfg-svr1,C:\data\config\cfgsvr_1.conf
  • cfg-svr2,C:\data\config\cfgsvr_2.conf
  • cfg-svr3,C:\data\config\cfgsvr_3.conf

--config server 1
dbpath=C:\data\configlogpath=C:\data\config\cfgsvr_1.log
journal=true
port=50001
configsvr=true

--config server 2
dbpath=C:\data\configlogpath=C:\data\config\cfgsvr_2.log
journal=true
port=50002
configsvr=true

--config server 3
dbpath=C:\data\configlogpath=C:\data\config\cfgsvr_3.log
journal=true
port=50003
configsvr=true

启动 config server,启动配置服务器时,不要使用--replset参数,config server不是replica set;--configsvr 参数指定mongod为config server。

--config server 1
mongod -f C:\data\config\cfgsvr_1.conf
--config server 2
mongod -f C:\data\config\cfgsvr_2.conf
--config server 3
mongod -f C:\data\config\cfgsvr_3.conf

3,Router
mongos是路由服务器(Router),mongos需要config server的地址列表,通过--configdb 指定 router 能够访问的 config server列表。mongos 不保存数据,不需要指定dbpath参数,mongos在启动时从config server加载集群数据,可以启动任意数量的mongos,每个mongos使用相同的config server 列表。

在router-svr1 上创建mongos,将配置文档存储在C:\data\mongos\cfg_mongos.conf,使用--port 参数指定mongos 进程监听的端口。

--mongos 1logpath=C:\data\mongos\mongos_log.log
port=60001
configdb=cfg-svr1:50001,cfg-svr2:50002,cfg-svr2:50003

启动mongos

mongos -f C:\data\mongos\cfg_mongos.conf

四,增加Shard

1,连接到mongos

mongo --host router-svr1 --port 60001

查看分片的状态,分片集群中并没有任何一个shard

sh.status()

2,增加Shard

每一个shard 用于存储数据的一个分片,存储数据的Server可以是Replica Set,也可以是Standalone mongod。

为分片集群增加一个Replica Set 分片

sh.addShard("replica_set_name/host:port")

为分片集群增加一个Standalone mongod

sh.addShard("host:port")

3,使数据库启用分片存储

sh.enableSharding("database name")

4,使数据库中的一个集合启用分片存储
在将collection启用分片存储之前,必须在collection上创建单键或双键index。

db.collection_name.createIndex({field:1})

sh.shardCollection("dbname.collection_name",{field:1})

5,向集合中插入,MongoDB将自动管理分片

db.collection_name.insert({....})

Application连接mongos,写入或读取数据,由mongos 路由到相应的shard,这个过程是自动完成的。

参考文档:

Sharded Cluster Administration

Sharding

MongoDB - Sharding

时间: 2024-12-14 18:08:59

MongoDB 搭建分片集群的相关文章

【MongoDB】在windows平台下mongodb的分片集群(五)

本篇接着上面的四篇继续讲述在window平台下mongodb的分片集群搭建.在分片集群中也照样可以创建索引,创建索引的方式与在单独数据库中创建索引的方式一样.因此这不再多说.本篇主要聚焦在分片键的选取问题上. 分片键通俗来说就是分割海量数据的标记符. 如果更高效的划分海量数据往往依赖于分片键的选择. 分片键选得不好,应用程序就无法利用分片集群所提供的诸多优势.在这种情况下,查询和插入得系能都回显著下降. 一.低效的分片键 1.1 分布差 BSON对象ID是每个mongodb文档的默认主键.所有的

mongo 3.4分片集群系列之四:搭建分片集群--哈希分片 + 安全 + 区域

这个系列大致想跟大家分享以下篇章(我会持续更新的(^ω^)): 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mongo 3.4分片集群系列之三:搭建分片集群--哈希分片 + 安全 4.mongo 3.4分片集群系列之四:搭建分片集群--哈希分片 + 安全 + 区域 5.mongo 3.4分片集群系列之五:详解平衡器 6.mongo 3.4分片集群系列之六:详解配置数据库 7.mongo 3.4分片集群系列之七:配置数

【MongoDB】在windows平台下搭建mongodb的分片集群(二)

在上一片博客中我们讲了Mongodb数据库中分片集群的主要原理.在本篇博客中我们主要讲描述分片集群的搭建过程.配置分片集群主要有两个步骤,第一启动所有需要的mongod和mongos进程.第二步就是启动一个mongos与集群通信.下面我们一步步来描述集群的搭建过程. 图1-1  MongoDB分片集群中的组件 图 1-2 由实例分片集群构成的进程全貌 备注:以上两者图片均引自于Kyle Banker著 丁雪丰译<MongoDB 实战> 2.1 创建分片目录 备注:此处于创建复制集类似,详细请查

【MongoDB】在windows平台下mongodb的分片集群(三)

在上两篇博客中我们分别阐述了分片集群的工作原理以及搭建过程.在本篇博客中我们主要一起分析分片集群的测试结果: 首先看分片集群的各个状态,可以看的出复制集A和B都是正常的: 一.开启分片集合 开启一个数据库上的分片,这是对任何集合进行分片的先决条件. 假设测试数据库为slidetest. 分片集合定义注意:它看起来和索引定义有几分相似之处,尤其是有那个unique键.在对一个空集合进行分片时候,mongodb会在每个分片上创建一个与分片对应的索引.可以直接连上分片,运行getIndexs()进行验

MongoDB 3 分片集群安装配置

操作系统:CentOS 6   x86_64 MongoDB版本:3.4.3 集群主机拓扑: 主机 mongo shardsvr & ReplSetName mongo configsvr & ReplSetName mongos test1.lan shard-a    shard-b test2.lan shard-a    shard-b test3.lan shard-a    shard-b test4.lan cfgshard test5.lan cfgshard test6.

MongoDB 分布式分片集群 [四]

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

MongoDB之分片集群与复制集

分片集群 1.1.概念 分片集群是将数据存储在多台机器上的操作,主要由查询路由mongos.分片.配置服务器组成. ●查询路由根据配置服务器上的元数据将请求分发到相应的分片上,本身不存储集群的元数据,只是缓存在内存中. ●分片用来存储数据块.数据集根据分片键将集合分割为数据块,存储在不同的分片上.在生产环境下,通常一个分片由一个复制集组成. ●配置服务器存储集群的元数据,包括数据与分片的映射关系,配置服务器一旦挂掉,集群将无法工作. 注意: ●当mongos重启时,会从配置服务器读取元数据更新自

【MongoDB】在windows平台下mongodb的分片集群(六)

在本篇博客中我们主要讨论下博客的管理.由于已经在前面五篇中写了详细的实例,因此这里就不再举例说明. 一.监控 分片集群是整个体系中比较复杂的一块,因此更应该需要监控. 主要命令: serverstatus和currentOp() 二.手动分区 手动分区意思就是手动对线上分片集群的块进行拆分和迁移.一般而言,一个分片写的越多,它越大. movechunk命令在这种情况下同样有帮助 三.增加一个分片 sh.addShard("computername:port") 使用这种方式增加容量,要

【MongoDB】在windows平台下mongodb的分片集群(四)

前言: 今天周末却学了一天,有点不想学习了,就在刚写完前两篇后,大概过了一个小时,我就在心里说,如果刚才写的那两篇博客阅读量过了80我就些这篇博客,如果不过,今晚就不再学习了.刚刚一看,一篇恰好80,另一篇是85..所以在此谢谢网友给的动力.那这篇博客继续给大家分享出来. 我些这篇博客的目的想要告诉正在阅读的你,分片集群的好处.前面已经用三篇才讲诉分片集群,但是可能有的小伙伴听得迷惑.还不知道分片集群有什么好处.所以在这篇博客中我打算用现在框架来说明分片集群的好处: 一. 海量数据分布存储. 刚