【线上问题系列】DB字段类型变更导致核心服务不可用
背景
业务说明
接到一个业务需求,往DB表中某个字段里新增一些数据,该字段本来是text类型,发现根据业务需求来说,新增数据超过text类型的最大长度,因此需要对数据库表的该字段类型做变更,变更为了MEDIUMTEXT类型来解决业务需求;
数据流转
DB表的数据会通过数据处理转化到mongo中存储,然后mongo再加载到redis中,打点服务会从redis读取该数据,进行json encode,然后做业务处理;
问题过程
- 开发反馈打点服务sg、fk集群机器出现响应时间突增以及请求出现大量5xx,运维增加集群机器数量后发现响应时间以及5xx数量并未减少,观察到新开的机器以及旧机器的打点服务进程的go携程数以及占用的内存非常高,开发开始排查具体原因
- 运维开始将fk地区请求转到vg地区集群,fk地区的请求响应时间以及5xx下降,服务恢复正常,vg地区表现正常(因为vg的机器多,即使解析慢了还是够应付)
- 开发反馈上午某业务需求服务上线新功能会导致mongo中的campaign中的问题字段数据量变大,可能是此变动影响到打点服务,进行回滚相应变动后,观察到sg地区请求5xx的数量逐渐下降,运维开始新开机器并重启旧机器,服务逐渐开始恢复
- sg地区服务恢复正常,fk地区请求也迁回fk集群机器,打点所有地区服务恢复正常
问题原因
- 运营反馈ss素材报表ctr出现100%的问题,排查到是上线素材区分国家后导致
- 开发操作上线修复此问题,同时会导致mongo中的campaign中的某问题字段数据量变大,由于打点通过zeus redis获取campaign数据,并且会进行json反序列化操作,部分单子的该问题字段数据量增大到2M以上,导致打点反序列化效率下降,造成请求堆积,最终导致进程中的携程增加,占用内存资源不断增加,导致服务不可用
问题总结/改进
- 信息同步,核心系统出现问题首先在群里反馈该问题,看之前是否有其他项目上线(包括DB/配置变更)导致该问题;
- 业务流程梳理,对全流程进行梳理,知悉数据去向和使用,方便问题的定位分析,快速发现问题;
- 系统架构优化,打点服务解耦,反序列化效率提升, mongo中campaign信息的拆分,了解到目前有部分信息是独立表的,打点服务在启动的时候会去load数据到内存中;
- 个人觉得架构问题是大于流程方面的,但复盘会下来流程问题大于架构,不可否认流程问题得到解决可以避免类问题,但随着业务持续增长/迭代这些问题始终是要暴露出来的;
其他
- 咨询了之前UC的同事那边的打点服务,打点服务可以拆分为接受+处理两个模块,接受模块来解析接受请求,然后存储在中间件中(类似kafka,metaQ消息队列),然后处理模块消费处理,这样可以解耦,如果处理失败的话,可以从中间件中重复消费减少损失
- 公司的算法强依赖日志,因为日志的确实会导致算法模型训练不准;
- 由于公司之前的节约成本的考虑,目前的mongo数据是刚刚够用状态,如果不从成本考虑,mongo机器够多,打点服务就可以马上加机器应对这次事故;临时加mongo机器很慢,因为加了机器还是同步数据,一般加mongo机器大概是1个小时左右,因此出现事故的时候一般不会加mongo机器时间花费太久了;但如果mongo机器只是够用的状态,只加打点服务的机器的话,mongo数据库会顶不住,太多服务连接使用,所以在加打点服务机器的时候出现了服务起不来,因为把mongo弄挂了;
- 打点服务的使用方是SDK,SDK发现打点服务返回不是200的时候有重试机制,所以导致打点服务请求暴增,因此引起雪崩了;
【线上问题系列】DB字段类型变更导致核心服务不可用的更多相关文章
- 不停机修改线上 MySQL 主键字段 以及其带来的问题和总结思考
起因: 线上 user 数据库没有自增字段,数据量已经达到百万级.无论是给离线仓库还是数据分析同步数据,没有主键自增 id 都是杀手级的困难.所以在使用 create_time 痛苦了几次之后准备彻底 ...
- Mysql中字段类型不一致导致索引无效
修改后 详细见楼下链接 http://ustb80.blog.51cto.com/6139482/1287847
- 一次性搞清楚线上CPU100%,频繁FullGC排查套路
“ 处理过线上问题的同学基本上都会遇到系统突然运行缓慢,CPU 100%,以及 Full GC 次数过多的问题. 当然,这些问题最终导致的直观现象就是系统运行缓慢,并且有大量的报警. 本文主要针对系统 ...
- Visio 2007中进行数据库建模时如何显示字段类型以及概念名称
关于在VISIO中进行数据库建模时如何显示字段类型,以及注释的 1 如何显示字段类型: 在visio菜单上--->点击数据库--->选项--->文档 打开后选择表这项,在上 ...
- FIREDAC不能识别SQL的某些字段类型
FIREDAC不能识别SQL的某些字段类型 经常见有网友有类似的提问:请问各位,在DataSnap中使用SQL数据SUM函数,如果是统计浮点型数值的话,返回是乱码,哪位是什么原因? 其实这不是DAT ...
- 放码来战!HMS Core线上Codelabs挑战赛正式开始
亲爱的开发者,在1024程序员节即将到来之际,HMS Core准备了一场线上Codelabs挑战赛,现向你发出诚挚邀请,希望你能将新奇的想法和对产品的思考融入代码,用技术与世界对话. HMS Core ...
- 震惊!线上四台机器同一时间全部 OOM,到底发生了什么?
案发现场 昨天晚上突然短信收到 APM (即 Application Performance Management 的简称),我们内部自己搭建了这样一套系统来对应用的性能.可靠性进行线上的监控和预警的 ...
- MySQL 分区表 partition线上修改分区字段,后续进一步学习partition (1)
公司线上在用partition,有一个表的分区字段错了,需要重建,结果发现没有办法像修改主键字段或者修改索引字段那样直接一条sql搞定.而是需要建临时表,有down time,所以去仔细看了文档,研究 ...
- 如何有效的跟踪线上 MySQL 实例表和权限的变更
介绍 从系统管理员或 DBA 的角度来讲, 总期望将线上的各种变更限制在一个可控的范围内, 减少一些不确定的因素. 这样做有几点好处: . 记录线上的库表变更; . 对线上的库表变更有全局的了解; . ...
随机推荐
- IDEA帮助文档快捷键ctrl+q 查看类 方法 变量 帮助文档 注释 快捷键
IDEA查看类 成员变量 局部变量注释快捷键,Ctrl +Q 查看帮助文档 实际项目中,通常一个类中的代码都不少,而且有很多的变量 那么如何快速知道这个变量的一些信息,比如类型,定义? 比如在第50 ...
- Autoware 培训笔记 No. 4——寻迹
1. 前言 好多初创公司公布出来的视频明显都是寻迹的效果,不是说寻迹不好,相反可以证明,寻迹是自动技术开始的第一步. 自动驾驶寻迹:一种能够自动按照给定的路线(通常是采用不同颜色或者其他信号标记来引导 ...
- kali渗透综合靶机(十)--Raven靶机
kali渗透综合靶机(十)--Raven靶机 一.主机发现 1.netdiscover -i eth0 -r 192.168.10.0/24 二.端口扫描 1. masscan --rate=1000 ...
- StringBuilder.sb.AppendLine();
StringBuilder sb=new StringBuilder(); sb.AppendLine("The world is fair and wonderful.Everything ...
- Java生鲜电商平台-源码地址公布与思考和建议
Java生鲜电商平台-源码地址公布与思考和建议 说明:今天是承诺给大家的最后一天,我公布了github地址(QQ群里面有).诚然这个是我的计划中的事情,但是有以下几点思考请大家共勉: 1. 你下了那么 ...
- Spring笔记01
spring 第一章 Spring模块规划图 核心架包 spring-beans-4.0.0.RELEASE. spring-core-4.0.0.RELEASE. spring-context-4. ...
- 操作系统原理之I/O设备管理(第六章上半部分)
一.I/O系统的组成 I/O系统不仅包括各种I/O设备,还包括与设备相连的设备控制器,有些系统还配备了专⻔⽤ 于输⼊/输出控制的专⽤计算机,即通道.此外,I/O系统要通过总线与CPU.内存相连. I/ ...
- 中国爬虫违法违规案例汇总github项目介绍
中国爬虫违法违规案例汇总github项目介绍 GitHub - 本项目用来整理所有中国大陆爬虫开发者涉诉与违规相关的新闻.资料与法律法规.致力于帮助在中国大陆工作的爬虫行业从业者了解我国相关法律,避免 ...
- Jmeter进阶技能-数据库信息,传递参数
因为项目的原因,假设我们要实现如下要求:从数据库的用户表里获取用户信息,并作为参数全部传递给登录请求,分别完成登录操作. 01Jmeter连接数据库 1.添加JDBC Connection Confi ...
- inndo 表与存储逻辑_1
------------------------------------------2015-03-03--------------------------------------- 表 : inno ...