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

相关文章

来自专栏Albert陈凯

【网易严选】iOS持续集成打包(Jenkins+fastlane+nginx)

严选iOS客户端的现有打包方式是通过远程连接打包机执行脚本去打包,打完包会输出相应的ipa的二维码,扫一扫二维码可以安装,但是随着测试队伍的壮大,外包同学越来越...

1002
来自专栏小狼的世界

Analog使用中的一些技巧和总结

Analog是一款用来快速处理日志的开源工具,具有很高的效率,但是生成的结果并不美观,本文就analog使用过程中的一些问题进行总结,讨论如何对analog进行...

731
来自专栏Gaussic

OpenBR安装与编译过程 原

首先要安装VS2013,官网上说装Express版本就行,我这边装了Professional中文版,除了编译的时候经常出现字符问题,其他没什么影响。

721
来自专栏Flutter入门到实战

开发工具总结(2)之全面总结Android Studio2.X的填坑指南

前言:好多 Android 开发者都在说Android Studio太坑了,老是出错,导致开发进度变慢,出错了又不知道怎么办,网上去查各种解决方案五花八门,有些...

1421
来自专栏青玉伏案

iOS开发之使用XMPPFramework实现即时通信(一)

关于XMPP的理论介绍在本篇博客中就不做赘述了,如何在我们之前的微信中加入XMPP协议来实现通信呢?下面将会介绍一下XMPP的基本的知识,让我们的微信可以实现互...

18810
来自专栏开发技术

spring-session实现分布式集群session的共享

  HttpSession是通过Servlet容器创建和管理的,像Tomcat/Jetty都是保存在内存中的。但是我们把应用搭建成分布式的集群,然后利用LVS或...

851
来自专栏容器化

转载NodePort,LoadBalancer还是Ingress?我该如何选择 - kubernetes

5374
来自专栏玩转JavaEE

在Spring Boot框架下使用WebSocket实现消息推送

按:最近公众号文章主要是整理一些老文章,以个人CSDN上的博客为主,也会穿插一些新的技术点。 ---- Spring Boot的学习持续进行中。前面两篇博客我们...

7624
来自专栏惨绿少年

用户与磁盘

第1章 linux文件属性相关 1.1 linux文件属性 1.2 磁盘的使用过程 1、磁盘(房子) 2、分区(划分隔断) 3、格式化创建文件系统(装修) 4、...

2500
来自专栏JetpropelledSnake

ELK学习笔记之Logstash和Filebeat解析对java异常堆栈下多行日志配置支持

logstash官方最新文档。 假设有几十台服务器,每台服务器要监控系统日志syslog、tomcat日志、nginx日志、mysql日志等等,监控OOM、内存...

1251

扫码关注云+社区