范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

搞会这个索引添加法,十亿级时延敏感集群想抖动都难

  作者介绍
  杨亚洲,前滴滴出行专家工程师,现任OPPO文档数据库mongodb负责人,负责数万亿级数据量文档数据库mongodb内核研发、性能优化及运维工作,一直专注于分布式缓存、高性能服务端、数据库、中间件等相关研发。
  线上某mongodb集群存储影响公司收入流水的核心数据,本文分享该集群为何多个索引串行后台会引起集群抖动,并且部分节点出现了连接数耗光等问题。同时通过本案例,给出时延敏感业务该最优方式添加索引,做到对业务最小化影响或者无影响。
  索引对业务查询性能提升起着至关重要的作用,但是绝大部分mongodb程序员和DBA对时延敏感业务的索引添加方法是错误的。
  本文主要完成一下几个目的:
  为何background后台加索引会引起时延敏感集群抖动?
  为何前面两个索引添加过程没触发告警,第三个索引添加完成后才触发告警?
  为何只有从节点抖动,主节点时延一切正常?
  为何连接数暴涨?
  连接数耗光,mongo shell无法登陆查看节点内部状态信息,如何破局?
  时延敏感型业务如何做到业务无感知索引添加?
  一、业务背景
  某业务存储公司核心数据,集群异常会影响公司流水收入,该业务对时延非常敏感,稍有抖动就容易引起客户端超时异常,该业务场景如下:
  数据量很小,10亿级
  核心业务
  时延敏感
  分片模式,单个分片
  读写分离
  读多写少
  峰值流量8-10W/s
  该集群对应mongodb内核版本:3.6.13,某天业务自己通过mongodb管控平台串行方式添加几个索引(background后台添加),一个索引添加执行完成返回后,业务开始下一个索引的添加。
  添加第一个索引和第二个索引完成后,业务没告警,但是当业务添加完第三个索引后,开始收到部分查询时延超过阀值告警。
  二、集群架构
  2.1 集群部署架构
  该集群部署架构如下:
  该业务集群对应流量监控曲线如下:
  如上图所示,该业务部署只有一个分片,该分片为一主四从结构5节点。分片1采用5节点的原因如下:
  核心业务,5副本方式部署,可以容忍两个节点估值
  时延敏感,由于业务优先读从节点,因此可以通过增加分片从节点的方式提升业务的QPS。
  2.2 一个分片为何要选择分片模式?复制集不是可以满足要求吗?
  从上面的结构图可以看出,该集群只有一个分片,采用了分片模式架构,为何不选择复制集架构,这样还可以省掉mongos代理和config server的成本开销。采用分片模式主要基于如下因素考虑:
  该业务当前数据比较小,10亿级别,但是随着时间增长后续可能会增加到百亿级别,考虑到以后可能存在分片扩容的需求,因此采用了分片模式。
  该集群当前写入更新比较少,后续可能存在大量写入更新的场景,大量写入更新需要多分片来支撑。
  我司在mongos代理增加了很多功能,例如限流、流量控制、权限细化控制、监控信息完善等功能,因此默认采用分片模式。
  三、问题快速发现及解决
  3.1 问题发现
  某天,突然告警中心打来电话,突然收到如下告警信息:
  几乎四个从节点先后收到同样的告警,节点时延部分请求超过20ms,由于该业务是非常核心的影响业务营收的核心集群,非常紧张。但是,有一个很奇怪的现象,主节点访问时延正常,只有从节点时延抖动。
  此外,还不停收到实例不可用异常告警,对应监控曲线如下:
  说明:上图曲线一根代表客户端当前已用连接数,一根曲线代表剩余可用连接数。
  3.2 问题排查过程
  收到告警后,发现业务有很多慢日志(时延敏感业务,慢日志打印阀值为20ms),同时慢日志都走了最优索引。
  通过mongo shell登陆对应节点后台
  于是通过mongo shell登陆节点后台,但是登陆不上,出现如下打印:
  1.MongoDB shell version v3.6.13
  2.connecting to: mongodb://x.x.x.x:20001/test?gssapiServiceName=mongodb
  3.2021-04-29T11:09:15.049+0800 E QUERY [thread1] Error: network error while attempting to run command "isMaster" on host x.x.x.x:20001" :
  4.connect@src/mongo/shell/mongo.js:263:13
  5.@(connect):1:6
  6.exception: connect failed
  由于节点登陆不上,因此登陆到存储节点查看后台日志,日志中有大量的打印提示连接数耗光了,如下图:
  节点系统监控统计分析
  从上面的现象可以看出链接耗光了,于是分析节点所在服务器系统监控,发现一个问题,磁盘IO非常高,如下:
  分析mongod实例日志
  由于从节点登陆不上,系统磁盘IO很高,因此怀疑有慢操作在运行,于是分析实例日志,发现如下现象:
  问题确认
  通过前面的分析可以得出问题根因在于加索引引起从节点磁盘IO过高,最终引起业务查询时延上升抖动。
  通过和业务沟通,业务这段时间确实通过我们的管控平台串行方式加了几个索引,磁盘IO过高由业务加索引引起,同时从节点同一时刻有多个索引添加。加索引过程首先需要读取表数据,然后通过数据构建索引,这个过程都会有多次IO操作。磁盘IO是公用的,服务器IO高会引起该服务器上所有的IO操作变慢,因此最终引起从节点读服务抖动。
  问题解决过程
  到这里,我们已经确定问题是由于加索引引起,只有把索引干掉磁盘IO才会恢复正常,因此我们需要尽快干掉索引。然而,由于连接数已经耗光,无法链接从节点,所以我们不能做killop操作。
  由于无法登陆后台做killop操作,于是直接kill进程,kill进程后启动,发现mongod还是在构建索引,如下:
  重启后,还是需要构建索引,因为之前索引没有执行完成mongod进程就挂了,因此需要重建索引来保持与主节点状态一直。
  不过,mongod为了解决类似问题,提供了一个noIndexBuildRetry参数来跳过实例加索引中途异常重启后重构索引的流程,该参数功能如下说明:
  don"t retry any index builds that were interrupted by shutdown
  noIndexBuildRetry放弃启动从节点mongod实例,业务很快恢复:
  mongod -f /home/service/mongodb/conf/mongod_20001.conf --noIndexBuildRetry
  四、createIndex构建索引核心流程及问题暴露过程
  4.1 createIndex构建索引核心流程
  业务链接代理通过createIndex命令添加background后台索引,其运行流程如下图所示:
  主节点接受到createIndex命令后的执行主要流程如下:
  主节点查询对应表数据,然后build构建索引。
  索引数据构建执行完成后,返回客户端OK。(注意:主构建完成后就通知OK给客户端,实际上这时候从节点还没有开始构建索引)
  生成createIndex对应oplog数据到oplog表
  从节点获取到createIndex对应oplog操作,然后重放createIndex构建索引。
  4.2 问题暴露流程
  通过分析日志时间点和告警时间点,和业务确认,发现当业务第三个索引添加完成后(实际上只是主节点构建索引完成),开始触发时延告警阀值。总接时间序列如下:
  T1时刻第一个索引主节点构建完成,然后同步到两个从节点构建索引,也就是T1时刻两个从节点只有一个索引index1在运行。
  T2时刻第二个索引主节点构建完成,然后从节点获取到这个索引执行,这时候由于从节点读流量大,因此构建索引比主节点慢,最终index1和index2都在两个从节点运行。此时,访问时延还没有触发时延告警阀值。
  以此类推,T3时刻第三个索引添加完成,从节点通过oplog获取到第三个索引运行,由于此时index1、index2都还没有运行完成,因此两个从节点同时构建index1、index2和index3索引。三个索引的同时运行,进一步加重了磁盘IO负载和系统开销,业务访问时延进一步上升,最终造成部分查询时延超过20ms。
  总结如下图所示:
  五、疑问解答
  为何background后台加索引会引起时延敏感集群抖动?
  如上面分析,虽然业务是串行的方式一个索引添加成功后再添加下一个background后台索引,由于主从索引构建执行时间的长短不同,从节点通过拉取对应oplog重放,最终引起某一时刻开始三个索引在所有从节点同时运行,引起IO负载很高,最终触发业务访问时延告警。
  为何前面两个索引添加过程没触发告警,第三个索引添加完成后才触发告警?
  如上,从节点拉取Oplog获取到第三个索引执行的时候IO负载进一步增加,最终触发了20ms访问时延阀值。
  为何只有从节点抖动,主节点时延一切正常?
  主节点由于业务添加是一个索引后台添加完成后,才添加第二个索引。也就是主节点同一时刻只会有一个索引在执行,IO负载低,此外由于主节点写流量本身不高,读流量几乎都在从节点,索引加索引执行很快,并且几乎不会影响写流量时延。
  为何连接数暴涨?
  连接数暴涨实际上是加索引引起业务访问慢的结果,由于三个索引同时在从节点构建索引运行,造成从节点IO负载很高,最终造成业务访问变慢。
  访问变慢后,会引起客户端链接池中的链接不够用,于是客户端会动态的增加链接池中的连接数来进行后端DB访问,最终造成了mongod服务端连接数到达配置上线出现无法链接的问题。
  连接数耗光,mongo shell无法登陆查看节点内部状态信息,如何破局?
  连接数耗光,mongo shell将无法连接节点,无法获取节点内部状态。可以对该功能做优化,对指定的客户端(默认127.0.0.1)设置白名单,取消max connections限制,这样我们即可通过节点本机登陆mongod后台获取内部状态信息。
  例如增加了链接限制白名单后,就可以通过127.0.0.1登陆到节点内部,然后通过killOp操作把从节点正在构建索引的操作干掉。
  六、时延敏感型业务如何做到业务无感知索引添加?
  方法一:所有主从确保索引执行完成后添加下一个索引(影响相对较小)
  后台background加索引,确保所有主从索引构建完成后,才开始下一个索引的创建,避免出现本文所说的多个索引同时在从节点执行引起业务抖动。
  说明:mongodb高版本中对后台添加索引做了优化,从节点拉取建索引对应oplog重放的时候,只有第一个索引执行完成,才会执行第二个索引,从而避免了同时多个索引同时执行引起的抖动。
  方法二:单机启动,然后加索引,加完索引后再加入到副本集(业务无任何感知)
  无感知添加索引步骤如下:
  从复制集中移除某个从节点
  单机方式启动该节点
  阻塞方式(不带background)加索引,这样索引构建速度更快
  索引添加完成后,副本集方式启动该节点
  把该节点加入复制集
  通过以上步骤,即可无感知方式完成一个从节点的索引添加,其他节点添加过程重复该操作过程即可。
  dbaplus社群欢迎广大技术人员投稿,投稿邮箱:editor@dbaplus.cn

