MongoDB分片集群搭建
最近搭建了一个Mongodb的分片集群,这里将整个过程做个记录。
一、规划
MongoDB的分片集群,由mongos路由进程、配置服务器、分片集合组成。其中,mongos和配置服务器都是轻量级进程,不会保存数据,配置服务器只保存分片的一些状态信息;而分片集合通常使用复制集(Replica Set)而不是单实例,这样能有效保证不会因某个实例失效而导致整个集群失效。
在本例中,整个分片集群搭建在三台物理服务器(IP分别为192.168.64.161/162/163,简称为w1, w2, w3,均为Windows Server 2012)上。相应地,集群由一个mongos进程、三个config server进程、三个分片集合(分别名为rs1, rs2和rs3,每个集合都包括一个Master、一个Slave、一个Arbiter进程)构成,除mongos外其它进程均为一个mongod进程实例。每个物理服务器上都运行一个master、一个slave、一个arbiter、一个config server(另外轻量级的mongos运行在w1上)进程,以此均匀承担压力。如下图所示:
注意:端口分配规则:master一律为27017,slave一律为27018,arbiter一律为27019,config server一律为30001,mongos为30000。
二、前期准备
l 安装mongodb
在每台物理服务器上安装MongoDB,强烈建议使用相同版本的安装程序(本例中为3.4.10),安装在D:\MongoDB\3.4目录(可以不相同)。详略。
有些可能还需安装VC redist(64位或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
注意:按目前规划,w1上rs2目录其实用不到,因为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, slave1和arbiter1:
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
按照上一步骤将另两个分片集rs2和rs3也配置好,注意目录名、文件名、IP、端口、副本集名与规划保持一致。
此步骤完成后,w1上有master1, slave3和arbiter2三个mongod实例,w2上有master2, arbiter3和slave1三个mongod实例,而w3上有master3, arbiter1和slave2三个mongod实例。
五、 配置config server及mongos
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
在w2和w3上的操作类似,注意区分文件名就可以了。
注意:自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 应用程序连接串
在将原来的单个副本集群改为分片集群后,需将连接串中的host和port改为mongos的IP和端口。
MongoDB的分片集群,由mongos路由进程、配置服务器、分片集合组成。其中,mongos和配置服务器都是轻量级进程,不会保存数据,配置服务器只保存分片的一些状态信息;而分片集合通常使用复制集(Replica Set)而不是单实例,这样能有效保证不会因某个实例失效而导致整个集群失效。
在本例中,整个分片集群搭建在三台物理服务器(IP分别为192.168.64.161/162/163,简称为w1, w2, w3,均为Windows Server 2012)上。相应地,集群由一个mongos进程、三个config server进程、三个分片集合(分别名为rs1, rs2和rs3,每个集合都包括一个Master、一个Slave、一个Arbiter进程)构成,除mongos外其它进程均为一个mongod进程实例。每个物理服务器上都运行一个master、一个slave、一个arbiter、一个config server(另外轻量级的mongos运行在w1上)进程,以此均匀承担压力。如下图所示:
注意:端口分配规则:master一律为27017,slave一律为27018,arbiter一律为27019,config server一律为30001,mongos为30000。