MongoDB高可用复制集分片集群搭建

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MongoDB高可用复制集分片集群搭建相关的知识,希望对你有一定的参考价值。

1     逻辑架构

1.1     逻辑架构图

 技术分享

 

1.2     组件说明

一、mongos(query routers):查询路由,负责client的连接,并把任务分给shards,然后收集结果。一个集群可以有多个query routers(replica sets),以分担客户端请求(负载均衡)。 

二、config server:配置服务器。保存了集群的元数据(比如数据放在哪个shards上),query router通过config server中的配置信息决定把任务分配到哪个shards上。从版本3.2开始,config servers可以做成replica sets。 

三、shards:分片,即数据结点,存储数据和执行计算。为了保证高可用和数据一致性,生产环境中shards 应该做成replicasets(防止丢失数据)。

2     服务器规划

2.1     IP及端口规划

 

 技术分享

2.2     linux目录规划

 技术分享

 

3     集群搭建

3.1     准备工作

1、  根据服务器系统版本,来下载最新版MongoDB(3.2.x),下载地址:https://www.mongodb.com/download-center?jmp=nav#community

2、  根据2.2节的目录规划,在6台机器中的任意一台上建好相应目录,并将下载好的MongoDB解压到/data01/项目名/mongodb/下;

3、  执行以下指令创建keyfile:

a)        openssl rand -base64 741 > /data01/项目名/mongodb/keyfile/keyfile

b)       chmod 300 /data01/项目名/mongodb/keyfile/keyfile

4、  根据2.1节的端口规划,在6台机器上依次执行如下指令,以开放相应端口:

vi /etc/sysconfig/iptables 

-A INPUT -m state --state NEW -m tcp -p tcp --dport 17017 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 27017 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 37017 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 47017 -j ACCEPT

 

-A INPUT -m state --state NEW -m tcp -p tcp --dport 57017 -j ACCEPT

3.2     参数配置

3.2.1       configServer配置

新建2.2节中的configsvr.conf文件,文件内容如下:

dbpath =/data01/项目名/mongodb/data/configsvr

configsvr = true

port = 27017 

logpath =/data01/项目名/mongodb/logs/configsvr.log

logappend = true

fork = true 

replSet=configRS

keyFile =/data01/项目名/mongodb/keyfile/keyfile

3.2.2       routeServer配置

新建2.2节中的mongos.conf文件,文件内容如下:

configdb =C1:27017,C2:27017,C3:27017

port = 17017

chunkSize = 5 

logpath =/data01/项目名/mongodb/logs/mongos.log

logappend = true

fork = true 

keyFile =/data01/项目名/mongodb/keyfile/keyfile

3.2.3       Shard配置

新建2.2节中的shard1.conf、shard2.conf、shard3.conf文件,文件内容如下:

shard1.conf

dbpath = /data01/项目名/mongodb/data/shard1

shardsvr = true

replSet = shard1 

port = 37017

oplogSize = 100 

logpath = /data01/项目名/mongodb/logs/shard1.log

logappend = true

fork = true 

keyFile =/data01/项目名/mongodb/keyfile/keyfile

shard2.conf

dbpath = /data01/项目名/mongodb/data/shard2

shardsvr = true

replSet = shard2 

port = 47017

oplogSize = 100 

logpath = /data01/项目名/mongodb/logs/shard2.log

logappend = true

fork = true 

keyFile =/data01/项目名/mongodb/keyfile/keyfile

shard3.conf

dbpath = /data01/项目名/mongodb/data/shard3

shardsvr = true

replSet = shard3 

port = 57017

oplogSize = 100 

logpath = /data01/项目名/mongodb/logs/shard3.log

logappend = true

fork = true 

keyFile =/data01/项目名/mongodb/keyfile/keyfile

到此,所有配置文件都已经建好,通过scp指令将整个/data01/项目名/mongodb目录拷贝到其余5台机器。

3.2.4        创建用户

分别在C1、C2、C3上运行以下命令:

/data01/项目名/mongodb/bin/mongod -f /data01/项目名/mongodb/config/configsvr.conf

再在C1上运行:/data01/项目名/mongodb/bin/mongo --port 27017

配置config server为replica sets

>use admin

