mongodb部署一个集群

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介:

一、案例

mongos:    192.168.1.3     hadoop1.abc.com     hadoop1
config server:    192.168.1.4     hadoop2.abc.com     hadoop2
Shard1:    192.168.1.5     hadoop3.abc.com     hadoop3
Shard2:    192.168.1.6     hadoop4.abc.com     hadoop4

 

 

二、启动配置服务器

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

 

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

 

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

1
2
[root@hadoop2 ~]# mkdir -pv /mongodb/data 
[root@hadoop2 ~]# chown -R mongod.mongod /mongodb/

2、启动配置服务器,每台都通过一下命令启动:

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

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

1
  [root@hadoop2 ~]# mongod --configsvr --dbpath /mongodb/data --port  27019  &

 

也可以编辑配置文件

dbpath =  /mongod/data

configsvr = true

 

配置文件的配置格式:

<setting> = <value>

 

三、配置mongos

在集群中, mongos 负责将查询与写入分发到 分片 中.使用 mongos,应用有了访问集群的统一入口,而不需要直接访问集群的每个分片

 

通过缓存 配置服务器 中集群的元信息, mongos 可以得知数据所位于的分片. mongos 使用这些元信息将应用的读写请求分发到不同的分片, mongos 不存储集群 持续 的状态(意思是, mongos 可以随时被重启或者添加,而不会造成集群的数据丢失,也不会造成集群的异常.),并且占有较少的系统资源.

 

``mongos``如何决定哪个分片应该接收到请求

在 cluster <sharded cluster>`中, :program:`mongos 使用以下步骤分发请求:

  1. 确定必须接收请求的 分片 列表.

  2. 在所有目标分片上建立游标.

 

在某些情况下,当查询条件包含 shard key 或者 shard key 的前缀时,:program:mongos可以将请求分发到部分分片上,否则, mongos 会将请求分发到 所有 存储这个集合的分片上.

 

检测连接的是否为 mongos

为了检测应用连接的是不是 mongos,可以使用 isMaster 命令.如果应用连接的是一个 mongos , isMaster 返回一个包含 isdbgrid 字符串的 msg ,比如:

{
   "ismaster" : true,
   "msg" : "isdbgrid",
   "maxBsonObjectSize" : 16777216,
   "ok" : 1}

 

mongos属于轻量级应应用,完全可以与其他服务运行于同一节点:启动时,需要为mongos实例指明各config服务器的访问地址:

默认情况下,mongos监听于27017端口;可以使用如下命令启动mongos实例

#mongos  --configdb <config server hostnames((IP|Hostname):Port)>

 

示例:使用以下配置服务器,在默认端口上启动 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 会返回 配置服务器字符串错误错误并退出启动.

 

也可以直接编辑配置文件

1、注释dbpath指令

2、添加configdb指令,并指定config服务器的地址;

 

而后使用如下命令启动mongos实例

#mongos -f /etc/mongod.conf

 

 

向集群中添加分片

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

 

1、使用以下命令,从 mongo 终端连接到 mongos.

mongo --host <hostname of machine running mongos> --port <port mongos listens on>
1
2
3
4
5
6
7
[root@hadoop2 ~]# mongo --host  192.168 . 1.3 
MongoDB shell version:  3.0 . 4
connecting to:  192.168 . 1.3 : 27017 /test
Server has startup warnings: 
2015 - 08 -07T18: 01 : 34.816 + 0800  I CONTROL  ** WARNING: You are running  this  process  as  the root user, which  is  not recommended.
2015 - 08 -07T18: 01 : 34.816 + 0800  I CONTROL  
mongos>

 

2、正如下面的示例,使用 sh.addShard() 在集群中添加分片.每次使用 sh.addShard() 添加一个分片.如果分片是复制集,需要指定复制集的名字与一个成员名字.在生产环境中,所有分片都应该是复制集.

 

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

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

 

如果添加的shard是独立的mongod实例,则使用如下格式:

1
sh.addShard( "RS_SEVER:P" )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
mongos> sh.addShard( "192.168.1.5:27017" )
"shardAdded"  "shard0001" "ok"  1 
mongos> sh.addShard( "192.168.1.6:27017" )
"shardAdded"  "shard0001" "ok"  1  }
mongos> sh.status()
--- Sharding Status --- 
   sharding version: {
  "_id"  1 ,
  "minCompatibleVersion"  5 ,
  "currentVersion"  6 ,
  "clusterId"  : ObjectId( "55c481b81d1ceaba52187728" )
}
   shards:
  {   "_id"  "shard0000" ,   "host"  "192.168.1.5:27017"  }
  {   "_id"  "shard0001" ,   "host"  "192.168.1.6:27017"  }
   balancer:
  Currently enabled:  yes
  Currently running:  no
  Failed balancer rounds  in  last  5  attempts:   0
  Migration Results  for  the last  24  hours: 
   No recent migrations
   databases:
  {   "_id"  "admin" ,   "partitioned"  false ,   "primary"  "config"  }
mongos>

 

注意,由于添加shard是独立mongod实例,所以你要到192.168.1.5和192.168.1.6把mongod服务启动起来,否则会出现如下错误提示

1
2
3
4
mongos> sh.addShard( "192.168.1.6:27017" )
{
  "ok"  0 ,
  "errmsg"  "couldn't connect to new shard socket exception [CONNECT_ERROR] for 192.168.1.6: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
2
mongos> sh.enableSharding( "testdb" )
"ok"  1  }

 

 

 

