您的当前位置:首页正文

MongoDB高可用集群配置方案

2020-07-30 来源:品趣旅游知识分享网
MongoDB⾼可⽤集群配置⽅案

原⽂地址:

1. 集群架构(⽣产可⽤)

MongoDB机器信息

192.168.252.121mongosconfig server

192.168.252.122mongosconfig server

192.168.252.123mongosconfig server

shard server1 主节点shard server1 副节点shard server1 仲裁shard server2 仲裁

shard server2 主节点shard server2 副节点

shard server3 主节点

shard server3 副节点shard server3 仲裁端⼝分配:

mongos:20000config:21000shard1:27001shard2:27002shard3:27003

Sharding分⽚技术

当数据量⽐较⼤的时候,我们需要把数据分⽚运⾏在不同的机器中,以降低CPU、内存和IO的压⼒,Sharding就是数据库分⽚技术。MongoDB分⽚技术类似MySQL的⽔平切分和垂直切分,数据库主要由两种⽅式做Sharding:垂直扩展和横向切分。垂直扩展的⽅式就是进⾏集群扩展,添加更多的CPU,内存,磁盘空间等。横向切分则是通过数据分⽚的⽅式,通过集群统⼀提供服务:

(1)MongoDB的Sharding架构

(2)MongoDB分⽚架构中的⾓⾊A.数据分⽚(Shards)

⽤来保存数据,保证数据的⾼可⽤性和⼀致性。可以是⼀个单独的mongod实例,也可以是⼀个副本集。

在⽣产环境下Shard⼀般是⼀个Replica Set,以防⽌该数据⽚的单点故障。所有Shard中有⼀个PrimaryShard,⾥⾯包含未进⾏划分的数据集合:

B.查询路由(Query Routers)

路由就是mongos的实例,客户端直接连接mongos,由mongos把读写请求路由到指定的Shard上去。⼀个Sharding集群,可以有⼀个mongos,也可以有多mongos以减轻客户端请求的压⼒。C.配置服务器(Config servers)

保存集群的元数据(metadata),包含各个Shard的路由规则。Sharding分⽚技术(混合模式)⾼可⽤⽅案的⼤体架构图:

Sharding分⽚技术(混合模式)⾼可⽤⽅案架构下向mongodb写数据的流程图:

Sharding分⽚技术(混合模式)⾼可⽤⽅案架构下向mongodb读数据的流程图:

以下所有配置在3台服务器上都要进⾏配置

2. 下载安装

wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-amazon-3.6.2.tgztar -xzvf mongodb-linux-x86_64-amazon-3.6.2.tgz -C /usr/local/

所有版本⼆进制⽂件,⾃⾏下载

https://www.mongodb.org/dl/win32/x86_64-2008plus-ssl?_ga=2.87139544.1567998244.1517190032-1153843332.1517190032&_gac=1.204211492.151721

改名

cd /usr/local/

mv mongodb-linux-x86_64-amazon-3.6.2 mongodb

分别在每台机器建⽴conf、mongos、config、shard1、shard2、shard3六个⽬录,因为mongos不存储数据,只需要建⽴⽇志⽂件⽬录即可。

mkdir -p /usr/local/mongodb/conf \\mkdir -p /usr/local/mongodb/mongos/log \\mkdir -p /usr/local/mongodb/config/data \\mkdir -p /usr/local/mongodb/config/log \\mkdir -p /usr/local/mongodb/shard1/data \\mkdir -p /usr/local/mongodb/shard1/log \\mkdir -p /usr/local/mongodb/shard2/data \\mkdir -p /usr/local/mongodb/shard2/log \\mkdir -p /usr/local/mongodb/shard3/data \\mkdir -p /usr/local/mongodb/shard3/log

配置环境变量

vi /etc/profile

# MongoDB 环境变量内容

export MONGODB_HOME=/usr/local/mongodbexport PATH=$MONGODB_HOME/bin:$PATH

使⽴即⽣效

source /etc/profile

3. 配置config server服务器

mongodb3.4以后要求配置服务器也创建副本集,不然集群搭建不成功。添加配置⽂件

vi /usr/local/mongodb/conf/config.conf## 配置⽂件内容

