为了能否更好的体验和上手 OceanBase 分布式数据库,请您在开始尝试使用前,先了解 内存 和 超时时间 这两个最常见的特性差异。
关于内存
OceanBase 数据库是基于 LSM-tree 的存储引擎,不同于传统数据库实时刷脏页的机制,OceanBase 数据库将数据分为内存中的 MEMTable 和磁盘中的 SSTable,其中所有的数据更新写入操作都在内存的 MEMTable 中完成,并且在内存使用量达到一定阈值后触发 Compaction,转储至 SSTable,并释放活跃的内存。这种架构的优势是可以将随机 I/O 转化为顺序 I/O,提供更大的写入吞吐能力。详细介绍请参考 存储架构概述。
由于 LSM-tree 将增量数据都存放在内存中,达到一定阈值后才触发转储,这会导致小规格的租户实例运行在超过其可承载能力的密集写入场景时(例如数据导入或者运行大量数据批处理场景),会因为 MEMTable 达到上限而无法接受新的请求。OceanBase 数据库有如下几种处理方式:
开启写入限速:设置内存写入达到一定阈值后, OceanBase 数据库主动限制客户端导入速度。
租户内存扩容:环境中节点总内存资源相对充足,可扩大租户内存。
调整租户内存中 MEMTable 的比例:当节点总内存有限,无法扩容时,还可调整租户内存中 MEMTable 的比例,扩大可写入内存,并且调低转储阈值,让转储更快发生。
开启写入限速
OceanBase 数据库具备写入过载保护功能,当资源有限,无法扩展内存时,可以设置通过服务端写入限速来保护内存,避免写入超限。可通过设置如下两个配置项来开启服务端的写入限速功能:
writing_throttling_trigger_percentage:用于设置写入速度的阈值,即当 MEMStore 已使用的内存达到该阈值(百分比)时,触发写入限速。该配置项的取值范围为 [1, 100],默认值为 60,取值为 100 表示关闭写入限速机制。writing_throttling_maximum_duration:指定触发写入限速后,剩余 MEMStore 内存分配完所需的时间。默认值为 2 h,该配置项一般不做修改。
在租户的管理员账号中,设置内存写入达到 80% 开始限速,并保证剩余内存足够提供 2 h 的写入限速,示例如下:
obclient> ALTER SYSTEM SET writing_throttling_trigger_percentage = 80;
Query OK, 0 rows affected
obclient> ALTER SYSTEM SET writing_throttling_maximum_duration = '2h';
Query OK, 0 rows affected
租户内存扩容
当环境中的内存资源相对充足时,最佳处理方案是增大租户内存。
内存配置步骤如下:
登录 OceanBase 集群的 sys 租户管理员账号,执行以下 SQL 语句,确认当前租户使用的
UNIT_CONFIG NAME。obclient> SELECT NAME FROM DBA_OB_UNIT_CONFIGS; +-----------------+ | NAME | +-----------------+ | sys_unit_config | | test_unit | +-----------------+ 2 rows in set说明
sys_unit_config是管控租户的参数,一般不做修改。- 本示例中租户
test的unig_config name为test_unit。
复制租户的
unit_config name,使用如下命令,完成内存扩容。obclient> ALTER RESOURCE UNIT test_unit MIN_CPU = 2, MAX_CPU = 2, MEMORY_SIZE = '10G', MAX_IOPS = 10000, MIN_IOPS = 10000;注意
当前版本中,仅 CPU、Memory 配置生效,其他 I/O 参数(例如 IPOS)暂不生效。
调整租户内存中 MEMTable 的比例
通过如下配置项来调整租户内存中 MEMTable 的比例:
freeze_trigger_percentage:当租户的 MemTable 内存的使用量达到配置项freeze_trigger_percentage所限制使用的百分比时,就会自动触发转储,转储后会释放占用的内存。该配置项默认值为 20 ,表示当 MEMStore 使用率超过 20%,就会触发转储。memstore_limit_percentage:该配置项用于控制租户内存中可用于 MEMStore 写入的比例,默认值为 50%,表示租户可使用的 MEMStore 占其总可用内存的 50%。
当内存不足时,可以调高 memstore_limit_percentage 的取值,并调低 freeze_trigger_percentage 的取值,从而达到临时扩容和尽快转储释放的效果。
登录 sys 租户管理员账号,调高 memstore_limit_percentage 的取值,并调低 freeze_trigger_percentage 的取值,示例如下:
obclient> ALTER SYSTEM SET freeze_trigger_percentage = 20;
Query OK, 0 rows affected
obclient> ALTER SYSTEM SET memstore_limit_percentage = 70;
Query OK, 0 rows affected
关于超时时间
在 OceanBase 数据库中,您可能在查询或执行 DML 操作时遇到 'timeout' 或 'Transaction is timeout' 的错误,这是因为 OceanBase 数据库对查询和事务超时做了默认配置,方便用户针对不同业务场景进行调整。
OceanBase 数据库中指出如下超时时间相关的变量,可使用 SHOW VARIABLES LIKE '%timeout%'; 命令进行查看。
ob_query_timeout:查询超时时间,单位 us, 默认值为 10 s。ob_trx_timeout:事务超时时间,单位 us,默认值 86400 s。ob_trx_idle_timeout:事务空闲超时时间,单位 us,默认值 86400 s。
设置超时时间
超时时间的设置方法如下:
在会话/全局进行变量设置。示例如下:
obclient> SET ob_query_timeout = 10000000; Query OK, 0 rows affected obclient> SET GLOBAL ob_query_timeout = 10000000; Query OK, 0 rows affected在 JDBC 连接串中设置。示例如下:
jdbc:oceanbase://10.1.0.0:1001/unittests?user=**u**@sys&password=***1**&sessionVariables = ob_query_timeout = 60000000000,ob_trx_timeout = 60000000000&xxxx在 SQL 级别添加 Hint 设置。示例如下:
说明
此方式只对当前 SQL 语句生效。
SELECT /*+query_timeout(100000000) */ c1 FROM t1;




