要在真实环境中实现MongoDB分片至少需要四台服务器做分片集群服务器,其中包含两个Shard分片副本集(每个包含两个副本节点及一个仲裁节点)、一个配置副本集(三个副本节点,配置不需要仲裁节点),其中Shard的副本节点必须拥有单独的服务器,通常一个Shard副本集由3个以上副本节点组成更好,奇数个副本节点不需要额外配置仲裁节点。因为仲裁节点和配置节点不需要耗费很多的资源,可以与其他进程共享一台服务器。
当然了,对于平时学习而言,配置那么多服务器是不现实的,用VM虚拟机也不现实,毕竟MongoDB内存开销不小,所以暂时将所有需要的数据库配置在同一台电脑,以不同端口区分,其中包含以下几个数据库
Shard节点
Shard-a-1 端口 37001
Shard-a-2 端口 37002
Shard-a-3 端口 37003
--------------------------------------------------------------------
Shard-b-1 端口 37011
Shard-b-2 端口 37012
Shard-b-3 端口 37013
Config节点
Config-1 端口 41001
Config-2 端口 41002
Config-3 端口 41003
Router节点
Router 端口 50000
文件目录大概如下,其中router中的config改为 mongos.cfg
其中Shard节点和Config节点和开启普通MongoDB数据库一样,用Mongod启动,在Windows下不能使用 fork参数后台化,个人更推荐使用Service来托管
其中Shard节点的配置如下,每个文件夹下对应的配置把dbpath/logpath/replSet(shard-a和shard-b)改掉,因为要开启多个db所以httpinterface设置为false,不开启监听,否则每个db都会对应多一个端口号+1000的监听端口,37002的监听端口为38002
dbpath=D:\mongodatas\shard-a2\data logpath=D:\mongodatas\shard-a2\log\mongod.log logappend=true directoryperdb=true rest=true httpinterface=false port=37002 shardsvr=true replSet=shard-a
Config节点的配置如下,与shard节点的区别就是shardsvr换成了configsvr,配置服务器是不会开启监听端口的
dbpath=D:\mongodatas\config1\data logpath=D:\mongodatas\config1\log\mongod.log logappend=true directoryperdb=true rest=true port=41001 configsvr=true replSet=configset
接下来以托管到Service的方式启动所有的Shard节点和Config节点,以下只是启动其中一个,一共有九个(shard-a有3个,shard-b有3个,config有3个),在命令提示符(管理员) 的窗口执行,普通权限会报错的,下文用到Service的一样
sc create MongoShardA1 binPath= "C:\Program Files\MongoDB\Server\3.4\bin\mongod.exe --config=D:\mongodatas\shard-a1\mongod.cfg --service" net start MongoShardA1
使用命令 services.msc打开服务窗口查看服务是否开启或者使用 netstat -nao指令查端口是否开启,如果全都正常开启,则开始配置Shard副本集
任意连接shard-a中服务器 (37001/37002/37003)打开MongoDB Shell
mongo --port 37001
对副本集进行初始化,如果对rs方法不熟悉,可以使用rs.help()显示帮助文档
rs.initiate()
此时发现37001端口的命令输入已经成为了副本集的形式,接下来添加另外两个成员,一个副本节点,一个仲裁节点
rs.add("localhost:37002") rs.add("localhost:37003",{arbiterOnly:true})
最好使用本机的内网地址,而不是使用localhost或者127.0.0.1
接下来查看副本集是否运行正常
rs.status()
退出现有MongoDB Shell或者开启新的CMD进入Shard-b中任意服务器对Shard-b副本集进行初始化,进入Config副本集任意服务器对Config副本集进行初始化,注意Config副本集进行初始化的时候不需要指定仲裁节点