Spring MVC 异常解析器
|
了解了MySQL行记录之后,再来看看事务的基本结构,下图是MySQL的事务数据结构,上文我们提到过。事务在开启之后会创建一个数据结构存储事务相关信息、锁信息、undo log以及非常重要的read_view信息。
read_view保存了当前事务开启时整个MySQL中所有活跃事务列表,如下图所示,在当前事务开启的时候,系统中活跃的事务有trx4、trx6、trx7以及trx10。另外,up_trx_id表示当前事务启动时,当前事务链表中最小的事务ID;low_trx_id表示当前事务启动时,当前事务链表中最大的事务ID。 新架构中系统将日志数据通过Kinesis传递到s3中,从而触发日志处理程序。新架构运行后,一切都ok。但是过几天出现了异常。。。监控仪表板上的一些异常情况。系统在收集垃圾,很多垃圾! 垃圾回收(GC)是某些编程语言自动释放不再使用内存的一种方式。发生这种情况时,程序将会暂停。这称为GC暂停。对内存进行的写操作越多,需要进行的垃圾回收就越多,因此暂停时间会增加。对于系统服务,这些暂停的速度越来越快,足以导致服务器重新启动并给CPU造成压力。发生这种情况时,它看起来就像是服务器已关闭(因为它暂时处于关闭状态),并且在客户端会有大量的5xx错误,而代理所尝试提取的日志中大约有6%出现了这个错误。
下面图显示了垃圾回收的暂停时间和暂停频率: 起初的系统中是通过Node.js构建提取服务。Node.js接收日志,与elixir服务进行通信检查用户的访问权限,用Redis检查速率限制,然后将日志发送到CloudWatch。CloudWatch部署了触发器,触发事件通知数据处理程序处理。 系统提取有关API调用的信息,包括从用户应用程序发送的每个调用的有效负载(请求和响应)。这些文件的大小被限制为1MB,但是仍然涉及大量的数据需要处理。处理程序以异步的形式发送和处理所有内容,目标是使信息尽快提供给最终用户。 所有内容都托管在亚马逊云AWS Fargate上,并对其设置为在4000 req/min阈值触发自动缩放。 整个流程都运行的很好,但是费用却非常昂贵。由于AWS是按照CloudWatch存储的使用来收费的,存储的越多,需要支付的费用就越多。 为了解决费用的问题,于是就有一个救援计划。 Kinesis救援和灾难
为了解决昂贵的CloudWatch存储费用问题,在将日志传送到CloudWatch之前,使用了Kinesis Firehose前置处理。Kinesis Firehose可能熟悉少,但是知道kafka的人可能多,那么Kinesis Firehose就是AWS云中的Kafka。使用Kinesis Firehose前置处理,可以用可靠的方式将数据流传递到多个目的地。只需对日志处理程序进行很少的更新,就可以从CloudWatch和Kinesis Firehose提取日志。通过该架构的更改,可以将日成本下降到之前的千分之六。 前面四列是该行记录的实际列值,需要重点关注的是DB_TRX_ID和DB_ROLL_PTR两个隐藏列(对用户不可见)。其中DB_TRX_ID表示修改该行事务的事务ID,而DB_ROLL_PTR表示指向该行回滚段的指针,该行记录上所有版本数据,在undo中都通过链表形式组织,该值实际指向undo中该行的历史记录链表。
现在假设有一个事务trx2修改了该行数据,该行记录就会变为下图形式,DB_TRX_ID为最近修改该行事务的事务ID(trx2),DB_ROLL_PTR指向undo历史纪录链表: (编辑:柳州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
