#### 如何做好分片集群
* 合理的架构
* 是否需要分片?
* 要分多少片?
* 数据分布规则?
* 正确的姿势
* 选择需要分片的表
* 选择正确的片键
* 使用合适的均衡策略
* 足够的资源
* 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分片设计的更多相关文章

  1. MySQL Cluster 与 MongoDB 复制群集分片设计及原理

    分布式数据库计算涉及到分布式事务.数据分布.数据收敛计算等等要求 分布式数据库能实现高安全.高性能.高可用等特征,当然也带来了高成本(固定成本及运营成本),我们通过MongoDB及MySQL Clus ...

  2. MongoDB 分片集群技术

    在了解分片集群之前,务必要先了解复制集技术! 1.1 MongoDB复制集简介 一组Mongodb复制集,就是一组mongod进程,这些进程维护同一个数据集合.复制集提供了数据冗余和高等级的可靠性,这 ...

  3. MongoDB分片(Sharding)技术

    分片(sharding)是MongoDB用来将大型集合分割到不同服务器(或者说一个集群)上所采用的方法.尽管分片起源于关系型数据库分区,但MongoDB分片完全又是另一回事. 和MySQL分区方案相比 ...

  4. 网易云MongoDB分片集群(Sharding)服务已上线

    此文已由作者温正湖授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. MongoDB sharding cluster(分片集群)是MongoDB提供的数据在线水平扩展方案,包括 ...

  5. (转)MongoDB 分片集群技术

    1.1 MongoDB复制集简介 一组Mongodb复制集,就是一组mongod进程,这些进程维护同一个数据集合.复制集提供了数据冗余和高等级的可靠性,这是生产部署的基础. 1.1.1 复制集的目的 ...

  6. MongoDB 分片管理(不定时更新)

    背景: 通过上一篇的 MongoDB 分片的原理.搭建.应用 大致了解了MongoDB分片的安装和一些基本的使用情况,现在来说明下如何管理和优化MongoDB分片的使用. 知识点: 1) 分片的配置和 ...

  7. MongoDB 分片的原理、搭建、应用

    一.概念: 分片(sharding)是指将数据库拆分,将其分散在不同的机器上的过程.将数据分散到不同的机器上,不需要功能强大的服务器就可以存储更多的数据和处理更大的负载.基本思想就是将集合切成小块,这 ...

  8. MongoDB分片简单实例

    分片 在Mongodb里面存在另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求. 当MongoDB存储海量的数据时,一台机器可能不足以存储数据也足以提供可接受的读写吞吐量.这时,我 ...

  9. (转)MongoDB分片实战 集群搭建

    环境准备 Linux环境 主机 OS 备注 192.168.32.13 CentOS6.3 64位 普通PC 192.168.71.43 CentOS6.2 64位 服务器,NUMA CPU架构 Mo ...

随机推荐

  1. 在Eclipse中运行OSGI工程出错的解决方案

    今天学习OSGI的过程中按照书上所述搭建好第一个helloworld插件工程,运行的过程中出现下面所示的错误: !SESSION 2014-06-09 21:04:49.038 ----------- ...

  2. C语言编辑链接

    库函数(Library Files)库函数就是函数的仓库,它们都经过编译,重用性不错.通常,库函数相互合作,来完成特定的任务.比如操控屏幕的库函数(cursers和ncursers库函数),数据库读取 ...

  3. 注册页面的servlet

    package cn.itcast.travel.web.servlet;import cn.itcast.travel.domain.ResultInfo;import cn.itcast.trav ...

  4. Socket通信和多线程的总结

    1.ServerSocket进行多线程接收 package com.yh.chat; import java.io.IOException; import java.net.ServerSocket; ...

  5. 持续部署CI/CD

    一.简介 在敏捷开发时,通常将服务进行拆分成不同模块,每个开发小组负责一个模块的开发,会在一天内对这个模块进行频繁的提交到仓库主干并部署到线上.CI/CD就是在开发中使用工具保证快速并稳定上线的方法, ...

  6. 一个使用 asyncio 开发的网络爬虫(译文)

    原文地址:https://www.aosabook.org/en/500L/a-web-crawler-with-asyncio-coroutines.html 作者简介 A. Jesse Jiryu ...

  7. ciscn_2019_n_8 1

    拿到题目老样子先判断是多少位的程序 可以看到是32位的程序,然后再查看开启的保护 然后将程序放入ida进行汇编 先shift+f12查看程序是否有system和binsh 可以看到有system和bi ...

  8. oracle11gR2、client及plsql完整安装与配置

    本文主要介绍Oracle11g,client及PLSQL的安装过程 一,oracle安装 安装环境:虚拟机win7 64 1.点击目录中 setup.exe文件 2.配置安全更新中,取消通过my or ...

  9. Docker 快速删除无用(none)镜像

    Dockerfile 代码更新频繁,自然docker build构建同名镜像也频繁的很,产生了众多名为none的无用镜像. 分别执行以下三行可清除 docker ps -a | grep " ...

  10. LuoguP7019 [NWRRC2017]Auxiliary Project 题解

    Update \(\texttt{2021.6.24}\) 修改了一处格式上的错误和一处笔误. Content 已知用 LED 灯来显示 \(0\sim9\) 这十个数字分别需要 \(6,2,5,5, ...