pidfilepath = /usr/local/mongodb/config/log/configsrv.piddbpath = /usr/local/mongodb/config/data

logpath = /usr/local/mongodb/config/log/congigsrv.loglogappend = truebind_ip = 0.0.0.0port = 21000fork = true

#declare this is a config db of a cluster;configsvr = true#副本集名称replSet = configs#设置最⼤连接数

启动三台服务器的config server

mongod -f /usr/local/mongodb/conf/config.conf

登录任意⼀台配置服务器,初始化配置副本集

连接 MongoDB

mongo --port 21000

config 变量

config = { _id : \"configs\ members : [

{_id : 0, host : \"192.168.252.121:21000\" }, {_id : 1, host : \"192.168.252.122:21000\" }, {_id : 2, host : \"192.168.252.123:21000\" } ]}

初始化副本集

rs.initiate(config)

其中,\"_id\" : \"configs\"应与配置⽂件中配置的 replicaction.replSetName ⼀致,\"members\" 中的 \"host\" 为三个节点的 ip 和 port响应内容如下

> config = {... _id : \"configs\... members : [

... {_id : 0, host : \"192.168.252.121:21000\" },... {_id : 1, host : \"192.168.252.122:21000\" },... {_id : 2, host : \"192.168.252.123:21000\" }... ]... }{

\"_id\" : \"configs\ \"members\" : [ {

\"_id\" : 0,

\"host\" : \"192.168.252.121:21000\" }, {

\"_id\" : 1,

\"host\" : \"192.168.252.122:21000\" },

此时会发现终端上的输出已经有了变化。

//从单个⼀个>//变成了

configs:SECONDARY>

查询状态

configs:SECONDARY> rs.status()

4. 配置分⽚副本集

第⼀分⽚副本集

配置⽂件

vi /usr/local/mongodb/conf/shard1.conf#配置⽂件内容

#——————————————–

pidfilepath = /usr/local/mongodb/shard1/log/shard1.piddbpath = /usr/local/mongodb/shard1/data

logpath = /usr/local/mongodb/shard1/log/shard1.loglogappend = truebind_ip = 0.0.0.0port = 27001fork = true#副本集名称replSet = shard1

#declare this is a shard db of a cluster;shardsvr = true

启动三台服务器的shard1 server

mongod -f /usr/local/mongodb/conf/shard1.conf

登陆任意⼀台服务器,初始化副本集(除了192.168.252.123)连接 MongoDB

mongo --port 27001

使⽤admin数据库

use admin

定义副本集配置

config = { _id : \"shard1\ members : [

{_id : 0, host : \"192.168.252.121:27001\" }, {_id : 1, host : \"192.168.252.122:27001\" },

{_id : 2, host : \"192.168.252.123:27001\" , arbiterOnly: true } ] }

初始化副本集配置

rs.initiate(config)

响应内容如下

> use admin

switched to db admin> config = {... _id : \"shard1\... members : [

... {_id : 0, host : \"192.168.252.121:27001\" },... {_id : 1, host : \"192.168.252.122:27001\" },

... {_id : 2, host : \"192.168.252.123:27001\" , arbiterOnly: true }... ]... }{

\"_id\" : \"shard1\ \"members\" : [ {

\"_id\" : 0,

\"host\" : \"192.168.252.121:27001\" }, {

\"_id\" : 1,

此时会发现终端上的输出已经有了变化。

//从单个⼀个>//变成了

shard1:SECONDARY>

查询状态

shard1:SECONDARY> rs.status()

第⼆分⽚副本集

配置⽂件

vi /usr/local/mongodb/conf/shard2.conf#配置⽂件内容

#——————————————–

pidfilepath = /usr/local/mongodb/shard2/log/shard2.piddbpath = /usr/local/mongodb/shard2/data

logpath = /usr/local/mongodb/shard2/log/shard2.loglogappend = truebind_ip = 0.0.0.0port = 27002fork = true#副本集名称replSet=shard2

#declare this is a shard db of a cluster;shardsvr = true

启动三台服务器的shard2 server

mongod -f /usr/local/mongodb/conf/shard2.conf

连接 MongoDB

mongo --port 27002

使⽤admin数据库

use admin

定义副本集配置

config = { _id : \"shard2\ members : [

{_id : 0, host : \"192.168.252.121:27002\" , arbiterOnly: true }, {_id : 1, host : \"192.168.252.122:27002\" }, {_id : 2, host : \"192.168.252.123:27002\" } ] }

初始化副本集配置

rs.initiate(config)

响应内容如下

> use admin

switched to db admin> config = {... _id : \"shard2\... members : [

... {_id : 0, host : \"192.168.252.121:27002\" , arbiterOnly: true },... {_id : 1, host : \"192.168.252.122:27002\" },... {_id : 2, host : \"192.168.252.123:27002\" }... ]... }{

\"_id\" : \"shard2\ \"members\" : [ {

\"_id\" : 0,

\"host\" : \"192.168.252.121:27002\ \"arbiterOnly\" : true }, {

第三分⽚副本集

vi /usr/local/mongodb/conf/shard3.conf#配置⽂件内容

#——————————————–

pidfilepath = /usr/local/mongodb/shard3/log/shard3.piddbpath = /usr/local/mongodb/shard3/data

logpath = /usr/local/mongodb/shard3/log/shard3.loglogappend = truebind_ip = 0.0.0.0port = 27003fork = true#副本集名称replSet=shard3

#declare this is a shard db of a cluster;shardsvr = true

启动三台服务器的shard3 server

mongod -f /usr/local/mongodb/conf/shard3.conf

登陆任意⼀台服务器,初始化副本集(除了192.168.252.121)

mongo --port 27003

使⽤admin数据库

use admin

定义副本集配置

config = { _id : \"shard3\ members : [

{_id : 0, host : \"192.168.252.121:27003\" },

{_id : 1, host : \"192.168.252.122:27003\" , arbiterOnly: true}, {_id : 2, host : \"192.168.252.123:27003\" } ] }

初始化副本集配置

rs.initiate(config)

响应内容如下

> use admin

switched to db admin> config = {... _id : \"shard3\... members : [

... {_id : 0, host : \"192.168.252.121:27003\" },

... {_id : 1, host : \"192.168.252.122:27003\" , arbiterOnly: true},... {_id : 2, host : \"192.168.252.123:27003\" }... ]... }{

\"_id\" : \"shard3\ \"members\" : [ {

\"_id\" : 0,

\"host\" : \"192.168.252.121:27003\" }, {

\"_id\" : 1,

5. 配置mongos路由服务器

(三台机器)先启动配置服务器和分⽚服务器,后启动路由实例启动路由实例:

vi /usr/local/mongodb/conf/mongos.conf#内容

pidfilepath = /usr/local/mongodb/mongos/log/mongos.pidlogpath = /usr/local/mongodb/mongos/log/mongos.loglogappend = truebind_ip = 0.0.0.0port = 20000fork = true

#监听的配置服务器,只能有1个或者3个 configs为配置服务器的副本集名字

configdb = configs/192.168.252.121:21000,192.168.252.122:21000,192.168.252.123:21000#设置最⼤连接数maxConns = 20000

启动三台服务器的mongos server

mongos -f /usr/local/mongodb/conf/mongos.conf

串联路由服务器

⽬前搭建了mongodb配置服务器、路由服务器,各个分⽚服务器,不过应⽤程序连接到mongos路由服务器并不能使⽤分⽚机制,还需要在程序⾥设置分⽚配置,让分⽚⽣效。登陆任意⼀台mongos

mongo --port 20000

使⽤admin数据库

use admin

串联路由服务器与分配副本集

sh.addShard(\"shard1/192.168.252.121:27001,192.168.252.122:27001,192.168.252.123:27001\");sh.addShard(\"shard2/192.168.252.121:27002,192.168.252.122:27002,192.168.252.123:27002\");sh.addShard(\"shard3/192.168.252.121:27003,192.168.252.122:27003,192.168.252.123:27003\");

查看集群状态

sh.status()

响应内容如下

mongos> sh.status()--- Sharding Status --- sharding version: { \"_id\" : 1,

\"minCompatibleVersion\" : 5, \"currentVersion\" : 6,

\"clusterId\" : ObjectId(\"5a713a37d56e076f3eb47acf\") } shards:

{ \"_id\" : \"shard1\ { \"_id\" : \"shard2\ { \"_id\" : \"shard3\ active mongoses: \"3.6.2\" : 3 autosplit:

Currently enabled: yes balancer:

Currently enabled: yes Currently running: no

启⽤集合分⽚⽣效

⽬前配置服务、路由服务、分⽚服务、副本集服务都已经串联起来了,但我们的⽬的是希望插⼊数据,数据能够⾃动分⽚。连接在mongos上,准备让指定的数据库、指定的集合分⽚⽣效。登陆任意⼀台mongos

mongo --port 20000

使⽤admin数据库

use admin

指定testdb分⽚⽣效,如下图:

db.runCommand( { enablesharding :\"testdb\或

mongos> sh.enablesharding(\"testdb\")

指定数据库⾥需要分⽚的集合和⽚键,哈希name分⽚,如下图:

db.runCommand( { shardcollection : \"testdb.table1\或

mongos> sh.shardcollection(\"testdb.table1\

通过命令查看mongodb路由服务器上的shards集合会有数据展⽰,如下图:

通过命令查看mongodb路由服务器上的chunks集合会有数据展⽰,如下图:

我们设置testdb的 table1 表需要分⽚,根据 id 或name⾃动分⽚到 shard1 ,shard2,shard3 上⾯去。要这样设置是因为不是所有mongodb 的数据库

和表 都需要分⽚!测试分⽚配置结果连接 MongoDB 路由服务

mongo 127.0.0.1:20000

切换到 testdb 数据库

use testdb;

插⼊测试数据

for(i=1;i<=100000;i++){db.table1.insert({\"id\":i,\"name\":\"penglei\

总条数

db.table1.aggregate([{$group : {_id : \"$name\

查看分⽚情况如下

shard1: \"count\": 33755shard2: \"count\": 33143,shard3: \"count\": 33102结论数据基本均匀

db.table1.stats();

mongos> db.table1.stats();{

\"sharded\": true, \"capped\": false, \"ns\": \"testdb.table1\ \"count\": 100000, \"size\": 5200000, \"storageSize\": 1519616, \"totalIndexSize\": 3530752, \"indexSizes\": { \"_id_\": 892928, \"id_hashed\": 2637824 },

\"avgObjSize\": 52, \"nindexes\": 2, \"nchunks\": 6, \"shards\": { \"shard1\": {

\"ns\": \"testdb.table1\

分组查看总数量是:100000

mongos> db.table1.aggregate([{$group : {_id : \"$name\{ \"_id\" : \"penglei\mongos>

6. 后期运维

参考

⼿把⼿教你 MongoDB 的安装与详细使⽤(⼀)⼿把⼿教你 MongoDB 的安装与详细使⽤(⼆)创建索引

db.table1.createIndex({\"name\":1})db.table1.getIndexes()

7. 启动说明

mongodb的启动顺序是,先启动配置服务器,在启动分⽚,最后启动mongos.

mongod -f /usr/local/mongodb/conf/config.confmongod -f /usr/local/mongodb/conf/shard1.confmongod -f /usr/local/mongodb/conf/shard2.confmongod -f /usr/local/mongodb/conf/shard3.confmongod -f /usr/local/mongodb/conf/mongos.conf

启动报错

about to fork child process, waiting until server is ready for connections.forked process: 1303

child process started successfully, parent exiting

[root@node1 ~]# mongod -f /usr/local/mongodb/conf/shard1.confabout to fork child process, waiting until server is ready for connections.forked process: 1384

删除 mongod.lock

cd /usr/local/mongodb/shard1/datarm -rf mongod.lock

关闭

#debian、ubuntu系统下:apt-get install psmisc#centos或、rhel系统下:yum install psmisc

关闭时,直接killall杀掉所有进程

killall mongodkillall mongos

参考:Runoob 教程:MongoDB 官⽹地址:MongoDB 官⽅英⽂⽂档:MongoDB 各平台下载地址:MongoDB 安装

mongodb⾼可⽤具体配置参考:

Mongodb主从复制 及 副本集+分⽚集群梳理:搭建 MongoDB分⽚(sharding) / 分区 / 集群环境:

因篇幅问题不能全部显示,请点此查看更多更全内容