MongoDB集群搭建(分片+副本集)
分片则指为处理大量数据,将数据分开存储,不同服务器保存不同的数据,它们的数据总和即为整个数据集。追求的是高性能。 副本集是在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性。在生产环境中,通常是这两种技术结合使用,分片+副本集。
本篇文章采用的版本为3.6。
1.搭建环境
系统:windows10
服务器:192.168.6.1/2/3
MongoDB版本:3.6
服务器1 | 服务器2 | 服务器3 |
---|---|---|
mongos | mongos | mongos |
config server | config server | config server |
shard1 分片1的主节点 | shard1 分片1的副节点 | shard1 分片1的仲裁节点 |
shard2 分片2的副节点 | shard2 分片2的仲裁节点 | shard2 分片2的主节点 |
shard3 分片3的仲裁节点 | shard3 分片3的主节点 | shard3 分片3的副节点 |
分别在每台机器建立mongos、config、shard1、shard2、shard3六个目录,因为mongos不存储数据,只需要建立日志文件目录即可,conf目录用于存放配置服务器,mongos用于存放路由服务器,config用于存放配置服务器,shard1、shard2、shard3用于存放分片副本集的主节点、副节点、仲裁节点。
2.分别搭建三台服务器上的分片副本集
1.主节点配置文件
systemLog:
destination: file
path: D:\Mongodb3.6\data\log\mongod.log
storage:
dbPath: D:\Mongodb3.6\data\db
net:
port: 27017
bindIp: 0.0.0.0
replication:
replSetName: rs_test01 指定所属副本集
sharding:
clusterRole: shardsvr 指定节点的分片角色,shardsvr分片服务器,configsvf配置服务器
2.副节点配置文件
systemLog:
destination: file
path: D:\Mongodb3.6\data\log\mongod.log
storage:
dbPath: D:\Mongodb3.6\data\db
net:
port: 27017
bindIp: 0.0.0.0
replication:
replSetName: rs_test01
3.仲裁节点配置文件
systemLog:
destination: file
path: D:\Mongodb3.6\data\log\mongod.log
storage:
dbPath: D:\Mongodb3.6\data\db
net:
port: 27017
bindIp: 0.0.0.0
replication:
replSetName: rs_test01
副本集初始化流程:
1.启动三台服务器的上的分片节点,进入mongodb/bin目录下,通过如下命令启动mongo服务:
mongod --config D:\Mongodb3.6\mongod.cfg
2.登陆任意一台服务器
mongo --port 27017
3.使用admin数据库
use admin
4.初始化副本集,初始化方式有两种:
第一种:首先直接调用rs.initiate()方法,然后通过rs.add("ip:port")的方法设置副节点,通过rs.addArb("ip:port",true)的方法设置仲裁节点。
第二种:
1.首先声明一个config变量:
config = {
_id : "副本集名称",
members : [
{ id : 0 , host : "192.168.6.1:27017" },
{ id : 1 , host : "192.168.6.2:27017" },
{ id : 2 , host : "192.168.6.3:27017" , arbiterOnly : true},
]
}
2.然后通过rs.initiate(config)方法根据config配置变量初始化副本集。
根据上面的步骤,修改IP或端口就可以配置其余两个分片。
3.配置服务器副本集搭建
配置文件
systemLog:
destination: file
path: D:\Mongodb3.6_cfg_rs2\data\log\mongod.log
storage:
dbPath: D:\Mongodb3.6_cfg_rs2\data\db
net:
port: 27027
bindIp: 0.0.0.0
replication:
replSetName: rs_test_cfg
sharding:
clusterRole: configsvr
配置副本集初始化流程与上面的分片副本集初始化流程一样。
配置服务器副本集,需要3个节点,虽然官方说可以设置1个或3个,但是经过测试,配置服务器副本集只设置一个节点时,无法使用mongos命令链接路由服务器。配置服务器副本集中的3个节点中不能设置仲裁节点否则在报错(Arbiters are not allowed in replica set configurations being used for config servers)。
4.路由服务器搭建
配置文件
systemLog:
destination: file
path: D:\Mongodb3.6_mongos\data\log\mongod.log
net:
port: 27037
bindIp: 0.0.0.0
sharding:
#监听的配置服务器,只能有1个或者3个 configs为配置服务器的副本集名字
configDB: rs_test_cfg/192.168.6.1:27027,192.168.6.2:27027,192.168.6.3:27027
5.分片
目前搭建了mongodb配置服务器、路由服务器,各个分片服务器,不过应用程序连接到mongos路由服务器并不能使用分片机制,还需要在程序里设置分片配置,让分片生效。
登陆任意一台mongos,进入/usr/local/mongodb/bin目录下
mongos --port 27037
使用admin数据库
use admin
串联路由服务器与分配副本集
sh.addShard("rs_test01/192.168.6.1:27017,192.168.6.2:27017,192.168.6.3:27017")
sh.addShard("rs_test02/192.168.6.1:27027,192.168.6.2:27027,192.168.6.3:27027")
sh.addShard("rs_test03/192.168.6.1:27037,192.168.6.2:27037,192.168.6.3:27037")
查看集群状态
sh.status()
6、 测试
目前配置服务、路由服务、分片服务、副本集服务都已经串联起来了,但我们的目的是希望插入数据,数据能够自动分片。连接在mongos上,准备让指定的数据库、指定的集合分片生效。
指定数据库testdb分片生效
sh.enableSharding("testdb")
指定数据库里需要分片的集合和片键
sh.shardCollection("testdb.testCollection",{id:"hashed"})
关于分片键的介绍可以查看文章:https://blog.youkuaiyun.com/wenniuwuren/article/details/52945137
我们设置testdb的 testCollection表需要分片,根据 id 自动分片到 shard1 ,shard2,shard3 上面去。要这样设置是因为不是所有mongodb 的数据库和表 都需要分片!插入100000条数据测试:
查看分配状态
db.testCollection.stats();