阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

MongoDB集群架构之分片+副本集架构

176次阅读
没有评论

共计 4435 个字符,预计需要花费 12 分钟才能阅读完成。

在热门的 NoSQL 数据库 MongoDB 中,还支持一种分片 + 副本集架构的集群。本文将介绍分片 + 副本集架构的集群的相关概念以及环境搭建工作,同时介绍了标签分片在这种架构中的应用。

1. 分片 + 副本集架构相关概念

在 Mongodb 分片架构中提到了单纯的分片架构中存在单点故障问题,这里将给出一种解决办法。

解决这个问题的办法就是使用 Mongodb 的分片 + 副本集架构来实现这种架构方式。目前的架构的三种类型的服务器节点中,配置节点和路由节点都各自有三个,因此没有单点故障问题。只有分片节点具有单点故障问题,因此可以为每个分片节点部署一个独立的副本集架构,这样每一个分片节点就不存在单点故障问题。在目前的单纯的分片架构中,新增 6 个分片节点,总共 9 个分片节点组成三个独立的副本集集群。新的分片 + 副本集架构中,总共有 12 个节点组成。

相对于 MySQL 数据库而言,Mongodb 的这种内置的分片功能和副本集功能,使得部署较大规模的 Mongodb 集群变得比较容易。

2. 分片 + 副本集环境搭建

分片 + 副本集架构除了每个分片节点扩充为一个独立的副本集之外,其它节点情况跟单纯的分片架构相同。为了节省篇幅,此处仅仅列出不同的地方,其它节点按照分片架构搭建即可。

集群目标:总共由 15 个节点组成的分片 + 副本集集群。

配置节点。共 3 个节点。

 27117,27118,27119 三个节点组成一个副本集 config。

分片节点。共 9 个节点。

27017,27317,27417 三个节点组成一个副本集 shard27017。

  27018,27318,27418 三个节点组成一个副本集 shard27018。

  27019,27319,27419 三个节点组成一个副本集 shard27019。

路由节点。共 3 个节点。

  27217,27218,27219 三个节点为 3 个独立的路由节点。

初始化目录结构。

[root@coe2coe data]# tree -d -L 4 .

.

├── config

│   ├── 27117

│   │   ├── data

│   │   └── log

│   ├── 27118

│   │   ├── data

│   │   └── log

│   └── 27119

│       ├── data

│       └── log

├── route

│   ├── 27217

│   │   ├── data

│   │   └── log

│   ├── 27218

│   │   ├── data

│   │   └── log

│   └── 27219

│       ├── data

│       └── log

└── shard

    ├── shard27017

    │   ├── 27017

    │   │   ├── data

    │   │   └── log

    │   ├── 27317

    │   │   ├── data

    │   │   └── log

    │   └── 27417

    │       ├── data

    │       └── log

    ├── shard27018

    │   ├── 27018

    │   │   ├── data

    │   │   └── log

    │   ├── 27318

    │   │   ├── data

    │   │   └── log

    │   └── 27418

    │       ├── data

    │       └── log

    └── shard27019

        ├── 27019

        │   ├── data

        │   └── log

        ├── 27319

        │   ├── data

        │   └── log

        └── 27419

            ├── data

            └── log

配置节点启动脚本。

跟单纯分片架构相同,不再赘述。

(3)分片节点启动脚本。

主要是在分片架构的相关脚本的基础上,为每个分片节点配置了一个副本集。

分片节点 27017 的副本集:名称 shard27017

27017:主节点  27317:从节点 27417:从节点

分片节点 27018 的副本集:名称 shard27018

27018:主节点  27318:从节点 27418:从节点

分片节点 27019 的副本集:名称 shard27019

27019:主节点  27319:从节点 27419:从节点

分片节点的启动脚本如下:

MongoDB 集群架构之分片 + 副本集架构

图 1

分片节点启动之后需要分别初始化 3 个副本集,初始化方法不再赘述。

路由节点启动脚本。

脚本跟单纯的分片架构相同,不再赘述。

路由节点启动后,需要添加分片节点到路由中,添加的方法跟单纯副本集方式有所不同。

MongoDB 集群架构之分片 + 副本集架构

图 2

至此分片 + 副本集架构的 Mongodb 集群环境搭建完毕。

3. 分片 + 副本集的总控脚本

为了测试方便,编写了总控脚本。总控脚本需要启动三种类型共 15 个节点。

[root@coe2coe data]# cat cluster.sh

#!/bin/bash

##################################################################

#   FileName:startcluster.sh

#   Author      : coe2coe@qq.com

#   Created:2018-10-02

#   Description:http://www.cnblogs.com/coe2coe/

#################################################################

start()

