MongoDB分片集群搭建

最近搭建了一个Mongodb的分片集群,这里将整个过程做个记录。

一、规划

MongoDB的分片集群,由mongos路由进程、配置服务器、分片集合组成。其中,mongos和配置服务器都是轻量级进程,不会保存数据,配置服务器只保存分片的一些状态信息;而分片集合通常使用复制集(Replica Set)而不是单实例,这样能有效保证不会因某个实例失效而导致整个集群失效。

在本例中,整个分片集群搭建在三台物理服务器(IP分别为192.168.64.161/162/163,简称为w1, w2, w3,均为Windows Server 2012)上。相应地,集群由一个mongos进程、三个config server进程、三个分片集合(分别名为rs1, rs2rs3,每个集合都包括一个Master、一个Slave、一个Arbiter进程)构成,除mongos外其它进程均为一个mongod进程实例。每个物理服务器上都运行一个master、一个slave、一个arbiter、一个config server(另外轻量级的mongos运行在w1上)进程,以此均匀承担压力。如下图所示:

 

注意:端口分配规则:master一律为27017slave一律为27018arbiter一律为27019config server一律为30001mongos30000

二、前期准备

l  安装mongodb

在每台物理服务器上安装MongoDB,强烈建议使用相同版本的安装程序(本例中为3.4.10),安装在D:\MongoDB\3.4目录(可以不相同)。详略。

有些可能还需安装VC redist64位或32位,依服务器操作系统而定),否则将来启动时可能报“api-ms-win-crt-runtimel1-1-0.dll缺失”的错误。

l  创建目录

在每台物理服务器上创建配置目录(可共用一个)、数据目录(每分片集一个)、日志目录(建议每分片集一个)。以w1为例:

mkdir D:\mongodata\conf\db

mkdir D:\mongodata\conf\log

mkdir D:\mongodata\rs1\db

mkdir D:\mongodata\rs2\db

mkdir D:\mongodata\rs3\db

mkdir D:\mongodata\rs1\log

mkdir D:\mongodata\rs2\log

mkdir D:\mongodata\rs3\log

另外在w1,再为mongos创建日志目录:

mkdir D:\mongodata\mongos\log

注意:按目前规划,w1rs2目录其实用不到,因为arbiter2进程对数据无影响;此处为统一而保留。

l  修改防火墙

 

修改每台服务器的防火墙,开放27017, 27018, 27019, 30000, 30001端口。详略。

三、配置第一个分片集rs1

l  w1上配置master1的配置文件,假设为master1.conf,目录为D:\mongodata\conf

port = 27017

bind_ip=0.0.0.0

pidfilepath = D:\mongodata\conf\master1.pid

logpath = D:\mongodata\rs1\log\master1.log

dbpath = D:\mongodata\rs1\db

journal = true

nohttpinterface = true

directoryperdb = true

logappend = true

replSet =rs1

l  w2上配置slave1的配置文件,假设为slave1.conf,目录为D:\mongodata\conf

port = 27018

bind_ip=0.0.0.0

pidfilepath = D:\mongodata\conf\slave1.pid

logpath = D:\mongodata\rs1\log\slave1.log

dbpath = D:\mongodata\rs1\db

journal = true

nohttpinterface = true

directoryperdb = true

logappend = true

replSet =rs1

l  w3上配置arbiter1的配置文件,假设为arbiter1.conf,目录为D:\mongodata\conf

port = 27019

bind_ip=0.0.0.0

pidfilepath = D:\mongodata\conf\arbiter1.pid

logpath = D:\mongodata\rs1\log\arbiter1.log

dbpath = D:\mongodata\rs1\db

journal = true

nohttpinterface = true

directoryperdb = true

logappend = true

replSet =rs1

l  启动分片集rs1

在三台服务器分别启动master1, slave1arbiter1

D:\> mongod.exe -f D:\mongodata\conf\master1.cfg

D:\> mongod.exe -f D:\mongodata\conf\slave1.cfg

D:\> mongod.exe -f D:\mongodata\conf\arbiter1.cfg

再用MongoDB shell连接master所在服务器:

D:\mongo 192.168.64.161:27017

> use admin

> config = { _id:"rs1",  members:

     [ {_id:0,host:'192.168.64.161:27017'}, 

      {_id:1,host:'192.168.64.162:27018'},   

      {_id:2,host:'192.168.64.163:27019',arbiterOnly:true}] };

