资讯专栏INFORMATION COLUMN

故障中学习Mongodb write concern

IT那活儿 / 737人阅读
故障中学习Mongodb write concern

点击上方“IT那活儿”,关注后了解更多内容,不管IT什么活儿,干就完了!!!





故障现象



某客户一套Mongodb分片集群数据库在上线前,准备导入数据数据进行压力测试,但是根据业务方的要求,源端和目标端的库名发生了变化。
维护人员在使用mongorestore导入数据指定了错误的数据库名,当发现的时候导入了大概80%的数据,此时中断了数据导入,然后执行db.dropDatabase()删除数据库并重新导入,此时发现了如下问题:

1)dropDatabase操作被阻塞,操作界面一直无响应。10min后超时退出。


2)新开启的mongorestore会话没法导入数据。


以上现象可以看出数据库中,肯定存在阻塞会话,在mongos和数据分片的primary节点上检查,均没有发现阻塞进程,并且数据库日志也未发现异常。





故障排查



这时检查从节点日志,发现在其中一个分片(数据库主分片)的secondary节点上可看出数据库正在创建索引。


由上图可以看出,数据库正在执行background创建索引,但是background建索引的方式并不会阻塞会话,该方式之后在global/database/collection三个级别加意向锁,见下图:


加了意向锁,与要执行dropDatabase()的库是同一个库,而新导入数据的是另一个库,为什么也被阻塞了?

我们继续检查,发现如下会话存在问题:


该会话持有一个全局独占锁,从会话信息上可看出此会话是是一个系统会话,负责复制集的同步。

但是不管建索引还是上图会话中的全局独占锁,都是发生在secondary节点上,并且mongodb的复制是读取的primary节点的oplog,是异步的。

为什么会出现本文开始的阻塞呢 ??

此时我们查阅官方文档可发现如下:

1)mongorestore命令的writeconcern默认值是majority。



2)dropDatabase()命令的writeconcern默认值同样是majority。


在Mongodb复制集架构下,Writeconcern是Mongodb的写入安全机制,其决定了一个写操作落到多少个节点上才算成功,格式如下:

{ w: , j: , wtimeout: }

1)w选项表示要写入的mongodb实例的数量,其取值包含如下:

  • 0:发起写操作,不关心是否写入成功。

  • 1-集群最大数据节点数:写操作需要复制到指定节点数才算成功。取值1是mongodb的默认值。

  • majority:写操作需要被复制到大多数节点上才上成功。

  • tags:写操作需要被复制到指定标签的节点上才算成功,一般用于多数据中心指定节点标签的情况下。

2)j选项表示要写入journal中,才进行数据确认,wtimeout表示超时时间,单位为毫秒,表示写入要求的全部节点的超时时间,若不设置则应用会等待直到全部写入为止,若设置了时间,则超过时间未写入就会报错。


上图表示writeconcern配置为2时,当需要写入一主一从两个节点时,才会想客户端返回确认信息,在这种三节点的PSS架构中,配置w:majority也是相同的效果。如果配置w:1,则只需写入Primary节点后就像客户端返回确认信息。

writeconcen的配置可以在数据库端进行默认配置,也可以在驱动上进行配置(连接串上配置),也可以在代码上进行灵活配置,这个可以根据某个数据的重要程度来决定。

注意事项:

  • 针对PSS架构,设置majority是较优的选择,保证数据安全性的同时延迟时间较短,PSA架构则不使用majority,因为从库故障的时候会导致写入失败或者报错。

  • 不要设置writeconcern等于总结点数,因为一但有一个节点故障,就会导致写入报错或者失败,跟PSA架构设置majority情形相同。

  • witeconcern虽然会增加写操作延迟时间,但是并不会显著增加集群压力,因此无论是否等待,写操作最终都会复制到所有节点上。设置writeconcern只是让写操作等待复制后再返回。

  • 应对重要数据应用{w:majority},普通数据可以应用{w:1}以确保最佳性能。

通过writeconcern的学习,就可以对此次故障作出解释,原因是:

  • 发现导入数据写入的库错误后,终止了mongorestore进程,但是主分片的从节点依然在后台创建大表的索引,终止mongorestore并不能立即取消建索引操作。

  • mongodb的复制是串行的,由于创建索引操作长时间未完成,所以复制同步线程就在该从节点上加了全局锁,因为两个操作的writeconcern配置均为{w:majority}从而导致了dropDatabase和mongorestore操作被阻塞。

  • dropDatabase有超时时间,所以在前文的报错截图中可以看到writeConcernFailed,而mongorestore没有默认超时时间,所以一直无法写入数据。





故障处理



此次故障的解决方案是使用如下命令删除数据库:

use database

db.runCommand( { dropDatabase: 1writeConcern: {w:1} } )

关闭从节点,删除数据目录,进行重新初始化,就可以跳过在从库创建索引。同时mongorestore也可以添加参数--writeConcern={w:1}执行数据导入。




本文作者:刘运彬

本文来源:IT那活儿(上海新炬王翦团队)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/129548.html

相关文章

  • MongoDB - write concern concept

    摘要:对于多文档操作来说,并未提供多文档事物或隔离。在间隔过期之前,不会回滚或撤消已做出的修改。仅在将数据提交到后才告知客户端。为了降低操作延迟,也增加了它提交数据至日志的频率。 本文翻译自 write concern。 注意,本文内容适用于MongoDB Manual 3.0.2及以上版本。 Whats write concern 所谓的写关注就是当向客户端报告写操作的成功...

    callmewhy 评论0 收藏0
  • MongoDB - Write Concern Reference

    摘要:版本中的修改在主从部署中,把视作与是等效的。这会确保如果意外关闭了,数据也不会丢失。当这些写操作返回时,不会撤销在写关注超过时限之前已经成功执行的数据修改。 Write Concern Reference 本文翻译自 write concern reference。 注意,本文内容适用于MongoDB Manual 3.0.2及以上版本。 写关注就是当向客户端报告写操作...

    ARGUS 评论0 收藏0
  • MongoDB笔记(1)- MongoDB简介、数据类型及帮助命令

    摘要:数据模型取决于数据库类型。仅支持位浮点数,所以位整数会被自动转换为位浮点数。位浮点数中的数字都是这种类型。数字只能表示为双精度数位浮点数的另外一个问题是,有些位的整数并不能精确地表示为位浮点数。 MongoDB学习笔记(1)- MongoDB简介及数据类型 本文所使用的MongoDB版本为 4.0.10 > db.version(); 4.0.10 一、MongoDB 介绍 1. Mo...

    nihao 评论0 收藏0
  • eBay:使用MongoDB构建关键任务的多数据中心应用程序

    摘要:曲先生指出,随着近期的产品功能增多,正在越来越满足更广泛的应用需求对添加区域分片使得能够为需要跨多个数据中心提供分布式永久写入可用性的应用程序提供服务。 作为世界前十十个全球零售品牌,拥有1.7亿活跃买家和10亿在线市场,eBay无法承受系统停机带来的损失。 这就是为什么公司依靠MongoDB作为其核心企业数据平台标准之一,为运行ebay.com的多个面向客户的应用程序提供支持。 在今...

    charles_paul 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<