建议查阅官方文档来操作 https://docs.mongodb.com/manual/tutorial/deploy-shard-cluster/
参考文档 https://blog.csdn.net/zlp1992/article/details/77053462
参考文档 https://www.runoob.com/mongodb/mongodb-sharding.html
前提 关闭防火墙
本教程涉及创建一个新的分片集群
它由
a mongos、路由服务器
the config server replica set(配置服务器副本集)
shard replica sets(分片服务器副本集)
组成。
一:创建配置服务器副本集a config server replica set
对于生产部署,部署至少包含三个成员的配置服务器副本集。出于测试目的,您可以创建一个单成员副本集。
这里只部署了一个分片(rs-a),分片包含三个复制集,2个配置服务器复制集、一个路由服务器,因此对应的数据目录如下
包含三个复制集的分片 : 3000 ,3001 ,3002
配置服务器 包含2个实例的复制集 27019,27020
配置路由服务器 27018
一:配置分片复制集 包含三个复制集的分片
step1:
Firstmember: 新打开一个dos窗口
mkdir c:softwareMongoDBdata s-a-0 mongod --port 3000 --shardsvr --replSet rs-a --dbpath "c:softwareMongoDBdata s-a-0"
Secondmember:新打开一个dos窗口
mkdir c:softwareMongoDBdata s-a-1 mongod --port 3001 --shardsvr --replSet rs-a --dbpath "c:softwareMongoDBdata s-a-1"
Thirdmember:新打开一个dos窗口
mkdir c:softwareMongoDBdata s-a-2 mongod --port 3002 --shardsvr --replSet rs-a --dbpath "c:softwareMongoDBdata s-a-2"
这里 --shardsvr
要求使用分片,--replSet
要是使用复制集,复制集名称为 rs-a
,这时我们便创建了包含三个复制集的一个分片,注意复制集名字要一致
上面只是创建了三个可以分片和使用复制集的服务器,我们需要对其初始化设置复制集中的primary和secondary
step2 :
初始化,配置Primary和Secondary复制集
接着再开一个窗口,连接其中的一个服务器,使用命令:mongo --port 3000

C:Users78204>mongo --port 3000 MongoDB shell version v4.0.9 connecting to: mongodb://127.0.0.1:3000/?gssapiServiceName=mongodb
连接后使用命令 rs.initiate() 初始化,过一会儿,此实例便成为了Primary