应采儿带Jasper吃饭,餐桌礼仪尽显教养导语知名礼仪大师威廉汉森认为,一个人自身教养程度,及其父母的生活背景,只用一顿饭的功夫就能够被观察出来。对于孩子更是如此。演员应采儿给外人的感觉总是大大咧咧,凡事随性,性格外放,深从不会写,到千字长文,孩子写作都需要样的技巧导语写作有没有技巧?有!孩子的语文老师常会在班级群里分享一些班里的孩子写的文章,能被遴选出来的作文写得确实不错。如果细细品读孩子们的作文,是可以看到一些从别处借鉴来的元素。曾经的学北大教授也吼娃,只是声音高点,融洽的亲子关系培养的娃不会差北京大学教育学院一位丁姓教授,忽然因为在视频中吐槽女儿,被全网尽知。丁教授本名丁延庆,现任北大博导副教授,小时候就被称为神童!6岁即能背诵整本新华字典,在北京大学读的本科硕士研究生高考前忽然开窍,考上武大看樱花,孩子怎样早开窍导语和很多望子成龙望女成凤沉迷鸡娃的虎妈狼爸们一样,我心底里也在期盼孩子早日成为学霸,某一天忽然开窍,发现学习的奥秘和乐趣,不再觉得学习是一种负担,充分享受挑战的快乐。网友萌萌讲了父母的远见,是孩子一生的福气,有远见的父母必做的3件事导语回看已是中科院博士的86版红孩儿成长之路,让人情不自禁慨叹有远见的父母,是孩子一生的福气。人的教育在他出生的时候就开始了,在他不会说话和听别人说话以前,他就已经受到教育了卢梭教引导孩子长高个,家长抓住身高管理的几个关键因素导语孩子长高个是每个家长的期望,人的个子70靠先天遗传,30受后天影响,家长们于是就想尽办法,努力想将这30的后天因素发挥到极致。引导孩子长高,家长需要抓住孩子身高管理的几个关键因应不应该告诉孩子童话是假的,这或许是最好的答案导语童话里讲得是假的还是真的?乘着想象的翅膀,游历奇妙的童话世界,看花儿跳舞,听星星歌唱。这是统编语文教科书三年级上册童话单元的开篇语。忙完一天的工作,回到家,累得连多余一句话都不郭麒麟情商高,漂亮话让人舒服,如何培养孩子的情商导语相声演员郭麒麟,是相声演员郭德纲的长子。自称在相声界无法企及父亲郭德纲的高度,自行转战娱乐圈,依然圈粉无数,处处受人喜欢。演员周迅第一次见到郭麒麟就说我也没见过你,但我就是特喜心思不全在学习上,成绩不会陪你演戏,要好成绩,必须知道这件事导语一位学生问老师,为什么自己再怎么努力,还是有很多题不会呢?老师回答,你真的很努力吗?学习的时候只要有人说话你就一定要插一句,窗外飞过一只鸟你都要看一看,这些小动作可能你自己都没热衷打压教育的家长,最终得到了什么,夸孩子有多难导语每个孩子对自己的认知,很大程度上取决于家长对他的评价。很多家长本着谦虚使人进步,骄傲使人落后的理念,常常采取打压式教育,而另一些家长则秉承多表扬能更有效促进孩子进步的理念。对孩父亲陪伴女儿成长,这几个优点特别突出导语父爱如山,父爱对女儿的成长是加分项。陪女儿高考,女儿笑着走进考场。而父亲因为想到自己没有照顾好女儿,以泪洗面,大家无不为之动容。多少父亲像这位父亲一样辛苦,既要外出打工挣钱,又
新国标塑胶跑道价格新国标塑胶跑道种类新国标塑胶跑道价格新国标塑胶跑道种类盛立体育塑胶跑道塑胶球场材料厂家销售材料,可配套施工队伍18627895877塑胶跑道的种类选对,想不省钱都难!一条跑道,维系的不仅是快乐运动,透气型塑胶跑道价格透气型塑胶跑道价格盛立体育塑胶跑道塑胶球场材料厂家销售材料,可配套施工队伍18627895877透气型塑胶跑道的特点一透气型塑胶跑道不会鼓泡透气型塑胶跑道底层是单一液体Pu和弹性橡透气型塑胶跑道价格报价透气型塑胶跑道价格报价盛立体育塑胶跑道塑胶球场材料厂家销售材料,可配套施工队伍18627895877透气型塑胶跑道的铺装施工工艺透气型塑胶跑道铺装施工工艺是采用三步施工法停止铺装的新国标透气型塑胶跑道价格一平方大概多钱?新国标透气型塑胶跑道价格一平方大概多钱?盛立体育塑胶跑道塑胶球场材料厂家销售材料,可配套施工队伍18627895877塑胶跑道又称全天候田径运动跑道,它由聚氨酯预聚体混合聚醚橡胶E透气型塑胶跑道新国标价格报价透气型塑胶跑道新国标价格报价盛立体育塑胶跑道塑胶球场材料厂家销售材料,可配套施工队伍18627895877透气型塑胶跑道通过新国标GB362462018中小学合成材料面层运动场地上环保透气型塑胶跑道价格报价环保透气型塑胶跑道价格报价盛立体育塑胶跑道塑胶球场材料厂家销售材料,可配套施工队伍18627895877环保透气型塑胶跑道是由国外引进的先进技术,经过专业化,现已成为我国大中小学深入秋后,这7道家常菜都是经典,营养丰富,做法简单,百吃不腻入秋后,这7道家常菜都是经典,营养丰富,做法简单,百吃不腻入秋后,秋高气爽,如果你还在为不知道吃什么而发愁,试试这7道家常菜,好吃又好做。每一道都能让你食欲大增,两碗米饭都不够吃,秋季,腌菜的季节到了,这样腌制黄瓜,酸辣爽脆又下饭,还不发霉秋季,腌菜的季节到了,这样腌制黄瓜,酸辣爽脆又下饭,还不发霉秋季,是一个非常适合腌菜的季节,你家开始腌菜了吗?我家吃咸菜从来不去买,自己做的吃得更放心更美味,所以每年到秋季我都会腌周末,16岁的儿子下厨做了3菜1汤,简单又美味,网友有福气今日周末,16岁的儿子下厨做了3菜1汤,简单又美味,网友夸有福气嗨,大家好!给大家晒晒16岁的儿子给全家做的午餐,大家看看厨艺如何?今天是周末,难得全家都在家,儿子大了也变得特别懂腌菜季节到了,快失传的酱豆子腌制方法,原来这么简单,快收藏腌菜季节到了,快失传的酱豆子腌制方法,原来这么简单,快收藏十月,秋高气爽,天气宜人,又到腌菜的季节了。老爸种的黄豆也丰收了,新鲜的黄豆刚刚晒干,用来腌制成下饭的酱豆子那可是再美不过腌菜季节到了,教你这样腌制咸辣椒,不发霉,储存半年也不变质腌菜季节到了,教你这样腌制咸辣椒,不发霉,储存半年也不变质深秋时节,秋高气爽,不冷不热的气温特别适合腌菜,我和老公都是个咸菜控,一顿没咸菜吃饭就不香。说起咸菜,因为下饭,可以说几乎