【ArchSummit架构师峰会】精华内容上线75%,AI大模型中台从理念到实践的探索!>>> 了解详情
写点什么

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:574996
用户头像

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

关注

评论

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

一文学完Linux Shell编程,比书都好懂

编程攻略

Linux

车联网的发展面临的难点怎样突破

Geek_99967b

小程序 车联网

智能手表的机遇与挑战并存

Geek_99967b

数据安全 物联网, 智能手表

JDK 15 以上版本的字符串块

HoneyMoose

Docker下RabbitMQ四部曲之二:细说RabbitMQ镜像制作

程序员欣宸

Java RabbitMQ 5月月更

打造TOB企业流量场,钉钉将推出“视频号”,提升CDN性能是关键

郑州埃文科技

钉钉 CDN加速 IP地址 IP定位 网络优化

HTML语法基本规范

恒山其若陋兮

5月月更

SAAS服务的特点

Geek_99967b

小程序 SaaS

怎样为自己的小程序打包为App

Geek_99967b

小程序 小程序转app

跨平台应用开发进阶(十六) :uni-app实现H5页面唤醒APP

No Silver Bullet

uni-app App 5月月更 H5页面

实现内网穿透(二)

风斩断晚霞

Go websocket

Java Core「6」反射与SPI机制

Samson

学习笔记 5月月更 Java core

LabVIEW和Arduino的巧妙结合(基础篇—1)

不脱发的程序猿

单片机 LabVIEW Arduino 上位机

都是限制,都是秘密,JS逆向某建筑市场数据,python爬虫120例

梦想橡皮擦

5月月更

微信朋友圈的高可用复杂度

joak

如何使用 Restful ABAP Programming 编程模型开发一个支持增删改查的 Fiori 应用

Jerry Wang

RESTful SAP abap Fiori 5月月更

java培训如何减少 try-catch,这样做才优雅

@零度

JAVA开发

PHP实现令牌桶限流Redis list列表 Lpush rpop 实现令牌桶 - 限流 PHP实例

Owen Zhang

php

Linux环境混合使用静态库与动态库

Loken

音视频 5月月更

英特尔投资47亿构建巨型实验室所谓何?数据中心已然进入“液冷时代”

蓝海大脑GPU

LabVIEW控制Arduino LED灯闪烁(基础篇—2)

不脱发的程序猿

单片机 LabVIEW Arduino LED灯闪烁 LIAT

Java 8 中的设计模式策略

HoneyMoose

【直播回顾】OpenHarmony知识赋能五期第六课——子系统相机解读

OpenHarmony开发者

OpenHarmony

《0次与10000次》:让坏事发生0次,让好事发生10000次

郭明

【网易云信】沉浸式体验网易云信在线 KTV

网易智企

音视频

将微信小程序生成商用App很简单吗?

Geek_99967b

ide 小程序转app 小程序预览

AIRIOT物联网低代码平台如何配置Modbus TCP协议?

AIRIOT

低代码平台 驱动配置

沉浸式体验网易云信在线 KTV

网易云信

音视频技术

大规模C++编译性能优化系统OMAX介绍

百度Geek说

后端

一种直流电池/电源正反接均可供电的电路方案

不脱发的程序猿

电路设计 电源电路 嵌入式硬件 直流电池/电源正反接电路

私有化IM内置专属文档中心,助力企业协作闭环

WorkPlus

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