> rsconf = { ... ... _id: "rs-a", ... ... members: [ ... ... { ... ... _id: 0, ... ... host: "localhost:3000" ... ... }, ... ... { ... ... _id: 1, ... ... host: "localhost:3001" ... ... }, ... ... { ... ... _id: 2, ... ... host: "localhost:3002" ... ... } ... ... ] ... ... } { "_id" : "rs-a", "members" : [ { "_id" : 0, "host" : "localhost:3000" }, { "_id" : 1, "host" : "localhost:3001" }, { "_id" : 2, "host" : "localhost:3002" } ] } > rs.initiate(rsconf) { "ok" : 1, "operationTime" : Timestamp(1562314329, 1), "$clusterTime" : { "clusterTime" : Timestamp(1562314329, 1), "signature" : { "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), "keyId" : NumberLong(0) } } }
可以使用 rs.isMaster()和rs.status()查看对应情况
二:配置 配置服务器 包含2个实例的复制集
step1:
Firstmember:
mkdir c:softwareMongoDBdataconfig0 mongod --port 27019 --configsvr --replSet rs-conf --dbpath "c:softwareMongoDBdataconfig0"
Secondmember:
mkdir c:softwareMongoDBdataconfig1 mongod --port 27020 --configsvr --replSet rs-conf --dbpath "c:softwareMongoDBdataconfig1"
step2 :
这里,复制集名称为rs-conf
,同样我们需要按照前述配置分片复制集那样使用 rs.initiate()
等命令进行配置 登录其中一个服务器mongo --port 27019

C:Users78204>mongo --port 27019 ...省略日志信息 > rsconf = { ... ... _id: "rs-conf", ... ... members: [ ... ... { ... ... _id: 0, ... ... host: "localhost:27019" ... ... }, ... ... { ... ... _id: 1, ... ... host: "localhost:27020" ... ... } ... ... ] ... ... } { "_id" : "rs-conf", "members" : [ { "_id" : 0, "host" : "localhost:27019" }, { "_id" : 1, "host" : "localhost:27020" } ] } > > > > rs.initiate(rsconf) { "ok" : 1, "operationTime" : Timestamp(1562314606, 1), "$gleStats" : { "lastOpTime" : Timestamp(1562314606, 1), "electionId" : ObjectId("000000000000000000000000") }, "lastCommittedOpTime" : Timestamp(0, 0), "$clusterTime" : { "clusterTime" : Timestamp(1562314606, 1), "signature" : { "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), "keyId" : NumberLong(0) } } }
三 :配置路由服务器 router server
step1:
新打开一个dos窗口
C:Users78204>mongos --configdb rs-conf/localhost:27019,localhost:27020 --port 27018
四:添加创建的分片
step1:
新打开一个窗口登录路由服务器
C:Users78204>mongo --port 27018
接着执行添加分片命令 sh.addShard("rs-a/localhost:3000,localhost:3001,localhost:3002")
mongos> sh.addShard("rs-a/localhost:3000,localhost:3001,localhost:3002") { "shardAdded" : "rs-a", "ok" : 1, "operationTime" : Timestamp(1562314727, 8), "$clusterTime" : { "clusterTime" : Timestamp(1562314727, 8), "signature" : { "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), "keyId" : NumberLong(0) } } } mongos>
使用sh.status()
查看分片信息
mongos> sh.status() --- Sharding Status --- sharding version: { "_id" : 1, "minCompatibleVersion" : 5, "currentVersion" : 6, "clusterId" : ObjectId("5d1f077a36b300e597084a56") } shards: { "_id" : "rs-a", "host" : "rs-a/localhost:3000,localhost:3001,localhost:3002", "state" : 1 } active mongoses: "4.0.9" : 1 autosplit: Currently enabled: yes balancer: Currently enabled: yes Currently running: no Failed balancer rounds in last 5 attempts: 0 Migration Results for the last 24 hours: No recent migrations databases: { "_id" : "config", "primary" : "config", "partitioned" : true } mongos>
五:为数据库启用分片
step1:
在对集合进行切分之前,必须为集合的数据库启用切分。为数据库启用分片不会重新分发数据,但是可以对数据库中的集合进行分片。
为数据库启用分片之后,MongoDB为数据库分配一个主分片,MongoDB将所有数据存储在这个数据库中
sh.enableSharding("<database>")
mongos> sh.enableSharding("zt_power") { "ok" : 1, "operationTime" : Timestamp(1562315445, 5), "$clusterTime" : { "clusterTime" : Timestamp(1562315445, 5), "signature" : { "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), "keyId" : NumberLong(0) } } } mongos>
六:对集合进行分片
step1:
要分割一个集合,使用sh.shardCollection()方法。必须指定集合的完整名称空间和包含切分键的文档。前提是数据库必须启用分片。
您选择的切分键会影响切分的效率,以及您利用某些切分特性(如区域)的能力
如果集合已经包含数据,在使用shardCollection()之前,必须使用db.collection.createIndex()方法在切分键上创建索引
如果集合为空,MongoDB将创建索引作为sh.shardCollection()的一部分。
以下操作对目标集合进行切分:
sh.shardCollection("<database>.<collection>", { <key> : <direction> } )
如下是对zt_power库的otherData集合进行分片 分片键是terminalTime 1表示肯定
mongos> sh.shardCollection("zt_power.otherData", { terminalTime : 1 } ) { "collectionsharded" : "zt_power.otherData", "collectionUUID" : UUID("6ce80157-fe4b-472b-878a-7bc191b91e21"), "ok" : 1, "operationTime" : Timestamp(1562315964, 14), "$clusterTime" : { "clusterTime" : Timestamp(1562315964, 14), "signature" : { "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), "keyId" : NumberLong(0) } } } mongos>
七:登录客户端的配置服务器查看分片信息
八:由于只有一个分片 这个分片由三个复制集组成 现在查看复制集的一致性
登录主节点 3000 在主节点插入数据

C:Users78204>mongo --port 3000 rs-a:PRIMARY> for(var i=0;i<15010;i++){ db.otherData.insert({"rulerCode" : "04000103","terminalTime" : "2019-06-20 19:19:39"})} WriteResult({ "nInserted" : 1 }) rs-a:PRIMARY> db.otherData.count() 15011 rs-a:PRIMARY>
登录俩个辅助节点 3001和3001 查看数据个数

rs-a:SECONDARY>mongo --port 3001 rs-a:SECONDARY> db.getMongo().setSlaveOk() rs-a:SECONDARY> db.otherData.count() 15011

rs-a:SECONDARY>mongo --port 3002 rs-a:SECONDARY> db.getMongo().setSlaveOk() rs-a:SECONDARY> db.otherData.count() 15011
结论:这个分片的三个副本集 其中一个主节点增加数据 来个辅助节点同步数据 保持了数据的一致性