259_Mongodb_集合_分片集合1

网友投稿 569 2022-05-30

MongoDB 分片

Mongodb分片集群,可以满足MongoDB数据量大量增长的需求,通过在多台机器上分割数据,使得数据库系统能存储和处理更多的数据

1 分片集角色

Mongos (Query Routers)

前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用

本身不存储数据和索引信息, 数据的查询目录和索引信息被保存config server上,可以考虑将mongos与应用服务器部署在同一台服务器上当应用下架,mongos也随之消失

当集群已经分片的情况下, 应用经过mongos即可对分片数据进行查询和写入操作。Mongos根据预先定义好的片键字段 从元数据中找出对应位置进行写入,查询时如果查询条件不包括分片键字段,则mongos必须在所有分片中查找,效率降低

Config server

保存元数据(ClusterMetadata,其中包括 chunk信息),每个分片上的数据块列表及每个数据块的数据范围, 同时也保存了身份验证相关信息(角色访问控制)

Config server要求副本集形态出现,保证其高可用

3.4版本官方不推荐SCCC(sync cluster connection configuration)结构 必须使用CSRS(config server replica set)

Shard 服务

用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组个一个replica set承担,防止主机单点故障,最大1024分片

259_Mongodb_集合_分片集合1

2 分片集群数据分布方式

分片集群数据分布方式 – 基于范围

分片集群数据分布方式 – 基于哈希 hash

分片集群数据分布方式 – 自定义Zone/tag

3 分片键(shard key)

配置规则让MongoDB知道数据分配规则, 数据以数据块(chunk)的形式分布存储在各分片上。该规则就是分片键(shard key)

分片键颗粒度适中(数据分配条件) 保证数据块拆分,搬迁的效果,如果没有合适分片键,可以考虑增加一个与业务无关字段

3.1 Chunk

是分片中数据拆分出的一个区间, 存储集合中一部分数据,随着数据的增大,chunk会分裂和迁移,默认64M

3.2 分片键的配置

1 启动分片

Sh.enableSharding()

2 设置分片键

sh.shardCollection(,,,) namespace: 要进行分片的集合,指定对应database.collection key: 分片依据的片键, 指定分片键的字段及排序,1表正向,-1反向,hashed散列分片键 unique: true表示唯一约束,hash分片不支持唯一约束 默认为false options: 可选参数 numInitialChunks 和 collation, numInitialChunks 整数,初始化chunk数量(小于8192chunk) collation, 指定字符串的排序规则。默认规则{locale: "simple"} 表字符串按二进制排序 sh.shardCollection("alex_db.tableName", {shardkey : 1}, false, {numInitialChunks:5, collation:{locale:"simple"}})

3 控制数据分发:多地域Zone分片 (tag)

应用程序可以指定数据存放在某个分片/机房服务器上,依赖分片的标签(tag),应用场景:

冷热数据分离

Zone 就近读写

config = {_id: 'SZ_sh', members: [ {_id: 0, host:'10.0.0.51:20001'}, {_id: 1, host:'10.0.0.51:20002'}, {_id: 2, host:'10.0.0.52:20003'}] } config = {_id: 'SH_sh', members: [ {_id: 0, host:'10.0.0.51:20001'}, {_id: 1, host:'10.0.0.51:20002'}, {_id: 2, host:'10.0.0.52:20003'}] } db.runCommand( { addshard :"SZ_sh/10.0.0.51:20001,10.0.0.51:20002,10.0.0.52:20003",name:"SZ_sh"} ) db.runCommand( { addshard :"SH_sh/10.0.0.52:20001,10.0.0.52:20002,10.0.0.51:20003",name:"SH_sh"} ) Sh.enableSharding("zone_db") sh.shardCollection("zone_db.Members",{"city":1, "zipCode":1}) db.runCommand( { enablesharding : "zonedb" } ) sh.shardCollection("zonedb.vast", {order_id: 1});

1 分片标签的设置 语法 sh.addShardTag(,) 例 sh.addShardTag("SZ_sh","Tag_SZ") sh.addShardTag("SH_sh","Tag_SH") 2 指定数据自动分配到特定分片中 sh.addShareRange(,,,) # minnum maxmum 保存数据时分片键的最小值&最大值 例 sh.addShareRange("zone_db.Members", {city: "SZ", zipCode: "51800"},{city: "SZ", zipCode: "51899"},"Tag_SZ") sh.addShardTag("CN_sh", "shard00") sh.addShardTag("US_sh", "shard01") sh.addTagRange("zonedb.vast",{ "order_id" : MinKey },{ "order_id" : 500 },"shard00" ) sh.addTagRange("zonedb.vast",{"order_id" : 501 },{"order_id" : MaxKey},"shard01" ) use zonedb for(i=1;i<1000; i++){ db.vast.insert({"order_id":i,"name":"shenzheng","age":70,"date":new Date()}); } db.vast.getShardDistribution()

4 平衡器 Balancer

分片键是数据分片的依据, 且数据拆分是以数据块(chunk)为基本单位, 平衡器是确保每个分片保存的数据量(数据块) 保持相对平衡的状态

平衡器是以 数据块为单位进行搬迁, 一个chunk包括0/多个文档,一个分片包括0/多个 chunk

5 数据块chunk

chunk 默认64M, 合理配置chunk大小

chunk过小 会导致频繁拆分和搬迁,影响集群性能

chunk过大 会导致数据不易拆分,挤压在某个分片上出现负载过高

均匀程度

网络传输影响

迁移程度

每次网络传输量

Chunk数量

Chunk size 越大

越差

越大

次数越小

越大

越少

Chunk size 越小

越好

越小

次数越频繁

越小

越多

Chunk 分裂条件

当数据块大小达到设定值

当chunk中的文档数量超过最大值

命令查看状态和操作平衡器

mongos> sh.getBalancerState() true mongos> sh.stopBalancer() mongos> sh.startBalancer()

手动搬迁命令

sh.moveChunk(,,) sh.moveChunk("Carts.members",{city:"SZ",zipCode:"518999"},"ShardSZ") # query条件必须是分片键

在config数据库中, 可以运行指令来看lock集合中记录的平衡器状态(lock是系统集合,不允许手动操作) db.locks.find({"_id": "balancer"}) { "_id" : "balancer", "state": 2, # 2表示平衡器正在运行, 0表示 平衡器被关闭 "ts": ObjectId("52xxxxxxxx"), "who": "ConfigServer:Balancer", "process": "ConfigServer", "when": ISODate("XXXX-XX-XXTXXX") "Why" : "CSRS Balancer" }

平衡器的作用

MongoDB会周期性检查分片是否均匀分布, 考虑的是每个分片chunk的数量,并非文档的数据大小和数量, chunk数量不均匀 就会发生搬迁

搬迁期间,客户端访问仍是原分片的chunk,直到chunk搬迁完成更新元数据,mongos才会重新指向目的端分片

Chunk迁移阈值条件

Chunk数量

迁移阈值

备注

[1,20 )

2

集合分片的chunk在20个内时, 若分片间的chunk 数量差异超过2个,触发chunk搬迁

[20,80 )

4

差异超过4个

[80,max )

8

Chunk分裂根据chunk大小,chunk数量 进行拆分依据

Chunk数量

分裂阈值

1

1024M

[1,3)

0.5M

[3,10 )

16M

[10,20 )

32M

[20,max )

64M

MongoDB 数据库

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:浅谈JavaScript的bom简介与组成
下一篇:【微信开发】上传用户语音 并转码 分享
相关文章