一次血泪教训引发的构思
2011-10-02 17:19
239 查看
也就是在两个星期前,发生一次线上事故.为此,我们的团队为此付出惨重代价,持续加班3天2两夜,紧急从并不完整的日志中恢复数据,其实日志也就是一个一个的点,需要分析日志序列,把这些点连成操作过程真的是非常的痛苦.
事件平息之后,冥思苦想,认真思考,回想问题所在,有一些想法,顺着这个想法,我决定写一个开源插件,系统引入此插件之后,可以在系统运行之后通过外部注入式,执行代码,这样就可以随时额外附加代码控制整个系统.下面先说说事故,再说说我准备做的东西:
我们的系统是单服结构,数据通过队列和异步处理器,异步写回.系统运行时的数据直接取至内存.如果数据发生变化后,投递到到队列中.不让数据和数据库发生直接关系,保证数据操作的高效性,水平的数据操作压力,这样也是现在比较常用的一套平滑压力的方案,一切看上去都是那么不错,也得到了很多项目的验证.(请各位原谅,出于对知识产权的尊重,我不能过详细的描述项目结构,不过没有关系,这个并不是我这次写这些的主题,主题是由此引发的构思)
但是悲催的事情就发生在此,数据文件的头信息毁坏,数据不仅没有写进去,也没有读出来,因为数据来至内存,没有停服之前,一切看上去那么正常,除了后台不停的报错之外,其他运行一切正常.
就这样停服了,这时,缓存队列中还有很多的数据没有写回,原本固化的操作也也不能被清除,进入一轮死循环,写不进去也读不出来,这时,伴随停服流程,端口也关闭了,没有任何口可以将命令传送到服务器,服务器进入假死的死循环中.
因为java进程还存在,这时我想的第一个方法是,dump出内存,我企图从虚拟机的dump文件中抓取对象,然后写回,结果无果.构思也就从这里开始.
如果现在还有独立的口,他可以将我现在写的代码注入到系统中,立刻写一段代码,注入到系统中,让他帮我把那些在内存中的可爱数据强行写入到数据库中,这样数据不仅完整,而且正确可靠,但是我没有,所以现在我需要做一个这样东西,先画一下脑图吧!整理一下思绪,规整一下功能(图-1).
图-1
简单说一下这些部件:
1) 代码直接运行.包括直接上传已经写好的java代码或者直接编写java代码,然后服务器负责拼组代码,这两种其实没区别,主要的思想是使用JIT(JIT是just in time,即时编译技术).
2) 直接执行class.上传已经编译完成的class,减少编译错误.主要思想是依靠classloader的父委托机制将一个自己的classloader插入到系统中,用来加在class.
3) 一个微型的web服务器.主要用来为上面两种模式提供web的服务.
4) 一个简单认证机制.为来为web服务器提供安全保障.
希望这个简单的开源模块能为我以后的项目带来一些后勤保障,作为一道最后的屏障.
也希望其他同道中人能够依赖这个开源模块,避免一些事故发生.
这个是我一个初步的想法,欢迎大家拍砖和提建议.
事件平息之后,冥思苦想,认真思考,回想问题所在,有一些想法,顺着这个想法,我决定写一个开源插件,系统引入此插件之后,可以在系统运行之后通过外部注入式,执行代码,这样就可以随时额外附加代码控制整个系统.下面先说说事故,再说说我准备做的东西:
我们的系统是单服结构,数据通过队列和异步处理器,异步写回.系统运行时的数据直接取至内存.如果数据发生变化后,投递到到队列中.不让数据和数据库发生直接关系,保证数据操作的高效性,水平的数据操作压力,这样也是现在比较常用的一套平滑压力的方案,一切看上去都是那么不错,也得到了很多项目的验证.(请各位原谅,出于对知识产权的尊重,我不能过详细的描述项目结构,不过没有关系,这个并不是我这次写这些的主题,主题是由此引发的构思)
但是悲催的事情就发生在此,数据文件的头信息毁坏,数据不仅没有写进去,也没有读出来,因为数据来至内存,没有停服之前,一切看上去那么正常,除了后台不停的报错之外,其他运行一切正常.
就这样停服了,这时,缓存队列中还有很多的数据没有写回,原本固化的操作也也不能被清除,进入一轮死循环,写不进去也读不出来,这时,伴随停服流程,端口也关闭了,没有任何口可以将命令传送到服务器,服务器进入假死的死循环中.
因为java进程还存在,这时我想的第一个方法是,dump出内存,我企图从虚拟机的dump文件中抓取对象,然后写回,结果无果.构思也就从这里开始.
如果现在还有独立的口,他可以将我现在写的代码注入到系统中,立刻写一段代码,注入到系统中,让他帮我把那些在内存中的可爱数据强行写入到数据库中,这样数据不仅完整,而且正确可靠,但是我没有,所以现在我需要做一个这样东西,先画一下脑图吧!整理一下思绪,规整一下功能(图-1).
图-1
简单说一下这些部件:
1) 代码直接运行.包括直接上传已经写好的java代码或者直接编写java代码,然后服务器负责拼组代码,这两种其实没区别,主要的思想是使用JIT(JIT是just in time,即时编译技术).
2) 直接执行class.上传已经编译完成的class,减少编译错误.主要思想是依靠classloader的父委托机制将一个自己的classloader插入到系统中,用来加在class.
3) 一个微型的web服务器.主要用来为上面两种模式提供web的服务.
4) 一个简单认证机制.为来为web服务器提供安全保障.
希望这个简单的开源模块能为我以后的项目带来一些后勤保障,作为一道最后的屏障.
也希望其他同道中人能够依赖这个开源模块,避免一些事故发生.
这个是我一个初步的想法,欢迎大家拍砖和提建议.
相关文章推荐
- 一次减速机报价引发的“血泪”教训
- MyISAM重启之后的一次血泪教训
- MongoDB经验教训:一次批量删除历史数据引发的悲剧
- 互联网创业的8个血泪教训
- 通达OA 一次升级引发的即时通讯工具不能接收离线信息的血案
- 一次dns缓存引发的惨案
- 一次AOP配错自动创建事务代理的bean引发的疑案
- 一次脚本和crond引发的系统故障
- 一次调侃引发的思考——甲方企业的IT人员究竟应具备哪些素质?
- 细节影响成败——一次前端调试引发的思考
- 一次线上问题排查所引发的思考
- SQLSERVER 2012之AlwaysOn -- 一次硬件升级引发的问题
- 记一次一个枚举引发线上事故风暴
- 一次因为游戏程序员猝死引发的思考
- RabbitMQ - TcpConnection析构引发的一次handshake_timeout
- 一次带大字段表记录暴增(LOBSEGMENT)引发的悲剧
- ORACLE sql调优之记录一次trim函数引发的大表全表扫描
- 小公司项目实施--从我的一次经历看经验教训
- 一次AWR报告引发的自我反省 推荐
- 记一次排查mbstowcs误用引发的bug