本人mongodb版本:MongoDB server version: 3.4.7
一、分片部署的结构
1、分片a(副本集1主1备1仲裁)
2、分片b(副本集1主1备1仲裁)
3、配置集群(副本及1主2备)
4、mongos
二、创建分片a、分片b
(1)创建目录
rs-a-1
rs-a-2
rs-a-3
rs-b-1
rs-b-2
rs-b3
(2)创建分片a
mongod --shardsvr --replSet shard-a --dbpath=rs-a-1 --port 30000 --logpath=rs-a-1.log --nojournal
mongod --shardsvr --replSet shard-a --dbpath=rs-a-2 --port 30001 --logpath=rs-a-2.log --nojournal
mongod --shardsvr --replSet shard-a --dbpath=rs-a-3 --port 30003 --logpath=rs-a-3.log --nojournal
mongod --shardsvr --replSet shard-b --dbpath=rs-b-1 --port 30100 --logpath=rs-b-1.log --nojournal
mongod --shardsvr --replSet shard-b --dbpath=rs-b-2 --port 30101 --logpath=rs-b-2.log --nojournal
mongod --shardsvr --replSet shard-b --dbpath=rs-b-3 --port 30102 --logpath=rs-b-3.log --nojournal
hostName:主机名或者ip
分片a集群
mongo 127.0.0.1:30000
rs.initiate()
rs.add("hostName:30001")
rs.add("hostName:30002",{arbiterOnly:true})
分片b同理
(1)创建目录
config-1
config-2
config-3
(2)创建配置
mongod --configsvr --replSet conf --dbpath=config-1 --port 27019 --logpath=config-1.log --logappend
mongod --configsvr --replSet conf --dbpath=config-2 --port 27020 --logpath=config-2.log --logappend
mongod --configsvr --replSet conf --dbpath=config-3 --port 27021 --logpath=config-3.log --logappend
mongo 127.0.0.1:27019
rs.initiate()
rs.add("hostName:27020")
rs.add("hostName:27021")
四、启动mongos
mongos --configdb conf/hostName:27019,hostName:27020,hostName:27021 --logpath=mongos.log --port 40000
mongodb3.4的版本强制配置要设置成副本集,启动mongos时指定配置副本集的名称conf
五、添加分片
先连接mongos
mongo 127.0.0.1:40000
sh.addShard可以用于添加分片,它接受一个字符串,字符串包含副本集名称,随后是两个或多个要连接的种子节点地址。这里你指定两个先前创建的副本集,用的是每个副本集中的非仲裁节点的地址
添加分片ash.addShard("shard-a/hostName:30000,lhostName:30001")
添加分片b
sh.addShard("shard-b/hostName:30100,hostName:30101")
db.getSiblingDB("config").shards.find()
或者
sh.status()
查看
sh.enableSharding("dbName")
七、创建集合的分片键
定义分片键,利用sh.shardCollection("dbName.collectionName",key),参数一是数据库的集合,参数二是使用的索引sh.shardCollection("dbName.user",{_id:1,username:1})
参考:https://www.cnblogs.com/lazyboy/archive/2012/11/26/2789401.html
因为user这个表里面根本没有{_id:1,username:1}这个混合索引,先给user表创建混合索引{_id:1,username:1}
use dbName
db.user.ensureIndex({_id:1,name:1})
sh.shardCollection("dbName.user",{_id:1,username:1})