259_Mongodb_集合_分片集合1

举报
alexsully 发表于 2021/12/24 20:02:24 2021/12/24
【摘要】 MongoDB 分片Mongodb分片集群,可以满足MongoDB数据量大量增长的需求,通过在多台机器上分割数据,使得数据库系统能存储和处理更多的数据1 分片集角色Mongos (Query Routers)前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用本身不存储数据和索引信息, 数据的查询目录和索引信息被保存config server上,可以考虑将mongo...

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(<datbase>)

 

2 设置分片键

sh.shardCollection(<namespace>,<key>,<unique>,<options>)

  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(<Shard>,<tag>)

例
sh.addShardTag("SZ_sh","Tag_SZ")
sh.addShardTag("SH_sh","Tag_SH")

2 指定数据自动分配到特定分片中

sh.addShareRange(<namespace>,<minmum>,<maximum>,<tag>)  # 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(<namespace>,<query>,<destination>)
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

集合分片的chunk20个内时, 若分片间的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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。