Mongodb 部署一个分片集群

根据下面的任务顺序来部署一个分片集群:

警告

分片和“localhost”地址

如果你使用“localhost”或者是127.0.0.1 作为任一节点标识的主机名部分,例如addShard 方法的host
参数或者是运行时操作 --configdb的值,那么你必须为集群中的所有MongoDB的所有节点设置都使用“localhost”或者是127.0.0.1。如果你把本地地址和远程地址混合使用的话,MongoDB将会出现错误。

启动Config Server的数据库实例

Config Server进程是用来存放集群元数据的mongod实例。你可以通过 --configsvr 操作指定一个mongod 实例作为configure server。每个config server都保存了一份集群元数据的备份。

在生产环境中,你必须部署恰好三个config server实例,并且每个实例都要运行在不同的服务器上,来保证正常运行时间和数据安全。在测试环境中,你可以让三个实例在一台机器上运行。

重要

一个分片集群中的所有成员必须能够连接到这个分片集群中的其他所有成员,包括所有的分片和config servers。要确保包括防火墙在内的安全系统和网络允许这些连接。

  1. 为每个config server创建数据目录。在默认情况下,一个config server将它的数据文件存储再/data/configdb 目录下。你可以选择一个其他的位置。要创建一个数据目录,执行类似下面的命令:

    mkdir /data/configdb
    
  2. 启动三个config server 实例。启动每个实例使用满足下面语法的命令:
    mongod --configsvr --dbpath <path> --port <port>
    

    Config Servers 默认的端口号是27019。 你可以制定其它的端口号。下面的示例启动了一个使用默认端口号和默认数据路径的config server:

    mongod --configsvr --dbpath /data/configdb --port 27019
    

    有关更多的命令选项, 查看 mongod 或者 Configuration
    File Options
    .

    提示

    在你第一次初始化一个分片集群时,所有的config servers 都必须处于运行状态,并且要能被够访问到。

启动Mongos实例

Mongos 实例是轻量级的并且不需要数据目录。你可以在运行着集群其他组件的系统上运行一个mongos实例,例如一个应用服务器(注:运行这客户端程序的服务器)或者一台运行着mongod进程的服务器。默认情况下,mongos的端口号是 27017。

当你启动 mongos 实例时,要指定三个config
servers的hostnames,要么通过配置文件指定,要么通过命令行参数指定。

贴士

为了避免停机时间,给每个config server设置一个逻辑上的DNS名称(与服务器的物理或者虚拟节点名称无关)。如果没有逻辑DNS名称,移动或者重命名一个config server需要关闭集群中所有 mongod 和 mongos 实例。

要启动一个 mongos 实例,
执行使用下面语法的命令:

mongos --configdb <config server hostnames>

例如:要启动一个连接在以下节点上运行在默认端口的config server实例的 mongos 实例:

  • cfg0.example.net
  • cfg1.example.net
  • cfg2.example.net

你需要发出先面的命令:

mongos --configdb cfg0.example.net:27019,cfg1.example.net:27019,cfg2.example.net:27019

集群中每一个 mongos 都必须使用相同的 configDB 字符串,
通过相同的顺序列出的相同的主机名称(with identical host names listed in identical order)。

如果你启动一个 mongos 实例使用的字符串不能正确匹配集群中其他的 mongos 实例使用的字符串,这个 mongos 将会报 Config
Database String Error
 错误,并且拒绝启动。

添加分片到集群中

一个分片可以是一个单独的mongod实例也可以是一个复制集。在生产环境中,所有的分片都应该是一个复制集。

  1. 通过 mongo shell,
    连接上 mongos 实例。发出使用下面语法的命令:

    mongo --host <hostname of machine running mongos> --port <port mongos listens on>
    

    例如:如果一个 mongos 可以在 mongos0.example.net 的 27017端口上被访问到,
    发出下面的命令:

    mongo --host mongos0.example.net --port 27017
    
  2. 添加每个分片到集群都要使用 sh.addShard() 方法,向下面的例子展示的那样。如果这个分片是一个复制集,那么指定这个数据集的名称和集合中的一个成员。在生产环境中,所有的分片都必须是复制集。

    可选

    你可以是哟你数据库命令 addShard 来指定集群的名称和最大数目。如果你不指定这些,MongoDB会自动指定。要使用数据库命令,查看 addShard.

    下面是通过 sh.addShard() 添加到集群的示例:

    • 要给一个名字是 rs1 并且运行在端口为27017 的mongodb0.example.net上的复制集添加一个分片,发出下面的命令:

      sh.addShard( "rs1/mongodb0.example.net:27017" )
      

      版本2.0.3中的变更

      对于早于2.0.3版本的MongoDB,你必须指定复制集中所有的成员。例如:

      sh.addShard( "rs1/mongodb0.example.net:27017,mongodb1.example.net:27017,mongodb2.example.net:27017" )
      
    • 要给运行在
      mongodb0.example.net 端口号为27017的单独的mongod实例添加分片,发出如下命令:

      sh.addShard( "mongodb0.example.net:27017" )
      

    提示

    让 chunks 迁移到新的分片上可能会花费些时间。

