东亚银行、岚图汽车带你解锁 AIGC 时代的数字化人才培养各赛道新模式! 了解详情
写点什么

Bugsnag 的 MongoDB 分片集群使用经验

  • 2014-10-09
  • 本文字数:1271 字

    阅读完需:约 4 分钟

Bugsnag 是一家为移动应用开发者提供实时的 Bug 追踪及检测服务的创业公司,Bugsnag 已经使用 MongoDB 存储超过 TB 级的文档数据。从 Bugsnag 的第一个版本开始他们就使用 MongoDB 存储业务数据。近日,Bugsnag 的工程师 Simon Maynard 在博客上分享了他们的MongoDB 分片集群经验,并开源了几个他们常使用的脚本

带标签的分片(Tag Aware Sharding)

带标签的分片是MongoDB 2.2 版本中引入的新特性,此特性支持人为控制数据的分片方式,从而使数据存储到合适的分片节点上。具体的做法是通过对分片节点打tag 标识,再将sharding key 按范围对应到这些标识上。在Bugsnag 中,每个页面的加载都会涉及到用户集合,比如查询用户是否登录,当应用向主分片上写入大量数据时,所有的用户请求都可能因此变得很慢。为了解决这个问题,Bugsnag 对大的分片中的所有分片集合添加了一个标签,这样用户集合就可以存储到一台小型机器上,接下来就可以在内存中直接存取用户数据。关于带标签的分片特性具体如何使用读者也可以参考 Asya 的这篇博客

空的数据块

在删除旧的数据时,分片中会出现空的数据块,这样会导致分片不平衡。平衡分片的算法仅仅只是调整分片中数据块的数量,忽略了数据块的大小。在 MongoDB 2.6 中,新增了一个 mergeChunks 命令用来将空的数据块合并到连续范围的数据块上,但是这个命令并不可以自动执行,所以 Bugsnag 编写了一个脚本,以依次检查数据块,并自动合并空的数据块。

大的数据块

大的数据块是指数据块的大小超过配置大小,Bugsnag 编写了一个脚本用来发现并调整大数据块的大小。由于需要连接mongod 和mongo 实例,所以使用了MongoDB 的Ruby 接口Mongoid。脚本会将大的数据块分割,以保证集群中数据集合分布均衡。

孤立文档(Orphaned documents)

在正常情况下,系统中不会有孤立文档。不过,块迁移过程中的一些失败情况可能会留下孤立文档。孤立文档可以被安全删除,MongoDB 2.6 中可以使用 cleanupOrphaned 命令从分片中删除孤立文档。关于孤立文档的更多内容读者可以参考 MongoDB 工程师的这篇博文

MoveChunk 目录

MoveChunk 目录中的文件是进行分片均衡操作时产生的临时文件,操作完成后,这些文件就可以被删除。Bugsnag 使用定时任务来定期清空该目录,MongoDB 也支持关闭此功能,读者可以自行测试。

监控分片环境

  1. Shell 命令
  • db.collection.getShardDistribution() :查看分片集群中集合是如何分布的。可以通过此命令确定分片上的某个集合相比于其它分片是何时开始突然变大的。
  • db.stats() :打印每个分片下的数据库状态,可以通过此命令跟踪数据大小。可以传入 1024*1024*1024 参数来以 GB 为单位显示数据大小。
  • sh.status() :显示整个集群中数据块的分布情况,可以用来检查数据是否分布均衡。
  1. Mongostat
    Mongostat 是 MongoDB 自带的状态检测工具,当 MongoDB 集群出现问题时,可以运行 mongostat –discover 来检查集群中各个 mongos 机器的性能指标。

作者最后总结到运行一个 MongoDB 分片集群并不难,但是在运行过程中也不时地会有一些小的问题出现。在 Bugsnag 的博客中有很多 MongoDB 的博文,读者可以自行学习。

2014-10-09 04:575018
用户头像

发布了 219 篇内容, 共 134.8 次阅读, 收获喜欢 190 次。

关注

评论

发布
暂无评论
发现更多内容

一个可以早点下班的开发技巧

引迈信息

前端 敏捷开发 低代码 JNPF

九科祝福丨人生不设限,愿你自由绽放

九科Ninetech

如何使用openEuler用户软件仓(EUR)

openEuler

Linux 操作系统 openEuler rpm 软件包

Kubernetes 部署主从结构的 MySQL 服务

CTO技术共享

Dubbo 在 Proxyless Mesh 模式下的探索与改进

阿里巴巴中间件

阿里云 云原生 dubbo

三天吃透Kafka面试八股文

程序员大彬

Java Kafka Producer

分享5个我不能没有的Vue.js库

引迈信息

前端 低代码 开发工具 Vue 3

再见ChatGPT!又一值得国内程序员注册体验的AI生产力工具问世!

程序员小毕

AI 工具 后端 架构师 java程序员

【经验分享】电路板上电就挂?新手工程师该怎么检查PCB?

华秋PCB

工程师 电路 PCB PCB设计

SpringApplication启动类的Args详解

石臻臻的杂货铺

spring springboot

Redis缓存知识大集合

阿呆

redis 缓存 缓存击穿 缓存雪崩

直播报名 | 金融机构如何通过标签画像实现精细化客户运营?

索信达控股

华为云开年采购季火热进行中,四大福利玩法大放送

Geek_2d6073

ERP和MES如何做到优势互补,它们的区别在哪?

工赋开发者社区

字典数据结构 FST(Finite State Transducer)

alexgaoyh

Java Trie FST dat 字典数据结构

Centos7下安装Dogtail GUI自动化测试工具并打开sniff工具过程中遇到的问题解决方法

Python centos 自动化测试 sniff dogtail

CorelDRAW矢量图形设计软件2023最新版本功能介绍

茶色酒

CorelDraw2023

MySQL 底层之 MVCC、回滚段、一致性读、锁定读

程序知音

20个叹为观止的JavaScript一行代码

我爱娃哈哈😍

JavaScript 前端 程序員

关于DAPP系统开发操作及功能丨智能合约项目系统开发方案

I8O28578624

99%都不知道的ins保存小技巧,快收藏起来!

frank

ins

构建一个可复用的自定义BaseAdapter

攻城狮Wayne

Adapter viewholder item

Redis实现分布式锁的几种方案

GreatSQL

greatsql greatsql社区

工赋开发者社区 | 关于ChatGPT八个技术问题的猜想

工赋开发者社区

C++ sort和for_each算法的普通、文艺和2B用法

老王同学

c++ 排序

EasyRecovery16数据恢复软件有哪些新功能?

茶色酒

EasyRecovery Photo16

如何降低 Flink 开发和运维成本?阿里云实时计算平台建设实践

Apache Flink

大数据 flink 实时计算

Python从零到壹丨详解图像平滑的两种非线性滤波方法

华为云开发者联盟

Python 人工智能 华为云 华为云开发者联盟 企业号 3 月 PK 榜

软件测试/测试开发 | Spring Boot 异常处理

测试人

软件测试 springboot 自动化测试 测试发开

那些年,我们写过的无效单元测试

阿里巴巴中间件

阿里云 编程 云原生

我在京东做研发丨【混合多云第一课】为何多云多活被称为“技术皇冠上的明珠”?

京东科技开发者

京东云 研发 混合多云

Bugsnag的MongoDB分片集群使用经验_DevOps & 平台工程_小盖_InfoQ精选文章