MongoDB 3.4 分片 由副本集组成(2)

以上所有操作,对Config副本集进行初始化非常重要,网上有很多示例都没有对Config副本集进行初始化,会导致mongos服务无法开启,连接不上router服务器

现在开始配置router的配置mongos.cfg

configdb=configset/DESKTOP-4NVUAKK:41001,192.168.20.229:41002,192.168.20.229:41003 logpath=D:\mongodatas\router\log\mongod.log logappend=true port=50000

注意configdb的配置,新版本里面采用 replSet/hsot:port,host:port的形式,其中host必须采用config副本集里面rs.status()出来的members中的name,否则会执行失败,如果configdb中的副本集没有执行初始化设定Primary ,此时用Service是无法启动成功的,但是用指令启动会给人一种启动成功的假象,查看router对应的日志会发现一只在尝试连接Config副本集: No primary detected for set configset,此时查看任务管理器会发现有mongos的进程,查看端口会发现router的端口并未打开 

以托管到Service的方式开始Router服务

sc create MongoRouter binPath= "C:\Program Files\MongoDB\Server\3.4\bin\mongos.exe --config=D:\mongodatas\shard-a1\mongos.cfg --service" net start MongoRouter

注意上面的执行程序是mongos而不是mongod 配置文件名不要弄错了

正常启动Router服务器之后,连接到router数据库的MongoDB Shell

mongo --port 50000

MongoDB 3.4 分片 由副本集组成

开始为router指定分片副本集,具体操作如截图所示

sh.addShard("replSet/host:port,host:port")

注意不要使用localhost或者127.0.0.1,否则会报错

MongoDB 3.4 分片 由副本集组成

使用与副本集Members里面name不一致的host也是会报错的

MongoDB 3.4 分片 由副本集组成

正常情况下添加成功如下

查看数据库config中的shards集合

db.getSiblingDB("config").shards.find() 或者 db.runCommand({listshards:1})

MongoDB 3.4 分片 由副本集组成

到现在为止,分片环境已经搭建成功,但要引用到数据库和文档上,还需要对数据库和文档进行分片

开启一个数据库上的分片,这是对任何集合进行分片的先决条件

sh.enableSharding("dbName")

完成之后去config里查看是否分片

db.getSiblingDB("config").databases.find()

对数据库上的某个集合进行分片,要定义一个分片键,可以使用组合分片建,像我使用的是author和_id的组合,如果是对现有集合进行分片,必须在运行shardcollection命令前创建一个与分片键对应的索引

sh.shardCollection("dbName.collectionName",{key1:1,key2:1}) db.getSiblingDB("config").collections.find()

对空集合进行、分片时 MongoDB会字每个分片上创建一个与分片键对应的索引,可以直接连接分片,用getIndexes()验证,此时数据量还没达到分片标准啊,分片shard-a副本集还没有创建books

MongoDB 3.4 分片 由副本集组成

用客户端连接router服务器(和连接普通服务器一样)插入大量数据,调用sh.status()可以看到分配到两个shard上保存了

db.chunks.count("shard","shard-a")

db.chunks.count("shard","shard-b")

查看拆分次数

db.changelog.count({what:"split"}) 

查看迁移次数

db.changelog.find({what:"moveChunk.commit"}).count()

可以通过db.books.find(****).explain() 查看执行计划

如果查询条件包含分片键,则能很快找到对应分区 针对性查询,否则将遍历所有分区 全局/分散/聚集查询

db.books.ensureIndex({title:1}) 在title上创建索引

每个分片都维护自己的索引,每个分片上的分片集合都应该拥有相同的索引

分片集合只允许在_id字段和分片键上添加唯一索引

分片键是不可以修改的,不要使用升序分片键,粒度不能太细(如照片就不应该按md5分,而应该按所属人分)

副本集的每个成员都应该在一个单独的服务器上,用于复制的成员要有自己的机器,

仲裁节点和配置节点可以与其他进程共享主机,但需要部署在不同服务器

少数大分片比大量小分片好

手动块拆分

sh.splitAt("dbname.collectionName",{key,value,key:value}) 根据key分块  value是数据库中的值,根据这个值拆分成两块

sh.moveChunk("dbname.collectionName",{key,value},"shardB") 将包含key为value的文档移动到分片B

更多MongoDB相关教程见以下内容

MongoDB文档、集合、数据库简介 

MongoDB 3分片部署及故障模拟验证 

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/1cd5c31ce09c5741fff8512a65ae2fd3.html