对数据库启用分片

你必须对数据库的集合启用分片才能分片一个集合。(Before you can shard a collection, you must enable sharding for the collection’s database)。启用数据库的分片不会对数据进行重新分配,而是让数据库中的集合能够被分片。

一旦你为数据库启用分片,MongoDB会再分片之前为存放所有数据的数据库指定一个 primary
shard
 。

  1. 通过 mongo shell连接到 mongos 实例。发出使用下面语法的命令:

    mongo --host <hostname of machine running mongos> --port <port mongos listens on>
    
  2. 执行 sh.enableSharding() 方法,指定已启用分片的数据库的名称。使用下面的语法:
    sh.enableSharding("<database>")
    

可选项,你可以使用 enableSharding 命令为数据库启用分片:

db.runCommand( { enableSharding: <database> } )

对集合启用分片

在每一个集合的基础上启用分片。

  1. 指定你要使用的 shard
    key
    。你对shard key的选择会影响到分片的效率。
  2. 如果集合已经包含数据,你必须再shard key上使用ensureIndex()方法来创建索引。如果集合是空的,MongoDB会在sh.shardCollection() 的步骤中创建索引。
  3. 通过再mongo shell 中执行sh.shardCollection() 方法来为集合启用分片。使用如下语法:
    sh.shardCollection("<database>.<collection>", shard-key-pattern)
    

    Replace the <database>.<collection> string with the full namespace of your database, which consists of the name
    of your database, a dot (e.g. .), and the full name of the collection. Theshard-key-pattern represents
    your shard key, which you specify in the same form as you would an index key
    pattern.

    EXAMPLE

    The following sequence of commands shards four collections:

    sh.shardCollection("records.people", { "zipcode": 1, "name": 1 } )
    sh.shardCollection("people.addresses", { "state": 1, "_id": 1 } )
    sh.shardCollection("assets.chairs", { "type": 1, "_id": 1 } )
    sh.shardCollection("events.alerts", { "_id": "hashed" } )
    

    以下操作按顺序分片:

    1. The people collection in the records database
      using the shard key { "zipcode": 1,"name": 1 }.

      This shard key distributes documents by the value of the zipcode field. If a number of documents have the same value
      for this field, then that chunk will be splittable by
      the values of the name field.

    2. The addresses collection in the people database
      using the shard key { "state": 1,"_id": 1 }.

      This shard key distributes documents by the value of the state field. If a number of documents have the same value
      for this field, then that chunk will be splittable by
      the values of the _id field.

    3. The chairs collection in the assets database
      using the shard key { "type": 1,"_id": 1 }.

      This shard key distributes documents by the value of the type field. If a number of documents have the same value
      for this field, then that chunk will be splittable by
      the values of the _idfield.

    4. The alerts collection in the events database
      using the shard key { "_id": "hashed"}.

      New in version 2.4.

      这个shard key通过_id字段的hash值来对文档进行分配。MongoDB computes the hash of the _id field for the hashed
      index
      , which should provide an even distribution of documents across a cluster.

Mongodb 部署一个分片集群

时间: 2024-10-15 11:22:38

Mongodb 部署一个分片集群的相关文章

MongoDB Sharding Cluster分片集群

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

mongoDB研究笔记:分片集群的工作机制

上面的(http://www.cnblogs.com/guoyuanwei/p/3565088.html)介绍了部署了一个默认的分片集群,对mongoDB的分片集群有了大概的认识,到目前为止我们还没有在集群上建立其它数据库,mongoDB的分片是基于集合(表)来进行的,因此要对一个集合分片,必须先使其所在的数据库支持分片.如何使一个集合分片?如何选择分片用到的片键?平衡器如何使chunks块在片中迁移?分片的读写情况怎么样?接下来将探讨这些问题. 使集合分片 (1)连接到上面所配置集群中的mon

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

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

备份和还原MongoDB分片集群数据

1.使用mongodump备份小量分片集群数据 如果一个分片集群的数据集比较小,可以直接使用mongodump连接到mongos实例进行数据备份.默认情况下,mongodump到非primary的节点进行数据查询. 如: mongodump --host 192.168.100.200 --port 28018 -d taiwan_game1 -o . mongorestore --host 192.168.100.200 --port 28018 taiwan_game1 需要注意的是如果使用

MongoDB 分布式分片集群 [四]

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

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

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

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分片集群系列之七:配置数据库管理 8.mongo 3

MongoDB分片集群部署

一.环境说明 1.我们prod环境MongoDB的集群架构是做的分片集群的部署,但是目前我们没有分片,即所有数据都在一个分片上,后期如果数量大,需要分配,集群随时可以分片,对业务方透明2.各个角色的部署情况 角色 IP 端口 复制集名称 mongos 172.21.244.101,172.21.244.102,172.21.244.94 27000 无 config server 172.21.244.101,172.21.244.102,172.21.244.94 27100 repl_con

MongoDB之分片集群与复制集

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