MongoDB副本集+分片集群搭建(windows下)
环境信息:
操作系统:windows
mongodb版本:mongodb-win32-x86_64-2008plus-ssl-3.4.10-signed.msi
3台虚拟机:
192.168.2.138 192.168.2.113 192.168.2.112
集群环境:
2个分片副本集
shard1(192.168.2.138:27018 192.168.2.113:27018 192.168.2.112:27018)
shard2(192.168.2.138:27019 192.168.2.113:27019 192.168.2.112:27019)
1个config副本集
(192.168.2.138:28018 192.168.2.113:28018 192.168.2.112:28018)
1个mongos路由节点
192.168.2.138:28017(可以有多个)
文件夹:
/mongodb
/conf
配置文件
/config
/data
/log
/mongos
/data
/log
/shard1
/data
/log
/shard2
/data
/log
搭建mongodb分片副本集
shard1集群搭建步骤
- 添加repl1副本集配置文件 shard1.conf (138/112/113)
##副本集配置
# fork: 后台运行 windows中需要注释掉
#fork=true
#数据路径
dbpath=D:\mongodb\shard1\data
#日志路径
logpath=D:\mongodb\shard1\log\shard1.log
logappend=true
#端口
port=27018
bind_ip=0.0.0.0
#副本集名称
replSet=repl1
smallfiles=true
#分片集群必须要有的属性
shardsvr=true
- 添加repl2副本集配置文件 shard2.conf (138/112/113)
##副本集配置
#后台运行 windows中需要注释掉
#fork=true
#数据路径
dbpath=D:\mongodb\shard2\data
#日志路径
logpath=D:\mongodb\shard2\log\shard2.log
logappend=true
#端口
port=27019
bind_ip=0.0.0.0
#副本集名称
replSet=repl2
smallfiles=true
#分片集群必须要有的属性
shardsvr=true
- 启动副本集
#linux下根据自己的路径进行修改
${MONGODB_HOME}/bin/mongod -f shard1.conf
#windows下 不支持上面的语句 所以只能改用为windows服务
#每台机器上都要执行
"C:\Program Files\MongoDB\Server\3.4\bin\mongod.exe" --config "D:\mongodb\conf\shard1.conf" --serviceName "shard1" --serviceDisplayName "shard1" --install
net start shard1
"C:\Program Files\MongoDB\Server\3.4\bin\mongod.exe" --config "D:\mongodb\conf\shard2.conf" --serviceName "shard2" --serviceDisplayName "shard2" --install
net start shard2
- 登录其中一台机器的副本集,添加初始化配置,进入27018
#初始化配置 repl1
${MONGODB_HOME}/bin/mongo.exe -port 27018
- 进入客户端之后,执行初始化命令
> rs.initiate({
_id:'repl1',
members:[
{_id:0, host:'192.168.2.138:27018'},
{_id:1, host:'192.168.2.113:27018'},
{_id:2, host:'192.168.2.112:27018'}
]
})
- 进入27019
#初始化配置 repl2
${MONGODB_HOME}/bin/mongo.exe -port 27019
- 初始化
> rs.initiate({
_id:'repl2',
members:[
{_id:0, host:'192.168.2.138:27019'},
{_id:1, host:'192.168.2.113:27019'},
{_id:2, host:'192.168.2.112:27019'}
]
})
查看状态
xxxPRIMARY > rs.status()
- 搭建config节点副本集 创建config.conf配置文件 (138/113/112)
# 日志存储路径
logpath=D:\mongodb\config\log\config.log
# 数据存储路径
dbpath=D:\mongodb\config\data
logappend=true
# 端口
port=28018
bind_ip=0.0.0.0
auth=false
# 是否一个库一个文件夹
directoryperdb=true
oplogSize=2048
# 节点名称
replSet=configReplSet
configsvr=true
- 启动配置副本集
#linux下根据自己的路径进行修改
${MONGODB_HOME}/bin/mongod -f config.conf
#windows下 不支持上面的语句 所以只能改用为windows服务
#每台机器上都要执行
"C:\Program Files\MongoDB\Server\3.4\bin\mongod.exe" --config "D:\mongodb\conf\config.conf" --serviceName "config" --serviceDisplayName "config" --install
net start config
- 初始化配置节点,其中一台机器进入28018
#初始化配置 config
# 登录 指定端口和IP
${MONGODB_HOME}/bin/mongo.exe -host 192.168.2.138 -port 28018
初始化命令
> rs.initiate({
_id:'configReplSet',
members:[
{_id:0, host:'192.168.2.138:28018'},
{_id:1, host:'192.168.2.113:28018'},
{_id:2, host:'192.168.2.112:28018'}
]
})
- 搭建mongos节点 mongos配置文件(138)
# 日存储路径
logpath=D:\mongodb\mongos\log\mongos.log
logappend=true
bind_ip=0.0.0.0
port=28017
#fork=true
#监听的配置服务器,只能有1个或者3个 配置服务器副本集名称(replSet)/ip地址:端口
configdb=configReplSet/192.168.2.138:28018,192.168.2.113:28018,192.168.2.112:28018
- 启动mongos
#linux下根据自己的路径进行修改
${MONGODB_HOME}/bin/mongos -f mongos.conf
#windows下 不支持上面的语句 所以只能改用为windows服务
#每台机器上都要执行
"C:\Program Files\MongoDB\Server\3.4\bin\mongos.exe" --config "D:\mongodb\conf\mongos.conf" --serviceName "mongos" --serviceDisplayName "mongos" --install
net start mongos
# 登录mongos节点
${MONGODB_HOME}/bin/mongo 192.168.2.138:28017
- 在mongos中添加集群中的分片节点
# 切换admin
mongos> use admin
#添加shard1副本集
mongos> db.runCommand({
addShard: "repl1/192.168.2.138:27018,192.168.2.113:27018,192.168.2.112:27018",
name: "shard1"
})
#添加shard2副本集
mongos> db.runCommand({
addShard: "repl2/192.168.2.138:27019,192.168.2.113:27019,192.168.2.112:27019",
name: "shard2"
})
# 查看分片
mongos> db.runCommand({
listshards:1
})
# 查看状态
mongos> sh.status()
测试分片集群
- 开启数据库分片配置
# 开启分片数据库
mongos> db.runCommand({ enablesharding : "testdb"})
- 创建分片的key键
# 根据id进行分片
mongos> db.runCommand({
shardcollection : "testdb.user",
key : {id : 1}
})
# 这边2个执行语句是创库创表,执行如果找不到表会自动创表和表的索引
如果开启已经存在的库表 需要自己创建表索引
mongos> use testdb
mongos> db.user.ensureIndex({
id : 1
})
- 添加测试数据
var arr=[]
for(var i=0;i<2000000;i++){
var uid=i;
var name="testdata"+uid;
arr.push({
"id":uid,
"name":name
})
}
db.user.insertMany(arr)
其他命令
# 添加分片
db.runCommand({
addShard: "repl2/192.168.2.138:27019,192.168.2.113:27019,192.168.2.112:27019",
name: "shard2"
})
# 删除分片
db.runCommand({ removeShard:"shard1" })
# 开启分片数据库
db.runCommand({enablesharding:"testdb"})
# 开启分片集合
db.runCommand({enablesharding:"testcollect"})
# 如果片键要设置为非_id的键,则要先建立索引
db.testcollect.ensureIndex({"name":1})
# 设置片键类型
//哈希片键
db.runCommand({shardcollection: "db.collect", key:{name:"hashed" }})
//递增片键(name的数据类型为整型)
db.runCommand({shardcollection: "db.collect", key:{name:1 }})
//随机片键(name的数据类型为字符串)
db.runCommand({shardcollection: "db.collect", key:{name:1 }})
副本集有关(replication set):
rs.
分片集群(sharding cluster)
sh.
# 启动集群支持分片
sh.enableSharding("testShard")
mongos> use 库名
mongos> db.集合名.ensureIndex({"键名":1}) ##创建索引
mongos> sh.enableSharding("库名") ##开启库的分片
mongos> sh.shardCollection("库名.集合名",{"键名":1}) ##开启集合的分片并指定片键
后期运维
mongodb的启动顺序是,先启动配置服务器,在启动分片,最后启动mongos.
关闭时,直接killall杀掉所有进程