MongoDB 第一期 :集群搭建

一、简单说:MongoDB集群概念

1、 组织架构

要搭建一个MongoDB集群,需要三种角色:

① Shard Server: mongod实例,用于存储实际的数据块,实际生产环境中一个shard server角色可以由几台机器组成一个replica set承担,通过这种方式防止主机的单点故障。

② Config Server: mongod实例,存储了整个Cluster Metadata,其中包括 chunk 信息。

③ Route Server:mongos实例,前端路由,客户端由此接入,而且让整个集群看上去像单个数据库,前端应用可以透明使用。

2、实例分配和配置

根据实际的生产环境和应用的要求,摒弃了通常使用的单服务器单实例的部署方案,而是选择单机多实例的混合部署策略。

① 分别在2台机器运行6个mongod实例,组织replica set,作为cluster的shard。 ② 在两台机器共运行3个mongod(config)实例,配置3个config server。

【注意】

在Mongo3.2中,支持configserver进行副本配置,避免了以前版本中多config部署时遇到的同步时出现各个config中的时间戳相异而导致的集群无法启动的问题。

③ 每台机器运行1个mongos进程,用于客户端连接。

二、详细说:MongoDB集群搭建

1、安装MongoDB软件

①下载最新版的MongoDB的安装包

②解压安装包

2、 配置Relica Sets

① 创建数据目录(以shard11为例,路径可以按需求更改)

      mkdir –p /data/shard11

     touch /data/shard11.log

     touch /data/shard11.cnf

② 编辑配置文件

dbpath= /data/shard11  #数据目录

logpath=/data/shard11.log  #日志文件

logappend=true   #日志追加

port = 27017     #端口

maxConns = 500  #最大连接数

journal = true    #日志,redo log

fork = true       #守护进程模式

syncdelay = 60   #刷写数据到日志的频率

storageEngine = wiredTiger

oplogSize = 1000   #操作日志,单位M

configsvr = true

replSet=shard1

③启动

     cd /usr/local/server/mongodb/bin
    ./bin/mongod -–config=/data/shard11.cnf

④初始

用mongo连接其中一个mongod,执行:

     ./bin/mongo --port 27017
     > config = {_id: 'shard1', members: [
                            {_id: 0, host: ' IP1:PORT1'},

                            {_id: 1, host: ' IP1:PORT1'},

                            {_id: 2, host: ' IP1:PORT1'}]

                      }

      > rs.initiate(config);

3、 配置Config Server

① 创建数据目录(以config1为例,路径可以按需求更改)

      mkdir –p /data/config1

      touch /data/config1.log

      touch /data/config1.cnf

② 编辑配置文件

dbpath=/data/config1  #数据目录

logpath=/data/config1.log  #日志文件

logappend=true   #日志追加

port = 20000     #端口

fork = true       #守护进程模式

replSet=configReplSet

configsvr = true

③ 启动

     cd /usr/local/server/mongodb/bin
   ./bin/mongod -–config=/data/config1.cnf

4、 配置Mongos

① 创建数据目录

      touch /data/mongos.log

     touch /data/mongos.cnf

② 编辑配置文件

logpath=/var/log/mongodb/mongodb_route.log    #日志文件

logappend=true   #日志追加

port = 30000   #端口

maxConns = 1000   #最大连接数

configdb=<configReplSet >/config1:20000,config2:20001,config3:20000

 #必须是1个或则3个配置

【注意】

在3.2版本配置时3个config时,需要将其添加成副本形式,并在配置mongos时候标明replSet!!!。

fork = true #守护进程模式

③ 启动

  cd /usr/local/server/mongodb/bin
 ./bin/mongos -–config=/data/ mongos.cnf

5、 配置分片

① 连接到mongs,并切换到admin

     ./bin/mongo 172.16.101.244:30000/admin

     >db

      Admin

② 加入shards

采用replicaSetName/<serverhostname>[:port][,serverhostname2[:port],…]这样的格式,例如本例执行:

>db.runCommand({addshard:"shard1/IP1:PORT1, IP2:PORT2, IP3:PORT3", name:"s1", maxsize:204800});

>db.runCommand({addshard:"shard2/IP4:PORT4, IP5:PORT5, IP6:PORT6", name:"s2", maxsize:204800});

 >db.runCommand({addshard:"shard3/IP7:PORT7, IP8:PORT8, IP9:PORT9", name:"s3", maxsize:204800});

>db.runCommand({addshard:"shard3/IP10:PORT10, IP11:PORT11, IP12:PORT12", name:"s4", maxsize:204800});

【注意】

name:用于指定每个shard的名字,不指定的话系统将自动分配

maxSize:指定各个shard可使用的最大磁盘空间,单位megabytes

