Python 的集合:专业数据类型的自定义(python是什么意思)
579
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(
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(
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(
在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小时内删除侵权内容。