PCon全球产品创新大会最新日程上线,这里直达 了解详情
写点什么

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:574489
用户头像
郭蕾 关注我视频号:极客时间小盖

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

关注

评论

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

USDT跑分承兑系统开发,区块链支付平台搭建

13823153121

LeetCode题解:206. 反转链表,双指针,JavaScript,详细注释

Lee Chen

大前端 LeetCode

读书笔记之《普罗普:故事形态学》

AI代笔

两年Java工作经验涨到23K,这究竟是怎么做到的?

Java架构师迁哥

不懂 ZooKeeper?没关系,这一篇给你讲的明明白白

海星

区块链技术最重要价值所在

CECBC

区块链 数字经济 互联网革命

SpringBoot写后端接口,看这一篇就够了!

华为云开发者社区

后端 swagger pringboot

Mysql学习笔记:分库分表(sharding)

马迪奥

MySQL Sharding

在Ubuntu 20.04 搭建 Django 开发环境 以及 快速构建一个简单的 Blog

Matrix Chan

Python django 后端 Ubuntu20.04

云图说 | 华为云GPU共享型AI容器,让你用得起,用得好,用的放心

华为云开发者社区

gpu caffe

我写了一个TypeScript虚拟机。

渔子长

Java typescript 大前端 deno Node

知识点总结

Acker飏

开源决策树工具xDecision简介

赫杰辉

决策树 可视化 简化代码

滴滴基于 Flink 的实时数仓建设实践

Apache Flink

flink

金融企业敏捷转型大咖风采 | 中国出口信用保险公司的 DevOps 落地之道

Atlassian

项目管理 DevOps 敏捷 行业资讯 Atlassian

Mysql学习笔记:InnoDB索引结构浅析

马迪奥

MySQL 索引结构 innodb

端-边-云全面协同创新 英特尔携手百度共推产业智能化升级

新闻科技资讯

彻底理解JavaScript执行上下文

Walker

Java 大前端 this指针 函数执行

服务质量分析:腾讯会议&腾讯云Elasticsearch玩出了怎样的新操作?

腾讯云大数据

大数据

区块链技术与我们的生活将并存

CECBC

区块链 数字经济

如何正确设置Java.home

谷鱼

区块链合约层是一种自动执行的数字协议

CECBC

区块链 智能合约

@所有人 Flink Forward Asia 2020 向您发出议题征集邀请!

Apache Flink

flink

用Go-Guardian写一个Golang的可扩展的身份认证

朱亚光

微服务 身份认证 Go 语言

哈哈,成为作者了

大海

区块链交易系统开发,期货合约平台搭建

13823153121

如何让知识图谱告诉你“故障根因”

华为云开发者社区

华为云 知识图谱 图谱

Clickhouse在大数据分析平台-留存分析上的应用

腾讯云大数据

大数据

我敢说,这个版本的斗地主你肯定没玩过?

华为云开发者社区

命令行 游戏 斗地主

Netty之旅三:Netty服务端启动源码分析,一梭子带走!

一枝花算不算浪漫

Netty

介绍

剑心

学习

ShadowRealm 与微前端沙箱

ShadowRealm 与微前端沙箱

Bugsnag的MongoDB分片集群使用经验-InfoQ