③ Listing shards

>db.runCommand( { listshards : 1 } )

如果列出了以上二个你加的shards,表示shards已经配置成功。

6、 激活分片

① 激活数据库分片

> db.runCommand({enablesharding : “<dbname>”});

【注意】

通过执行以上命令,可以让数据库跨shard,如果不执行这步,数据库只会存放在一个shard,一旦激活数据库分片,数据库中不同的collection将被存放在不同的shard上,但一个collection仍旧存放在同一个shard上,要使单个collection也分片,还需单独对collection作些操作。

② 激活集合分片

要使单个collection也分片存储,需要给collection指定一个分片key:

      > db.runCommand( { shardcollection : “<namespace>”,key : <shardkeypatternobject> });

例如:

      > db.runCommand({shardcollection: " dbname.collectioname", key: {_id: 1}});

      { "collectionsharded" : "test.c1", "ok" : 1 }

7、关于仲裁者(哨兵)

看到这里,我相信很多朋友都在纳闷,为什么在上面的配置过程中,都没有提到MongoDB集群中最重要的仲裁者呢?其实关于仲裁者,最大的好处就在于当集群节点意外挂掉以后,可以帮助分片选举出新的主分片节点,使得系统能正常运行,对外界屏蔽了单点故障。同时它自身并不存储任何数据,不耗费任何的磁盘空间,是个轻量级的进程。

当我们配置分片中的节点数是奇数时,其实我们就不必担心这一类问题了,因为这时候3副本的集群自带了仲裁的效果,就省去了设置仲裁者的步骤了。不过我们也可以通过下面的命令手动添加仲裁者:

rs.addArb("ip:port")

三、总的来说:MongoDB集群的难点

大家发现了吧,其实MongoDB集群的搭建不算困难,只需要按部就班的配置,几分钟完成一个能用的Mongo集群绝对是有可能的,但是要搭建一个高可用的优质集群,那么需要研究的还远不止这些。对于配置文件中的参数选择才是需要我们根据实际生产环境和业务需求去好好琢磨的,MongoDB的性能极度依赖于集群初期搭建时的参数选择,至于这一点,在之后的测评报告中会逐一向大家展示。

《 MongoDB第二期:压缩与索引 》 《 MongoDB 第三期:托管 MongoDB 存储服务 》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大内老A

ASP.NET Process Model之一:IIS 和 ASP.NET ISAPI

前几天有一个朋友在MSN上问我“ASP.NET 从最初的接收到Http request到最终生成Response的整个流程到底是怎样的?”我觉得这个问题涉及到I...

1838
来自专栏实用工具入门教程

如何部署 MongoDB 集群

MongoDB是一个领先的非关系型数据库管理系统,也是NoSQL运动的重要成员。MongoDB不是使用关系数据库管理系统(RDBMS)的表和固定模式,而是在文档...

940
来自专栏禁心尽力

文件上传的动作不能太俗,必须页面无刷新上传

常规操作上传文件 1 <form action="xxx.action" method="post" enctype="multipart/form-data...

2157
来自专栏北京马哥教育

高流量站点NGINX与PHP-fpm配置优化

使用Nginx搭配PHP已有7年的这份经历让我们学会如何为高流量站点优化NGINX和PHP-fpm配置。 以下正是这方面的一些提示和建议: 1. 将TCP切换为...

3365
来自专栏草根专栏

ASP.NET Core Web API 集成测试

本文需要您了解ASP.NET Core Web API 和 xUnit的相关知识.

701
来自专栏雨过天晴

转 PHP下的session的生存周期

1163
来自专栏追不上乌龟的兔子

使用MongoDB构建数据库集群

MongoDB是一个领先的非关系型数据库管理系统,也是NoSQL运动的重要成员。MongoDB不是使用关系数据库管理系统(RDBMS)的表和固定模式,而是在文档...

943
来自专栏前端黑板报

127.0.0.1 vs 0.0.0.0 vs localhost vs 主机IP

说明:上一篇写完《当你输入URL到页面显示经历了什么--URL到IP地址》之后读了好几本关于网络的书(当然都是跳着读),发现期初想的太简单,还是遗漏了许多,后面...

3669
来自专栏用户2442861的专栏

ApplicationContext 作用

现在让我们在 HelloSpring 项目下创建实际的源文件。首先,我们需要创建一个名为 com.tutorialspoint 的包。为了做到这个,在 pac...

821
来自专栏酷玩时刻

微信公众号开发之如何使用JSSDK

使用JSSDK主要包括 1、判断当前客户端版本是否支持指定JS接口、 2、分享接口(微信认证) 3、图像接口 4、音频接口 5、智能接口(识别语音并返...

1233

扫码关注云+社区