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

1     逻辑架构

1.1     逻辑架构图linux

 

 

1.2     组件说明

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

2、config server:配置服务器。保存了集群的元数据(好比数据放在哪一个shards上),query router经过config server中的配置信息决定把任务分配到哪一个shards上。从版本3.2开始,config servers能够作成replica sets。 数据库

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

2     服务器规划

2.1     IP及端口规划架构

 

 

2.2     linux目录规划app

 

 

3     集群搭建

3.1     准备工做

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

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

三、  执行如下指令建立keyfile:测试

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

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

四、  根据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        建立用户

分别在C一、C二、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。分别在C一、C二、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

采用如下命令启动S一、S2和S3上的shard一、shard二、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

启动后链接到shard一、shard二、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分片。

使用

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

建立对应的表(collection)并进行并按_id区间分片。

例子:

sh.shardCollection("records.people", { "zipcode": 1, "name": 1 } ) 
sh.shardCollection("people.addresses", { "state": 1, "_id": 1 } ) 
sh.shardCollection("assets.chairs", { "type": 1, "_id": 1 } ) 
db.alerts.ensureIndex( { _id : "hashed" } ) 
sh.shardCollection("events.alerts", { "_id": "hashed" } )
这些分片操做按顺序依次表示为:
数据库records 中的People集合使用了片键{ “zipcode” : 1, “name” : 1 }
这个片键经过字段zipcode的值进行数据分配。若是这个有大量相同的值,则会根据name字段的值对块进行分裂。
数据库people的addresses集合使用了片键{ “state” : 1, “_id” : 1 }
这个片键经过字段state的值进行数据分配。若是这个有大量相同的值,则会根据_id字段的值对块进行分裂。
数据库assets的chairs集合使用了片键{ “type” : 1, “_id” : 1 }
这个片键经过字段type的值进行数据分配。若是这个有大量相同的值,则会根据_id字段的值对块进行分裂。
数据库events的alerts集合使用了片键{ “_id” : “hashed” }
在版本2.4中最新出现的。
这个片键经过字段_id的散列值进行数据分配。MongoDB计算_id字段的散列值做为散列索引,它将提供集群中文档的均匀分布。

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

使用

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

建立对应用户。

验证路由

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

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

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

相关文章
相关标签/搜索