MongoDB分片设计
#### 如何做好分片集群
* 合理的架构
* 是否需要分片?
* 要分多少片?
* 数据分布规则?
* 正确的姿势
* 选择需要分片的表
* 选择正确的片键
* 使用合适的均衡策略
* 足够的资源
* CPU
* RAM
* 存储
1. 合理的架构-分片大小
* 分片的基本标准:
* 分片的基本标准:
* 关于数据:数据量不超过3TB,尽可能保持在2TB一个片;
* 关于索引:常用索引必须容纳进内存;
- 按照以上初步确定分片后,还要考虑业务压力,随着压力增大,CPU、RAM、磁盘中的任何一项出现瓶颈时,都可以通过添加更多分片来解决。
2. 合理的架构-需要多少个分片
[!qr](./images/0203_t_1.png)
3. 合理的架构-其他需求
*考虑分片的分布:
* 是否需要跨机房分布分片?
* 是否需要容灾?
* 高可用的要求如何?
#### 正取的姿势
各种概念由小到大:
* 片键shard key:文档中的一个字段
* 文档doc:包含shard key的一行数据
* 块Chunk:包含n个文档;
* 分片Shard:包含n个chunk
* 集群Cluster:包含n个分片
[!qr](./images/0203_t_2.png)
5. 正确的姿势-选择合适片键
影响片键效率的主要因素:
* 取值基数(Cardinality)
* 取值分布
* 分散写,集中读
* 被尽可能多的业务场景用到
* 避免单调递增或递减片键
6. 正确的姿势-选择基数大的片键
对于小基数的片键:
* 因为备选值有限,那么块的总数量就有限;
* 随着数据增多,块的大小会越来越大;
* 太大的块,会导致水平扩展时移动块会非常困难。
- 例如:存储一个高中的师生数据,以年龄(假设年龄范围为15~65岁)作为片键,那么:
* 15 <= 年龄 <= 65,且只为整数
* 最多只会有51个chunk
- 结论:取值基数要大!
7. 正确的姿势-选择分布均匀的片键
对于分布不均匀的片键:
* 造成某些块的数据量急剧增大
* 这些块压力随之增大
* 数据均衡以chunk为单位,所以系统无能为力
- 例如:存储一个高中的师生数据,以年龄(假设年龄范围为15~65岁)作为片键,那么:
* 15 <= 年龄 <= 65,且只为整数
* 大部分人的年龄范围为15~18岁(学生)
* 15、16、17、18四个chunk的数据量、访问压力远大于其他chunk
- 结论:取值分布尽可能均匀
8. 正确的姿势-定向性好
考虑:
* 4个分片的集群,你希望读某条特定的数据
* 如果你用片键作为条件查询,mongos可以直接定位到具体的分片
* 如果你不用片键,mongos需要把查询发到4个分片
* 等到最后的一个分片响应,mongos才能响应应用端。
- 结论:对主要查询要具有定向能力
- 一个Email系统的片键例子
```
{
_id: ObjectId(),
user: 123,
time: Date(),
subject: "...",
recipients: [],
body: "...",
attachments: []
}
```
[!qr](./images/0203_t_3.png)
[!qr](./images/0203_t_4.png)
[!qr](./images/0203_t_5.png)
[!qr](./images/0203_t_6.png)
9. 足够的资源
mongos 与 config 通常消耗很少的资源,可以选择低规格的虚拟机;
资源的重点在于shard服务器:
* 需要足以容纳热数据索引的内存;
* 正确创建索引后CPU通常不会成为瓶颈,除非涉及非常多的计算;
* 磁盘精良选用SSD。
最后,实际测试是最好的检验,来看你得资源配置是否完备。
即使项目初期已经具备了足够的资源,任然需要考虑在合适的时候扩展。
建议监控各项资源使用情况,无论哪一项达到60%以上,则开始考虑扩展,因为:
* 扩展需要新的资源,申请新资源需要时间;
* 扩展后数据需要均衡,均衡需要时间。应保证新数据入库速度鳗鱼均衡速度
* 均衡需要资源,如果资源即将或已经耗尽,均衡也是很低效的。
MongoDB分片设计的更多相关文章
- MySQL Cluster 与 MongoDB 复制群集分片设计及原理
分布式数据库计算涉及到分布式事务.数据分布.数据收敛计算等等要求 分布式数据库能实现高安全.高性能.高可用等特征,当然也带来了高成本(固定成本及运营成本),我们通过MongoDB及MySQL Clus ...
- MongoDB 分片集群技术
在了解分片集群之前,务必要先了解复制集技术! 1.1 MongoDB复制集简介 一组Mongodb复制集,就是一组mongod进程,这些进程维护同一个数据集合.复制集提供了数据冗余和高等级的可靠性,这 ...
- MongoDB分片(Sharding)技术
分片(sharding)是MongoDB用来将大型集合分割到不同服务器(或者说一个集群)上所采用的方法.尽管分片起源于关系型数据库分区,但MongoDB分片完全又是另一回事. 和MySQL分区方案相比 ...
- 网易云MongoDB分片集群(Sharding)服务已上线
此文已由作者温正湖授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. MongoDB sharding cluster(分片集群)是MongoDB提供的数据在线水平扩展方案,包括 ...
- (转)MongoDB 分片集群技术
1.1 MongoDB复制集简介 一组Mongodb复制集,就是一组mongod进程,这些进程维护同一个数据集合.复制集提供了数据冗余和高等级的可靠性,这是生产部署的基础. 1.1.1 复制集的目的 ...
- MongoDB 分片管理(不定时更新)
背景: 通过上一篇的 MongoDB 分片的原理.搭建.应用 大致了解了MongoDB分片的安装和一些基本的使用情况,现在来说明下如何管理和优化MongoDB分片的使用. 知识点: 1) 分片的配置和 ...
- MongoDB 分片的原理、搭建、应用
一.概念: 分片(sharding)是指将数据库拆分,将其分散在不同的机器上的过程.将数据分散到不同的机器上,不需要功能强大的服务器就可以存储更多的数据和处理更大的负载.基本思想就是将集合切成小块,这 ...
- MongoDB分片简单实例
分片 在Mongodb里面存在另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求. 当MongoDB存储海量的数据时,一台机器可能不足以存储数据也足以提供可接受的读写吞吐量.这时,我 ...
- (转)MongoDB分片实战 集群搭建
环境准备 Linux环境 主机 OS 备注 192.168.32.13 CentOS6.3 64位 普通PC 192.168.71.43 CentOS6.2 64位 服务器,NUMA CPU架构 Mo ...
随机推荐
- Java实现邮件收发
一. 准备工作 1. 传输协议 SMTP协议-->发送邮件: 我们通常把处理用户smtp请求(邮件发送请求)的服务器称之为SMTP服务器(邮件发送服务器) POP3协议-->接收邮件: 我 ...
- @ResponseBody和@RequestBody
@ResponseBody @ResponseBody的作用其实是将java对象转为json格式的数据. @responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转 ...
- 分布式可扩展web体系结构设计实例分析
Web分布式系统设计准则 下面以一个上传和查询图片的例子来说明分布式web结构的设计考虑和常用的提高性能的方法.该例子提供上传图片和下载图片两个简单功能,并且有一下假设条件?: - 可以存储无上限数量 ...
- Linux编译安装、压缩打包、定时任务管理
编译安装 压缩打包 定时任务管理 一.编译安装 使用源代码,编译打包软件 1.特点 1.可以定制软件 2.按需构建软件 2.编译安装 1.下载源代码包 wget https://nginx.org/d ...
- 第四届“传智杯”全国大学生IT技能大赛题解
目录 A B C D E F G 今年题目难度普遍偏低.只有 D,F 还好. A 按题目给的公式计算即可.注意应在最后的答案中去掉小数部分. B 按照题意模拟即可.注意答案要与 \(0\) 取 \(\ ...
- TensorFlow.NET机器学习入门【2】线性回归
回归分析用于分析输入变量和输出变量之间的一种关系,其中线性回归是最简单的一种. 设: Y=wX+b,现已知一组X(输入)和Y(输出)的值,要求出w和b的值. 举个例子:快年底了,销售部门要发年终奖了, ...
- RIP2与OSPFv2 动态路由协议区别
OSPF五种报文解析 Hello:招呼信息 Route-ID:换回口地址/活动的物理接口最大值 Hello作用: 1. 发现邻居 2. 对一些数据的协商 3. 保持邻居的Keeplive状态.选举DR ...
- SpringBoot简单整合分布式任务调度平台(XXL-JOB)
官方文档:https://www.xuxueli.com/xxl-job/#%E3%80%8A%E5%88%86%E5%B8%83%E5%BC%8F%E4%BB%BB%E5%8A%A1%E8%B0%8 ...
- 平衡二叉树(c++实现)续
!!版权声明:本文为博主原创文章,版权归原文作者和博客园共有,谢绝任何形式的 转载!! 作者:mohist --- 欢迎指正--- 题外话:上一篇关于平衡二叉树文章中,我都没说自己是怎么理解的.别人终 ...
- 【LeetCode】829. Consecutive Numbers Sum 解题报告(C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 数学方法 日期 题目地址:https://leetc ...