>rs.initiate( {_id: "configRS",configsvr: true,members: [{ _id: 0, host: "C1:27017" },{ _id: 1, host: "C2:27017" },{ _id: 2, host: "C3:27017" }]})

>rs.status()

创建用户

  1. 启动routeServer。分别在C1、C2、C3上运行以下命令:

/data01/项目名/mongodb/bin/mongos -f /data01/项目名/mongodb/config/mongos.conf

  1. 在C1上执行:

/data01/项目名/mongodb/bin/mongo --port 17017

mongos> use admin

mongos>db.createUser( {user: "xxx", pwd:  "xxx",  roles:  [ { role: "root",  db: "admin" } ] })

mongos>db.auth(“xxx”,”xxx”)

 

      mongos>exit

3.2.5  配置Shard

采用以下命令启动S1、S2和S3上的shard1、shard2、shard3: 

备注:先依次启动S1的shard1、S2的shard2、S3的shard3,再启动其余的。

/data01/项目名/mongodb/bin/mongod -f /data01/项目名/mongodb/config/shard1.conf

/data01/项目名/mongodb/bin/mongod -f /data01/项目名/mongodb/config/shard2.conf

/data01/项目名/mongodb/bin/mongod -f /data01/项目名/mongodb/config/shard3.conf

查看是否正常启动:netstat -lnpt

启动后连接到shard1、shard2、shard3的任意一台机器,来配置每个shard为replica sets,以下是具体配置过程:

Shard1

/data01/项目名/mongodb/bin/mongo --port 37017

>use admin

 >config = {“_id”:"shard1", members: [                            {“_id”: 0,”host”:"S1:37017"},                           {“_id”: 1, “host”:"S2:37017"},                           {“_id”: 2, “host”:"S3:37017"}]            } 

>rs.initiate(config)

>exit

Shard2

/data01/项目名/mongodb/bin/mongo --port 47017

>use admin

 >config = {“_id”:"shard2", members: [                            {“_id”: 0,”host”:"S1:47017"},                           {“_id”: 1, “host”:"S2:47017"},                           {“_id”: 2, “host”:"S3:47017"}]            } 

>rs.initiate(config)

>exit

Shard3

/data01/项目名/mongodb/bin/mongo --port 57017

>use admin

 >config = {“_id”:"shard3", members: [                            {“_id”: 0,”host”:"S1:57017"},                           {“_id”: 1, “host”:"S2:57017"},                           {“_id”: 2, “host”:"S3:57017"}]            } 

>rs.initiate(config)

>exit

3.2.6       配置分片

配置分片只需在一台机器上操作即可,这里选择在C1上执行:

/data01/项目名/mongodb/bin/mongo --port 17017

mongos> use admin

mongos>db.auth("xxx","xxx")(3.2.4中创建的用户)

mongos>db.runCommand({addshard:"shard1/S1:37017,S2:37017,S3:37017",name:"shard1", maxsize:20480} )

mongos>db.runCommand({addshard:"shard2/S1:47017,S2:47017,S3:47017",name:"shard2", maxsize:20480} )

mongos>db.runCommand({addshard:"shard3/S1:57017,S2:57017,S3:57017",name:"shard3", maxsize:20480} )

 验证分片。继续在C1执行:

db.runCommand({listShards:1})

激活分片配置。使用

sh.enableSharding("库名");

新增库并进行分片。

使用

sh.shardCollection("库名.集合名",{"_id":"hashed"});

创建对应的表(collection)并进行hash分片。

使用 use 库名 切换到新建的库

使用

db.createUser({user:"xxx",pwd:"xxx",roles:[{role:"dbOwner", db:"库名"}]});

创建对应用户。

验证路由

1、  use 库名(上面新建的库);

2、  插入一批测试数据:for(var i=0;i<10;i++){db.集合名.insert({name:"jeff"+i});}

3、  验证:db.集合名.stats()

以上是关于MongoDB高可用复制集分片集群搭建的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB分片集群原理搭建及测试详解

高可用MongoDB集群部署详解——搭建MongoDB副本集

MongoDB分片集群搭建

高可用mongodb集群的学习记录(四mongodb分片集群搭建)

mongodb3.6集群搭建:分片+副本集

mongodb 3.4 集群搭建:分片+副本集