1、软件方面
- MongoDB版本选择
- 锁粒度
-
- Global(2.2-)
- DB锁(2.2+)
- Collection(2.4+)
- Document锁(2.6+)
- 读写锁、写优先锁
- 性能逐渐增强
- 启发
-
- 尽量选择新的稳定版本
-
- 性能提升
- 稳定
- bugs fixed
- 索引创建
-
- 设计不合理
- 长索引
-
- 字符串等
- id
-
- objectid
- 12字节
- 应用程序替换
- 月业务需要
- uid
- 灵活控制
- 索引设计过多
- 索引使用不合理
- 启发
-
- 使用短索引
-
- 小索引字段
- 业务
- 合理设计
- 数据量增大
-
- 热点数据超过内存
- 频繁swap
- 导致性能地下
-
- 内存规划
-
- 内存大于热门数据加上索引
- 启发
-
- 加大内存容量
- 数据空洞
-
- 大量删除数据
- 造成大量数据碎片和空间
- 内存中包含空洞数据
- 利用率低
- 数据收缩
-
- Online compact
- offline收缩
- 数据库无空洞、无碎片、进奏、性能较高
2、硬件方面
- 物理内存小
- 硬盘性能检查
-
- 无法满足目前的读写并发
- 优化方案
-
- 加大内存容量
- 硬件类型
-
- SSD》SDS》SATA
3、如何尽快发现MongoDB集群性能问题
- 监控的方式
-
- 机器资源监控
-
- CPU资源
-
- 核心数
- top
- 内存资源
-
- 内存使用和剩余情况
- free -g
- 磁盘资源
-
- 磁盘空间
- df -h
- 性能
- iostat -xdk 1
- 网络资源
-
- ifstat 1
- 负载均衡
-
- load average
- <=总核数
- 语义监控
-
- 进程管理
- 是否正常工作
- 模拟发送请求
- 预期结果对比
- 如果持续返回错误表示性能有问题
- 错误日志监控
-
- 进程管理
- 服务是否正常
- 阈值设置1分钟
- 基于日志的准实时统计
- 如果超过阈值性能,数据集群可能出现问题
- monostat
-
- 读写情况、加锁、索引命中、缺页终端、读写
- 监控分析
-
- locked、faults、miss、qr|qw
- 内存、内冷数据、索引设置不合理、qr|qw堆积
- mongotop
-
- 追踪mongodb读写所用时间
- 表级性能问题
-
- 表级读写时间
- 如何收缩数据提升性能
-
- Online Compress
- Offline 收缩数据
- 如何Scale Up方式提升性能
-
- 概念
-
- Scale Vertically
- 纵向扩展
- 软件方面
-
- 锁粒度问题
- 索引优化
-
- 更紧凑索引
- 业务层优化
-
- SQL语义优化
- 批量读写优化
- 连接池优化
- 如何Scale out方式提升性能
-
- 概念
-
- Scale horizontally
- 横向扩展,向外扩展
- 数据迁移
-
- 增加一个新增副本集合
- 更通用数据迁移方案
-
- 时效性
-
- 过去作废
- 迁移简单
- 业务开始写入,到时终止
- 永久数据
-
- 消息队列(写入命令进行回放)
- 中间存储快照
- 集群优化集合
-
- 尽早发现
-
- 机器监控报警
- 语义控制报警
- 错误日志报警
- mongostat
- mongotop
- scale out
- scale up