OPTIONS
翻译或纠错本页面

部署一个集群

按照下列顺序部署一个集群

警告

分片和”localhost”地址

如果你使用”localhost”或者 127.0.0.1 在任意一处地方作为主机标识,比如使用 addShard 命令时的 host 参数或者 --configdb <mongos --configdb>`作为启动参数,你必须保证在所有地方使用其中一个,如果混用了"localhost"和 ``127.0.0.1` ,MongoDB会报错.

启动配置服务器

配置服务器是存储集群元信息的 mongod 实例.使用 --configsvr 指定一个 mongod 为配置服务器,每个配置服务器都存储了集群的一份完整的元信息.

在生产环境下,你必须部署三个配置服务器,每个配置服务器都运行在不同的服务器上以保证良好的正常运行时间和数据安全.在测试环境下,你可以将三台配置服务器运行在一台服务器上.

重要

集群中任意一个节点都必须能够与 所有 节点进行连通,包括所有的分片和所有的配置服务器.确保网络和安全系统,防火墙允许节点之间的连通.

  1. 为三个配置服务器创建数据目录,默认情况下,配置服务器将数据文件存储在 /data/configdb 目录下.你也可以自己指定不同的位置用来存储数据文件.通过简单的命令创建数据目录:

    mkdir /data/configdb
    
  2. 启动三台配置服务器,每台都通过一下命令启动:

    mongod --configsvr --dbpath <path> --port <port>
    

    配置服务器的默认端口是 27019 .你也可以自己指定.以下示例使用默认的端口和默认的数据目录启动一个配置服务器.

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

    参见 mongod 或者 Configuration File Options 以获得更多命令选项.

    注解

    初始化 sharded cluster 时所有配置服务器必须正常运行并且可以访问.

启动 mongos 实例

mongos 实例是轻量服务,并且不需要数据目录,你可以将 mongos 运行在已经部署了其他服务的系统中,比如应用服务器或者 运行了 mongod 的机器上.:program:mongos 默认运行在 27017 端口上.

在启动 mongos 时,需要指定三台配置服务器的域名,可以在配置文件或者启动命令参数中指定.

Tip

To avoid downtime, give each config server a logical DNS name (unrelated to the server’s physical or virtual hostname). Without logical DNS names, moving or renaming a config server requires shutting down every mongod and mongos instance in the sharded cluster.

使用以下语法启动 mongos 实例:

mongos --configdb <config server hostnames>

示例:使用以下配置服务器,在默认端口上启动 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 按照相同的顺序指定配置服务器列表.

如果你启动一个 mongos 时,指定的配置服务器列表与其他 mongos 中指定的不同, mongos 会返回 配置服务器字符串错误 错误并退出启动.

向集群中添加分片

一个 shard 可以是一个单独的:program:mongod 或者一个 replica set.在生产环境中,每个分片都应该是一个复制集.参见 部署复制集 将每个分片部署为复制集.

  1. 使用以下命令,从 mongo 终端连接到 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() 在集群中添加分片.每次使用 sh.addShard() 添加一个分片.如果分片是复制集,需要指定复制集的名字与一个成员名字.在生产环境中,所有分片都应该是复制集.

    可选配置

    You can instead use the addShard database command, which lets you specify a name and maximum size for the shard. If you do not specify these, MongoDB automatically assigns a name and maximum size. To use the database command, see addShard.

    以下是使用 sh.addShard() 添加分片的例子:

    • 假设一个分片使用了复制集,复制集名字为 rs1 ,有一个运行在 mongodb0.example.net 且端口为 27017 的成员,使用以下命令添加这个分片:

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

      在 2.0.3 版更改.

      在2.0.3之前的版本,你必须指定复制集中所有的成员,示例:

      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" )
      

    注解

    数据块 迁移到新的分片需要花费一些时间.

为集群开启分片

在对集合进行分片之前,必须开启数据库的分片.对数据库开启分片不会导致数据的重新分配,但这是对这个数据库中集合进行分片的前提.

一旦为数据库开启了分片,MongoDB就会为这个数据库指定一个 primary shard,所有未分片的数据都会存储在这个分片上.

  1. 使用以下命令,从 mongo 终端连接到 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 ,所选择的片键会影响集群的效率.参见 选择片键的注意事项. 获得注意事项.

  2. 如果集合中已经包含有数据,需要使用 ensureIndex() 在片键上创建索引.如果集合是空的,MongoDB会在 sh.shardCollection() 过程中自动创建索引.

  3. mongo 终端中使用 sh.shardCollection() 对一个集合开启分片,语法如下:

    sh.shardCollection("<database>.<collection>", shard-key-pattern)
    

    <database>.<collection> 字符串换成你数据库的ns,由数据库的全名,一个点(即 . ),和集合的全名组成, shard-key-pattern 换成你的片键,名字为 创建索引 时指定的名字.

    示例

    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. records 数据库中的 people 集合使用 { "zipcode": 1, "name": 1 } 片键开启分片.

      这个集合使用 zipcode 字段重新分配数据.如果很多文档都有相同的 zipcode 值, chunk 会按照 name 的值进行 分裂.

    2. people 数据库中的 addresses 集合使用片键 { "state": 1, "_id": 1 }.

      这个片键使用 state 字段重新分配数据.如果很多文档都有相同的 state 值, chunk 会按照 _id 的值进行 分裂.

    3. assets 数据库中的 chairs 集合使用 { "type": 1, "_id": 1 } 做片键.

      这个片键使用 type 字段重新分配数据.如果很多文档都有相同的 type 值, chunk 会按照 _id 的值进行 分裂.

    4. events 数据库中的 alerts 集合使用 { "_id": "hashed" } 做片键.

      2.4 新版功能.

      这个片键使用 _id 的散列值重新分配数据.MongoDB为 散列索引 计算 _id 的值,可以保证集群中数据的均衡.