前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MongoDB 第一期 :集群搭建

MongoDB 第一期 :集群搭建

原创
作者头像
迪B哥
修改2017-08-16 14:45:23
1.9K0
修改2017-08-16 14:45:23
举报
文章被收录于专栏:MySQL实战分享MySQL实战分享

一、简单说: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为例,路径可以按需求更改)

代码语言:javascript
复制
      mkdir –p /data/shard11

     touch /data/shard11.log

     touch /data/shard11.cnf

② 编辑配置文件

代码语言:javascript
复制
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

③启动

代码语言:javascript
复制
     cd /usr/local/server/mongodb/bin
    ./bin/mongod -–config=/data/shard11.cnf

④初始

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

代码语言:javascript
复制
     ./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为例,路径可以按需求更改)

代码语言:javascript
复制
      mkdir –p /data/config1

      touch /data/config1.log

      touch /data/config1.cnf

② 编辑配置文件

代码语言:javascript
复制
dbpath=/data/config1  #数据目录

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

logappend=true   #日志追加

port = 20000     #端口

fork = true       #守护进程模式

replSet=configReplSet

configsvr = true

③ 启动

代码语言:javascript
复制
     cd /usr/local/server/mongodb/bin
   ./bin/mongod -–config=/data/config1.cnf

4、 配置Mongos

① 创建数据目录

代码语言:javascript
复制
      touch /data/mongos.log

     touch /data/mongos.cnf

② 编辑配置文件

代码语言:javascript
复制
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 #守护进程模式

③ 启动

代码语言:javascript
复制
  cd /usr/local/server/mongodb/bin
 ./bin/mongos -–config=/data/ mongos.cnf

5、 配置分片

① 连接到mongs,并切换到admin

代码语言:javascript
复制
     ./bin/mongo 172.16.101.244:30000/admin

     >db

      Admin

② 加入shards

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

代码语言:javascript
复制
>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:

代码语言:javascript
复制
      > db.runCommand( { shardcollection : “<namespace>”,key : <shardkeypatternobject> });

例如:

代码语言:javascript
复制
      > 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 存储服务 》

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、简单说:MongoDB集群概念
    • 1、 组织架构
      • 2、实例分配和配置
      • 二、详细说:MongoDB集群搭建
        • 1、安装MongoDB软件
          • 2、 配置Relica Sets
            • 3、 配置Config Server
              • 4、 配置Mongos
                • 5、 配置分片
                  • 6、 激活分片
                    • 7、关于仲裁者(哨兵)
                    • 三、总的来说:MongoDB集群的难点
                    相关产品与服务
                    数据库
                    云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档