Mongodb分片学习

分片

提高集群处理的性能,可同时提高应用的读写性能

  • 输入sh.status()命令会显示当前分片的运行状况, 此报告包括哪个分片是数据库的主分片以及分片中的分块分布

  • 片键一般选择的是索引,当查询时应该利用索引进行查询,这样mongos会将查询发往对应分片,而不是发送到所有的分片上

分片的几个成员

image


1.配置服务器
配置服务器存储群集的元数据和配置设置,配置服务器在 config 数据库 中存储了集群的元信息。 从MongoDB 3.4开始,配置服务器必须部署为副本集(CSRS)。而且最好不要手动修改config数据库中的数据

config数据库包含包含分片群集元数据的集合。当元数据发生更改时,
MongoDB会将数据写入配置数据库,例如在块迁移或块拆分之后。

如果三个节点的集群中一个或者两个配置服务器不可用,集群的元信息将变为 可读,
你还可以从分片中读写信息,但是数据块的迁移以及数据块的分裂在所有配置服务器都恢复可用之前不能够进行.

---

2.mongos轻量级的服务器
它将读写请求分发到分片中.应用并不直接访问分片,mongos实例会缓存从配置服务器得到的路由信息,
当群集有元数据更改时,mongos会更新缓存,例如块拆分或添加分片。

3.mongod分片实例
分片是存储了一个集合部分数据的MongoDB实例,每个分片是单独的 mongod 或者是 replica set .
在生产环境中,所有的分片都应该是复制集。MongoDB以 每个集合 为单位使用分片,
你 必须 通过 mongos 访问开启了分片的集合,如果直接连接到某个分片,你只能看到集合的部分数据.
每个分片上的数据并没有特定的顺序.MongoDB并不保证两个连续的数据块会分布在同一个分片上.

为了获得更好的性能,最好在任何可能的时候都使用具有特定目标的操作.
虽然有些操作不得不使用广播发送的形式,(比如有的时候需要查询的数据分散在所有的分片上)
你也应该尽可能在进行操作时带有片键来尽可能使用具有特定目标的操作.

主分片

每个数据库都有一个”主分片” 用来存储这个数据库中所有未开启分片的集合的数据.改变集群中的主分片,会影响性能
image

mongodb的块拆分 和 均衡功能

  • mongodb跟踪集群数据的方式:会将文档分组为块,每个块由给定的片键范围的文档组成,同一片键值的文档必须在同一块中,mongos会记录每个块中插入多少数据,一旦到达阈值(这里有一个概念叫 拆分阈值),就会对块尝试拆分,需要注意的是经过拆分的块可能还在同一分片上

  • mongos进程需要保持尽量稳定,频繁的掉线上线,可能导致块拆分功能的失效,导致超大块的诞生;只要有配置服务器挂了任何一个,拆分请求都会失败,mongos到达阈值后,不停的发送块拆分请求,会导致拆分风暴!

  • mongos还会定期化身为均衡器,用于在不同分片之间移动块,力求使集群的负载更加均衡。前提是只有到达均衡阈值,才会真正数据迁移,数据的迁移是对客户端透明的

Hashed片键的分配策略

哈希片键的可以更均匀的分布数据,缺点就是对于范围查询性能比较差,HASH适合单调增减的field。比如说_id和时间戳

image

如果集合已包含数据,则必须在使用shardCollection()之前使用db.collection.createIndex()方法在分片键上创建散列索引。

如果集合为空,MongoDB将创建索引作为sh.shardCollection()的一部分。

以下操作使用散列分片策略对目标集合进行分片。

sh.shardCollection(“<database>。<collection>”,{<key>:"hashed" })

从头创建hash分片的步骤

range片键的分配策略

基于范围的分片涉及将数据划分为由分片键值确定的连续范围。 在此模型中,具有“close”分片键值的文档可能位于相同的块或分片中。

具体的范围片键命令,同时也是需要在指定键上有索引的!
sh.shardCollection( "database.collection", { <shard key> } )

从头创建range分片的步骤

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值