执行副本集初始化:

> rs.initiate(config)

成功(出现提示"OK":1)后,可检查集群的状态:

 

> rs.status()

四、配置另两个分片集rs2和rs3

按照上一步骤将另两个分片集rs2rs3也配置好,注意目录名、文件名、IP、端口、副本集名与规划保持一致。

 

此步骤完成后,w1上有master1, slave3arbiter2三个mongod实例,w2上有master2, arbiter3slave1三个mongod实例,而w3上有master3, arbiter1slave2三个mongod实例。

五、 配置config servermongos

l  config server的配置文件

在三台服务器各配置一个config server

w1为例,其配置文件名为configsvr1.conf,目录为D:\mongodata\conf

port = 30001

bind_ip=0.0.0.0

logpath = D:\mongodata\conf\log\configsvr1.log

dbpath = D:\mongodata\conf\db

configsvr = true

replSet = cfgReplSet

w2w3上的操作类似,注意区分文件名就可以了。

注意:3.4版起,congig server必须设置replSet项,否则无法初始化。

l  mongos的配置文件

只在w1上进行,文件名为mongos.conf,目录为D:\mongodata\conf

logpath = D:\mongodata\mongos\log\mongos.log

port = 30000

bind_ip=0.0.0.0

configdb=cfgReplSet/192.168.64.161:30001, 192.168.64.162:30001, 192.168.64.163:30001

l  启动config server

在三台服务器启动config server

D:\> mongod.exe -f D:\mongodata\conf\configsvr1.cfg

D:\> mongod.exe -f D:\mongodata\conf\configsvr2.cfg

D:\> mongod.exe -f D:\mongodata\conf\configsvr3.cfg

再用MongoDB shell连接w1

D:\mongo 192.168.64.161:30001

> use admin

> config = { _id:"rs1",  members:

     [ {_id:0,host:'192.168.64.161:30001'}, 

      {_id:1,host:'192.168.64.162:30001'},   

      {_id:2,host:'192.168.64.163:30001'}] };

config server的副本集初始化与检查状态命令与其它副本集一样:

> rs.initiate(config)

> rs.status()

注意:config server可以不需要仲裁角色(arbiter)。

w1上启动mongos

D:\> mongod.exe -f D:\mongodata\conf\mongos.cfg

l  增加各分片副本集至集群

登录mongos

D:\mongo 192.168.64.161:30000

此时的命令提示符与之前的不同,为“mongos>”。依次添加三个副本集:

mongos > sh.addShard("rs1/192.168.64.161:27017")

mongos > sh.addShard("rs2/192.168.64.162:27017")

mongos > sh.addShard("rs3/192.168.64.163:27017")

成功后,可以检查整个集群的状态:

mongos > sh.status()

检查分片的情况:

mongos > use admin

 

mongos > runCommand({listShards:1})

六、其它事项

l  mongos实例

本例中mongos为单实例,为进一步提高可靠性,可将mongos也配置为多实例。方法很简单,在每台服务器都运行一个mongos并添加分片副本集。

l  应用程序连接串

在将原来的单个副本集群改为分片集群后,需将连接串中的hostport改为mongosIP和端口。

 

 

MongoDB的分片集群,由mongos路由进程、配置服务器、分片集合组成。其中,mongos和配置服务器都是轻量级进程,不会保存数据,配置服务器只保存分片的一些状态信息;而分片集合通常使用复制集(Replica Set)而不是单实例,这样能有效保证不会因某个实例失效而导致整个集群失效。

在本例中,整个分片集群搭建在三台物理服务器(IP分别为192.168.64.161/162/163,简称为w1, w2, w3,均为Windows Server 2012)上。相应地,集群由一个mongos进程、三个config server进程、三个分片集合(分别名为rs1, rs2rs3,每个集合都包括一个Master、一个Slave、一个Arbiter进程)构成,除mongos外其它进程均为一个mongod进程实例。每个物理服务器上都运行一个master、一个slave、一个arbiter、一个config server(另外轻量级的mongos运行在w1上)进程,以此均匀承担压力。如下图所示:

 
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

注意:端口分配规则:master一律为27017slave一律为27018arbiter一律为27019config server一律为30001mongos30000

posted @ 2018-01-31 11:42  闻歌感旧  阅读(758)  评论(0编辑  收藏  举报