对集合开启分片

分片以集合为基本单位.

  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 字段重新分配数据.如果很多文档都有相同的 zipcode 值, chunk 会按照 name 的值进行 分裂.

    2. people 数据库中的 addresses 集合使用片键 {.

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

    3. assets 数据库中的 chairs 集合使用 { 做片键.

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

    4. events 数据库中的 alerts 集合使用 { 做片键.

      2.4 新版功能.

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

1
2
mongos>  for (i= 1 ;i<= 100 ;i++) db.testcoll.insert({Name:  "User" +i,Age: i,Gender:  "M" ,PreferBook: [ "first book" , "Second book" ]})
WriteResult({  "nInserted"  1  })

 

先根据年龄作顺序索引,再根据名字做顺序分区

1
2
mongos> sh.shardCollection( "testdb.testcoll" ,{Age:  1 ,Name:  1 })
"collectionsharded"  "testdb.testcoll" "ok"  1  }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
  mongos> sh.status()
--- Sharding Status --- 
   sharding version: {
  "_id"  1 ,
  "minCompatibleVersion"  5 ,
  "currentVersion"  6 ,
  "clusterId"  : ObjectId( "55c481b81d1ceaba52187728" )
}
   shards:
  {   "_id"  "shard0000" ,   "host"  "192.168.1.5:27017"  }
  {   "_id"  "shard0001" ,   "host"  "192.168.1.6:27017"  }
   balancer:
  Currently enabled:  yes
  Currently running:  no
  Failed balancer rounds  in  last  5  attempts:   0
  Migration Results  for  the last  24  hours: 
   No recent migrations
   databases:
  {   "_id"  "admin" ,   "partitioned"  false ,   "primary"  "config"  }
  {   "_id"  "test" ,   "partitioned"  false ,   "primary"  "shard0000"  }
  {   "_id"  "testdb" ,   "partitioned"  true ,   "primary"  "shard0000"  }
   testdb.testcoll
    shard key: {  "Age"  1 "Name"  1  }
    chunks:
     shard0000  1
    "Age"  : {  "$minKey"  1  },  "Name"  : {  "$minKey"  1  } } -->> {  "Age"  : {  "$maxKey"  1  },  "Name"  : {  "$maxKey"  1  } } on : shard0000 Timestamp( 1 0 )









本文转自 zouqingyun 51CTO博客,原文链接:http://blog.51cto.com/zouqingyun/1682778,如需转载请自行联系原作者
相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
目录
相关文章
|
20天前
|
存储 NoSQL MongoDB
【赵渝强老师】部署MongoDB复制集
本文介绍了如何在单个节点上搭建MongoDB复制集环境,通过监听不同端口实现多节点配置。详细步骤包括创建数据目录、编辑配置文件、启动节点、初始化复制集、查看状态以及测试主从库的读写操作。文中还提供了视频讲解和代码示例,帮助读者更好地理解和操作。
|
4月前
|
存储 NoSQL MongoDB
今日分享MongoDB一键部署脚本
今日分享MongoDB一键部署脚本
39 0
|
4月前
|
存储 NoSQL 算法
MongoDB保姆级指南(中):从副本集群、分片集群起航,探索分布式存储的趋势!
本文一起来聊聊MongoDB集群,顺带以MongoDB集群为起点,共同探讨一下分布式存储的发展趋势~
260 15
|
5月前
|
自然语言处理 运维 NoSQL
MongoDB集群同步
实现 MongoDB Cluster-to-Cluster 即集群同步的工具是:mongosync 详情可参考如下官方文档: https://www.mongodb.com/zh-cn/docs/cluster-to-cluster-sync/current/quickstart/ 以上这个地址的文档一看就是机器翻译的,可能有不恰当的地方,但基本可参考使用。 以下是本次在某项目地配置集群同步的简要步骤,可参考使用。
91 6
|
4月前
|
存储 运维 NoSQL
轻松上手:逐步搭建你的高可用MongoDB集群(分片)
【8月更文挑战第13天】在数据激增的背景下,传统单机数据库难以胜任。MongoDB作为流行NoSQL数据库,采用分片技术实现水平扩展,有效处理海量数据。分片将数据分散存储,提高并发处理能力和容错性,是高可用架构基石。构建MongoDB集群需理解shard、config server和router三组件协同工作原理。通过具体实例演示集群搭建流程,包括各组件的启动及配置,确保数据高可用性和系统稳定性。合理规划与实践可构建高效稳定的MongoDB集群,满足业务需求并支持未来扩展。
106 0
|
6月前
|
存储 负载均衡 NoSQL
MongoDB的架构设计基于三种集群模式
【6月更文挑战第5天】MongoDB的架构设计基于三种集群模式
234 3
|
7月前
|
NoSQL Unix MongoDB
【docker 】docker-compose 部署mongoDB
【docker 】docker-compose 部署mongoDB
207 1
|
7月前
|
NoSQL MongoDB 数据库
docker部署mongoDB
docker部署mongoDB
220 0
|
7月前
|
NoSQL JavaScript Linux
【MongoDB系列相关笔记】单机部署
本文主要介绍了Windows和Linux系统中安装和启动MongoDB的步骤。
175 0
|
7月前
|
运维 NoSQL Java
Serverless 应用引擎产品使用之在函数计算上部署Java服务并访问阿里云MongoDB如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。