MongoDB叢集架構之分片+副本集架構
在熱門的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:從節點
分片節點的啟動指令碼如下:
圖1
分片節點啟動之後需要分別初始化3個副本集,初始化方法不再贅述。
路由節點啟動指令碼。
指令碼跟單純的分片架構相同,不再贅述。
路由節點啟動後,需要新增分片節點到路由中,新增的方法跟單純副本集方式有所不同。
圖2
至此分片+副本集架構的Mongodb叢集環境搭建完畢。
3.分片+副本集的總控指令碼
為了測試方便,編寫了總控指令碼。總控指令碼需要啟動三種類型共15個節點。
[root@coe2coe data]# cat cluster.sh
#!/bin/bash
##################################################################
# FileName :startcluster.sh
# Author : [email protected]
# 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。
在路由節點中為資料庫分片使能。
圖3
在路由節點中為每個分片指定標籤。
圖4
在路由節點中為集合分配標籤。
先需要為集合指定分片鍵。
圖5
然後為集合分配標籤的鍵範圍。
圖6
至此,資料庫test中的集合t1已經指定了完整的範圍標籤。下面進行實際測試。
向集合t1中插入一些資料。
圖7
分別連線到幾個分片節點中,檢視分片中的資料是否符合標籤範圍條件。
27317節點:
圖8
27418節點:
圖9
27319節點:
圖10
上述幾個副本集中的節點的資料都符合分片規則,至此資料分片成功完成。
5.分片+副本集的優點
Mongodb分片+副本集架構的優點如下:
不存在單點故障問題。
配置節點、分片節點、路由節點均有多個節點組成,或者由副本集組成,因此不存在單點故障問題。
6.分片+副本集的缺點
Mongodb分片+副本集架構的缺點如下:
(1)實際應用環境中,配置一個標準的分片+��本集架構的叢集,至少需要15個節點,即15臺伺服器。因此配置工作相對比較繁瑣,部署成本較高。
Linux公社的RSS地址 : ofollow,noindex" target="_blank">https://www.linuxidc.com/rssFeed.aspx
本文永久更新連結地址: https://www.linuxidc.com/Linux/2018-10/154876.htm