mongodb切片问题

27 篇文章 0 订阅
11 篇文章 0 订阅
本文详细介绍了MongoDB的分片机制,包括mongod进程、mongos路由进程和配置服务器的角色。通过启用分片、设置片键和管理chunks,确保数据在集群中的自动平衡。同时,讨论了哈希分片的实现,并分享了在实际操作中遇到的问题及解决策略,如数据插入、分片配置和平衡过程。
摘要由CSDN通过智能技术生成

:可以普通的mongod进程,也可以是副本集。但是即使一片内有多台服务器,也只能有一个主服务器,其他的服务器保存相同的数据。

mongos路由进程:它路由所有请求,然后将结果聚合。它不保存存储数据或配置信息。

配置服务器:存储集群的配置信息。

整个分布式的集群通过mongos对客户端提供了一个透明统一的接口,客户端不需要关系具体的分片细节,所有分片的动作都是自动执行的,那是如何做到透明和自动的。

切分数据

搭建集群略。。。。

1、登录mongos

use admin

db.runCommand({"enablesharding":"test"}) #对test库开启分片功能

db.runCommand({"shardcollection":"test.user","key":{"id":1}})##对user表开启分片

注意:需要切换到admin库执行命令。

片键:上面的key就是所谓的片键(shard key)。MongoDB不允许插入没有片键的文档。但是允许不同文档的片键类型不一样,MongoDB内部对不同类型有一个排序:

Chunks:理解MongoDB分片机制的关键是理解Chunks。mongodb不是一个分片上存储一个区间,而是每个分片包含多个区间,这每个区间就是一个块。

平衡:如果存在多个可用的分片,只要块的数量足够多,MongoDB就会把数据迁移到其他分片上,这个迁移的过程叫做平衡。Chunks默认的大小是64M,查看config.settings可以看到这个值:

在test库下的user表中插入数据:

for(i=0;i<100000;i++){ db.bizuser.insert({"Uid":i,"Name":"zhanjindong","Age":13,"Date":new Date()}); }

进入到config库下使用db.chunks.find()查看块的情况;

《深入学习MongoDB》中有如下描述:

 分片不能包含集群中已有的数据库,但是如果集群里有一个foo数据库,而新添加的分片里包含bar数据库,那么不会产生任何问题,因为配置服务器会注意道它,而它会出现在集群信息中。

表内插入数据:for(i=0;i<10;i++){ db.bizuser.insert({"Uid":i,"Name":"zhanjindong2","Age":13,"Date":new Date()}); }

一般首次对库进行分片成功的机率不是很大,比如我在前两次搭建时,数据到达一定大小后,它就会自动分片,第三次搭建完之后在按照之前的数值大小,命令搭建完之后没有分片;在网上搜查后提示:“说要先删除这个库,在创建一个新的跟其差不多的然后在添加分片即可成功”

尝试删除后,增减新的库名后,通过一条语法将表中插入几万条数据后,执行以下命令:

Use admin

Db.runCommand({enablesharding:test20})

Db.runCommand({shardcollection:test20.user,key:{id:1}})(执行后可能会报错)进入test20库,执行db.user.createIndex({"id":1})

Use config

Db.chunks.find()(查看config库下块的情况)

重建之前的test库,这次使用哈希分片,选择id作为片键:

Use admin

Db.runCommand({enablesharding:test})

Db.runCommand({shardcollection:test.user,key:{id:hashed}})

Use config

Db.chunks.find()

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值