{

IP=$(ip addr |grep inet |grep brd |awk -F’ ‘ ‘{ print $2}’|awk -F’/’ ‘{print $1}’)

if [“$IP” == “”]

then

  echo -e “Failed to get IP on this host.”

  exit 1

fi

CONFIG_PORTS=”27117 27118 27119″

SHARD1_PORTS=”27017 27317 27417″

SHARD2_PORTS=”27018 27318 27418″

SHARD3_PORTS=”27019 27319 27419″

ROUTE_PORTS=”27217 27218 27219″

CONFIG_ADDRESSES=”$IP:27117,$IP:27118,$IP:27119″

echo -e “Starting  mongodb  cluster at {$IP}…..”

echo -e “Starting config nodes @{$CONFIG_PORTS} …” 

/data/mongo/data/config/startconfig.sh  $CONFIG_PORTS 

echo -e “Starting shard nodes shard1:@{${SHARD1_PORTS}}….”

/data/mongo/data/shard/startshard.sh    ${SHARD1_PORTS}

echo -e “Starting shard nodes shard2:@{${SHARD2_PORTS}}….”

/data/mongo/data/shard/startshard.sh    ${SHARD2_PORTS}

echo -e “Starting shard nodes shard3:@{${SHARD3_PORTS}}….”

/data/mongo/data/shard/startshard.sh    ${SHARD3_PORTS}

echo -e “Starting route nodes @{$ROUTE_PORTS} with CONFIG:{$CONFIG_ADDRESSES}….”

/data/mongo/data/route/startroute.sh    $CONFIG_ADDRESSES $ROUTE_PORTS

echo -e “===ALL DONE=====”

}

stop()

{

PIDS=$(pidof mongod mongos 2>/dev/null)

if [“$PIDS” == “”]

then

   echo -e “NO such process found!”

   exit 1

fi

echo -e “Stopping mongod and mongos:{$PIDS} ….”

kill -9 ${PIDS}

exit 0

}

status()

{

  C_PIDS=$(ps -elf |grep mongod |grep configsvr |grep -v grep |awk ‘{print $4}’ |xargs )

  D_PIDS=$(ps -elf |grep mongod |grep shardsvr |grep -v grep |awk ‘{print $4}’ |xargs )

  R_PIDS=$(ps -elf |grep mongos |grep -v grep |awk ‘{print $4}’ |xargs )

  if [“$C_PIDS” == “”]

  then

 C_STATUS=”NOT running”

  else

 C_STATUS=”Running”

  fi

  if [“$D_PIDS” == “”]

  then

 D_STATUS=”NOT running”

  else

 D_STATUS=”Running”

  fi

  if [“$R_PIDS” == “”]

  then

 R_STATUS=”NOT running”

  else

 R_STATUS=”Running”

  fi

  echo -e “config nodes:{$C_PIDS}:{${C_STATUS}}”

  echo -e “shard nodes :{$D_PIDS}:{${D_STATUS}}”

  echo -e “route nodes :{$R_PIDS}:{${R_STATUS}}”

  exit 0 

}

usage()

{

 echo -e “Usage: $0 [start|stop|status]”

 exit 1

}

case  “$1” in

start)

start

;;

stop)

stop

;;

status)

status

;;

*)

usage

;;

esac

4. 分片 + 副本集架构的标签分片

本文仅对标签分片方式进行测试,测试方法跟单纯的副本集架构方式相同。

在路由节点中添加分片。

前面集群创建过程中已经添加了 3 个分片 shard27017,shard27018,shard27019。

在路由节点中为数据库分片使能。

MongoDB 集群架构之分片 + 副本集架构

图 3

在路由节点中为每个分片指定标签。

MongoDB 集群架构之分片 + 副本集架构

图 4

在路由节点中为集合分配标签。

先需要为集合指定分片键。

MongoDB 集群架构之分片 + 副本集架构

图 5

然后为集合分配标签的键范围。

MongoDB 集群架构之分片 + 副本集架构

图 6

至此,数据库 test 中的集合 t1 已经指定了完整的范围标签。下面进行实际测试。

向集合 t1 中插入一些数据。

MongoDB 集群架构之分片 + 副本集架构

图 7

分别连接到几个分片节点中,查看分片中的数据是否符合标签范围条件。

27317 节点:

MongoDB 集群架构之分片 + 副本集架构

图 8

27418 节点:

MongoDB 集群架构之分片 + 副本集架构

图 9

27319 节点:

MongoDB 集群架构之分片 + 副本集架构

图 10

上述几个副本集中的节点的数据都符合分片规则,至此数据分片成功完成。

5. 分片 + 副本集的优点

Mongodb 分片 + 副本集架构的优点如下:

不存在单点故障问题。

配置节点、分片节点、路由节点均有多个节点组成,或者由副本集组成,因此不存在单点故障问题。

6. 分片 + 副本集的缺点

Mongodb 分片 + 副本集架构的缺点如下:

(1)实际应用环境中,配置一个标准的分片 +��本集架构的集群,至少需要 15 个节点,即 15 台服务器。因此配置工作相对比较繁琐,部署成本较高。

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-22发表,共计4435字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中