mongodb分片

这篇文章最后更新的时间在六个月之前,文章所叙述的内容可能已经失效,请谨慎参考!

MongoDB集群规划表

节点 主机 端口 副本集
路由服务器0 Router 27017
配置集节点0 ConfigServer1 27018 cfg
配置集节点1 ConfigServer2 27019 cfg
分片0节点0 rs0_0 27020 rs0
分片0节点1 rs0_1 27021 rs0
分片0节点2 rs0_2 27022 rs0
分片1节点0 rs1_0 27023 rs1
分片1节点1 rs1_1 27024 rs1
分片1节点2 rs1_2 27025 rs1

一个路由服务器 两个配置节点,一主一副本 两个分片,两个分片都是三个节点,一主二副本

集群部署的步骤

0.新建一些必要的文件和文件夹

日志文件,pid文件,以及存放数据的文件夹

rm -r -f /data/log && \
rm -r -f /data/pid && \
rm -r -f /data/mydb && \
mkdir /data/log && \
mkdir /data/pid && \
mkdir /data/mydb && \
mkdir /data/mydb/config0 && \
mkdir /data/mydb/config1 && \
mkdir /data/mydb/rs0_0 && \
mkdir /data/mydb/rs0_1 && \
mkdir /data/mydb/rs0_2 && \
mkdir /data/mydb/rs1_0 && \
mkdir /data/mydb/rs1_1 && \
mkdir /data/mydb/rs1_2 && \
touch /data/log/config0.log && \
touch /data/log/config1.log && \
touch /data/log/rs0_0.log && \
touch /data/log/rs0_1.log && \
touch /data/log/rs0_2.log && \
touch /data/log/rs1_0.log && \
touch /data/log/rs1_1.log && \
touch /data/log/rs1_2.log && \
touch /data/log/mongos.log && \
touch /data/pid/config0.pid && \
touch /data/pid/config1.pid && \
touch /data/pid/rs0_0.pid && \
touch /data/pid/rs0_1.pid && \
touch /data/pid/rs0_2.pid && \
touch /data/pid/rs1_0.pid && \
touch /data/pid/rs1_1.pid && \
touch /data/pid/rs1_2.pid && \
touch /data/pid/mongos.pid

1.部署配置节点

启动两个配置节点

mongod --configsvr --replSet "cfg" --bind_ip_all --port 27018 --fork --logpath /data/log/config0.log --logappend --pidfilepath /data/pid/config0.pid --dbpath /data/mydb/config0

mongod --configsvr --replSet "cfg" --bind_ip_all --port 27019 --fork --logpath /data/log/config1.log --logappend --pidfilepath /data/pid/config1.pid --dbpath /data/mydb/config1

进入第一个配置节点

mongo --port 27018

把配置节点加入副本集

rs.initiate( {
   _id: "cfg",
   configsvr: true,
   members: [
      { _id: 0, host: "127.0.0.1:27018" },
      { _id: 1, host: "127.0.0.1:27019" }
   ]
} )

2.部署分片节点

启动第一个分片的副本集

mongod --shardsvr --replSet "rs0" --bind_ip_all --port 27020 --fork --logpath /data/log/rs0_0.log --logappend --pidfilepath /data/pid/rs0_0.pid --dbpath /data/mydb/rs0_0

mongod --shardsvr --replSet "rs0" --bind_ip_all --port 27021 --fork --logpath /data/log/rs0_1.log --logappend --pidfilepath /data/pid/rs0_1.pid --dbpath /data/mydb/rs0_1

mongod --shardsvr --replSet "rs0" --bind_ip_all --port 27022 --fork --logpath /data/log/rs0_2.log --logappend --pidfilepath /data/pid/rs0_2.pid --dbpath /data/mydb/rs0_2

进入第一个分片的副本集的第一个节点

mongo --port 27020

把分片节点加入副本集

rs.initiate( {
   _id : "rs0",
   members: [
      { _id: 0, host: "127.0.0.1:27020" },
      { _id: 1, host: "127.0.0.1:27021" },
      { _id: 2, host: "127.0.0.1:27022" }
   ]
})

启动第二个分片的副本集

mongod --shardsvr --replSet "rs1" --bind_ip_all --port 27023 --fork --logpath /data/log/rs1_0.log --logappend --pidfilepath /data/pid/rs1_0.pid --dbpath /data/mydb/rs1_0

mongod --shardsvr --replSet "rs1" --bind_ip_all --port 27024 --fork --logpath /data/log/rs1_1.log --logappend --pidfilepath /data/pid/rs1_1.pid --dbpath /data/mydb/rs1_1

mongod --shardsvr --replSet "rs1" --bind_ip_all --port 27025 --fork --logpath /data/log/rs1_2.log --logappend --pidfilepath /data/pid/rs1_2.pid --dbpath /data/mydb/rs1_2

进入第二个分片的副本集的第一个节点

mongo --port 27023

把分片节点加入副本集

rs.initiate( {
   _id : "rs0",
   members: [
      { _id: 0, host: "127.0.0.1:27023" },
      { _id: 1, host: "127.0.0.1:27024" },
      { _id: 2, host: "127.0.0.1:27025" }
   ]
})

3.部署路由节点

启动路由节点

mongos --configdb cfg/127.0.0.1:27018,127.0.0.1:27019 --bind_ip_all --port 27017 --fork --logpath /data/log/mongos.log --logappend --pidfilepath /data/pid/mongos.pid

进入路由节点

mongo --port 27017

把两个分片加入到路由里

sh.addShard("rs0/127.0.0.1:27020,127.0.0.1:27021,127.0.0.1:27022")
sh.addShard("rs1/127.0.0.1:27023,127.0.0.1:27024,127.0.0.1:27025")

创建分片集合

sh.enableSharding('需要分片的库名')
sh.shardCollection('需要分片的库名.需要分片集合名', {'片键':'hashed'})

一些常用的命令

查看集群状态

sh.status()

查看分片状态

db.stats()

查看是否为主节点

db.isMaster()