259_Mongodb_集合_分片集合1
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 |
集合分片的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 |
- 点赞
- 收藏
- 关注作者
评论(0)