常见mongodb部署架构
1.为什么要是用分片集群 ?
数据容量日益增大,访问性能日渐降低,怎么破? 新品上线异常火爆,如何支撑更多的并发用户? 单库已有 10TB 数据,恢复需要1-2天,如何加速? 地理分布数据
2.分片如何解决
如何分片------->>>>
完整的分片集群
mongos:路由节点
1.提供集群单一入口
2.转发应用端请求
3.选择合适的数据节点进行读写
4.合并多个数据节点的返回
5.无状态的,至少两个做冗余
config server:配置节点
1.配置服务器存储集群的元数据和配置设置
2.从mongodb3.4开始,必须将配置服务器负数为副本集
3.提供集群元数据存储
4.分片数据分布的映射
mongod:数据节点
1.以复制集为单位,横向扩展
2.最大1024个分片
3.分片之间数据不重复
4.所有分片在一起才可以完整的工作
mongodb分片集群的特点:
1.应用全透明,无特殊处理
2.数据自动均衡
3.动态扩容,无需下线
4.提供三种分片方式
mongodb分片总结:
1.分片集群可以有效解决性能瓶颈及系统扩容问题
2.分片额外消耗较多,管理复杂,能不分片尽量不要分片
3.如果实在要用,请仔细学习下一讲
3.mongodb分片集群的分片方式
1.基于范围
选一个或者几个字段来进行分片
2.基于hash
可以随机分布到各个节点
3.基于zone/tag
自定义zone
4.分片集群中的概念
分片集群中的概念
4.如何设计一个分片集群
1.如何用好分片集群
2.分片的大小
分片的基本标准:
1.关于数据:数据量不超过3TB,尽可能保持在2TB一个片
2.关于索引:常用索引必须容纳进内存
按照以上标准初步确定分片后,还需要考虑业务压力,随着压力增大,CPU、RAM、磁盘中的任何一项出现瓶颈时,都可以通过添加更多分片来解决。
3.选择合适的片键
选择基数大的片键(就是分片键的复杂度要高)
对于小基数的片键: 因为备选值有限,那么块的总数量就有限; 随着数据增多,块的大小会越来越大; ? 水平扩展时移动块会非常困难; 例如:存储一个高中的师生数据,以年龄(假设年龄范围为15~65岁)作为片键,那么: 15<=年龄<=65,且只为整数 最多只会有51个 chunk 结论:取值基数要大!
选择分布均匀的片键
对于分布不均匀的片键: 造成某些块的数据量急剧增大 这些块压力随之增大 数据均衡以 chunk 为单位,所以系统无能为力
例如:存储一个学校的师生数据,以年龄(假设年龄范围为15~65岁)作为片键,那么: 15<=年龄<=65,且只为整数 大部分人的年龄范围为15~18岁(学生) ? 15、16、17、18四个 chunk 的数据量、访问压力远大于其他 chunk 结论:取值分布应尽可能均匀
选择定向性好的
假设
4个分片的集群,你希望读取某条特定的数据
如果你用片键作为查询条件,mongos可以直接定位到具体的分片
如果你不用管片键,mongos需要把查询分发到4个分片
等待最后一个分片想赢。mongos才能想赢客户端
结论:对主要查询要有定向能力
1.垂直分片和水平分片
1.垂直分片 提升集群节点性能,但是有瓶颈,尽量选择比较好的服务器! 2.水平分片 呈线性提升性能,带来维护成本 数据增长很快,但是查询并不需要查询所有的数据,坑热数据的区分!
在mongodb中绝大部分使用的是复制集,分片集群使用的也是比较少的
2.mongodb中的分片集群
分片的本质是数据块太大了。需要把数据块拆小一点。
pass