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 条评论
登录 后参与评论

相关文章

来自专栏進无尽的文章

工程管理篇 | 多Targets

很多时候,工程管理是一个很实际的技能,我们在实际开发中普遍有很多环境:测试环境、开发环境、生产环境等。还有可能遇到需要创建两个很多内容相同,部分功能不同的工程。

762
来自专栏散尽浮华

非常强悍并实用的双机热备+负载均衡线上方案

Heartbeat+DRBD+NFS+Keepalived+Lnmp      对于网站服务器来说,可靠性之重要不用我多说,但要想做到可靠性一般需要昂贵的...

4826
来自专栏Laoqi's Linux运维专列

Tomcat搭建高可用/负载均衡/动静分离的Web服务器集群

1322
来自专栏北京马哥教育

Python开源项目介绍:用zmail简单地发邮件

转载自:Python中文社区 ID:python-china 发送邮件是个很简单的需求,但是在实际的使用中依然碰到了很多坑,因此创建了zmail这个项目...

2516
来自专栏SpringBoot 核心技术

SpringCloud组件:Eureka高可用集群部署

我们在之前的章节SpringCloud组件:搭建Eureka服务注册中心学习到了单个服务注册中心的创建,不过单模式的部署方式在实战中确实不太提倡,因为有很多种原...

722
来自专栏张戈的专栏

解决Nginx Helper插件一键清理缓存功能导致网站打不开问题

5 月份,张戈博客分享了一篇《Nginx 开启 fastcgi_cache 缓存加速,支持 html 伪静态页面》的文章。文中也提到了 WordPress 有一...

3529
来自专栏小尘哥的专栏

也许能帮到你一点!eboot框架基础版发布

目前发布一个基础版,适用于中小型项目开发,后续会加入更多功能,以满足大型项目的需求。

471
来自专栏Ryan Miao

ELK入门使用-与springboot集成

ELK官方的中文文档写的已经挺好了,为啥还要记录本文?因为我发现,我如果不写下来,过几天就忘记了,而再次捡起来必然还要经历资料查找筛选测试的过程。虽然这个过程很...

372
来自专栏Danny的专栏

【Hadoop学习笔记】——HDFS

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/...

802
来自专栏互扯程序

CentOS7下Nginx服务器安装与使用教程

Nginx服务器简介 Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。其特点是占用内存少,...

4455

扫码关注云+社区