【线上问题系列】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 的角度来讲, 总期望将线上的各种变更限制在一个可控的范围内, 减少一些不确定的因素. 这样做有几点好处: . 记录线上的库表变更; . 对线上的库表变更有全局的了解; . ...
随机推荐
- Entity Framework Core 练习参考
项目地址:https://gitee.com/dhclly/IceDog.EFCore 项目介绍 对 Microsoft EntityFramework Core 框架的练习测试 参考文档教程 官方文 ...
- .Net轻松处理亿级数据--clickhouse及可视化界面安装介绍
该篇内容由个人博客点击跳转同步更新!转载请注明出处! 前言 我是在17年就听说过Clickhouse,那时还未接触过亿数据的运算,那时我在的小公司对于千万数据的解决方案还停留在分库分表,最好的也是使用 ...
- jwt入门
JWT(JSON Web Token)是一个非常轻巧的规范,这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息,通常使用在HTTP通信过程中进行身份认证. 我们知道,HTTP通信是无状态的 ...
- 第五篇 openvslam建图与优化模块梳理
建图模块 mapping_module在初始化系统的时候进行实例化,在构建实例的时候会实例化local_map_cleaner和local_bundle_adjuster.系统启动的时候会在另外一个线 ...
- 纯C语言实现顺序栈
#include <stdio.h> #include <stdlib.h> #define MAXSIZE 100 typedef int SElemType; typede ...
- AutoLayout的使用
虽然苹果提供了AutoresizingMask的布局方式,这个方式局限性太大:只能解决父控件和子控件间的相对关系: 因此,推出了AutoLayout:苹果官方也是推荐开发者尽量使用autolayout ...
- 【已采纳】supervisor在服务器端(linux),如何一直运行你的python代码
正式开始之前,说一下我的项目是放在虚拟环境里的,具体什么是虚拟环境,怎么创建,请自行百度噢! 一.安装 源码安装 先下载最新的supervisor安装包:https://pypi.python.o ...
- OL7.7安装Oracle 11.2.0.4
安装环境准备工具 yum –y install oracle-rdbms-server-11gR2-preinstall 创建目录 mkdir -p /u01/app/oracle/product/1 ...
- Django框架(十八)—— drf:序列化组件(serializer)
序列化组件 # 模型层 from django.db import models class Book(models.Model): nid = models.AutoField(primary_ke ...
- debian apt-get 代理
一:在 /etc/apt/目录下建立 apt.conf 文件增加如下 Acquire::http::Proxy "http://proxyxxxxxxx:port"; 注意格式:最 ...