259_Mongodb_集合_分片集合1

网友投稿 597 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分片

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 越大

259_Mongodb_集合_分片集合1

越差

越大

次数越小

越大

越少

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简介与组成
下一篇:【微信开发】上传用户语音 并转码 分享
相关文章