大部分场景的 MemStore 内存不足是可以自动恢复的,客户端报错后,内存会在一段时间后自动释放。本文介绍需要人工介入的内存不足问题。
适用版本
OceanBase 数据库 V2.x 版本
问题现象
大部分场景的 MemStore 内存不足是可以自动恢复的,客户端报错后,内存会在一段时间后自动释放。本文介绍需要人工介入的内存不足问题。
OceanBase 数据库 V2.x 版本为解决版本冻结会停止正在执行的事务的问题,引入了数据搬迁的机制,即 MemStore 冻结过程中,会确定冻结版本号 Frozen Version,对于事务 commit_version 大于 Frozen Version 的事务,都需要将其写入的数据搬迁到新创建的 Active MemStore 上。
假设事务 T1、T2 均有三条日志:Redo_prepare Log、Commit Log、Clear Log。T1 事务的 commit_version 为 100,T2 事务的 commit_version 为 200。T1 和 T2 的 Redo_prepare Log 均回放到了 Memtable A,之后触发冻结,冻结快照版本是 100。显然,事务 T2 的数据需要搬迁到 Active Memtable B 上,如果 T2 较大,搬迁可能出现没有内存,使得搬迁挂起,影响 Memtable A 的内存释放,最终导致本机无法接收 Leader 上新同步的日志,Leader 停写。
规避方式
对于 OceanBase 数据库 V2.x 版本
控制事务大小,并且控制客户端并发量。
隐藏配置项
_max_trx_size限制了当前事务最大允许写入的事务大小,默认值 100 MB,OceanBase 数据库 V2.x 版本不建议将该配置项的值调大。如果必须要调大,请联系 OceanBase 技术支持。受该配置项影响,
INSERT最大允许插入的行数为_max_trx_zie /(单行长度 * 2)。UPDATE最大允许更新的行数为_max_trx_size /((单行长度)*2*4*2)。例如,假设
_max_trx_size设置为 100 MB,建表语句如下。obclient> CREATE TABLE test (col1 varchar(512),col2 varchar(512))则对于该数据表:
INSERT场景允许的行数为100*(1024*1024)/((512+512)*2)= 51200行。UPDATE场景(假设语句为UPDATE test SET col1=<new value >, col2=<new value>),允许的行数为100*(1024*1024)/((512+512)*2*4*2) = 6400行。说明
上述公式仅仅作为一个参考,不能保证完全估计准确,因此实际事务大小的评估需要根据实际测试为准。
对于 OceanBase 数据库其他版本,需要将 OceanBase 数据库升级到 V3.1.0 及以上版本。有关升级 OceanBase 数据库的方法,请参见《OceanBase 数据库 升级指南》。