暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

「OceanBase 4.1 体验」:极致的导入神器-旁路导入

原创 fkp926 2023-05-12
2750

「OceanBase 4.1 体验」:极致的导入神器-旁路导入

image.png

概述

常见的数据库都提供标准的导入功能,例如使用命令行工具,内置SQL命令或图形用户界面导入CSV文件或其他格式的数据。但是当面对大量数据处理时,标准导入的效率就显得不够高了。标准导入的请求执行路径几乎一致,从客户端接收到数据,SQL 层进行数据解析,容错处理,路由分发,事务封装最后再进程存储持久化,瓶颈点很明显:1)一行一行数据进行,2)SQL 层过滤解析,3)CLOG 日志量大,非常耗时低效。

同时,OceanBase(OB)的存储引擎是基于LSM(Log-Structured Merge Tree)的。它将LSM树划分为三层,第一层是MemTable,第二层是增量层(也称转储层,即LSM树C0层),第三层是基线层(即LSM树C1层)。在日常批量导入时,由于新增数据是写入内存MemTable的,有利于数据插入。但如果导入并发度控制不当,就会因为内存释放速度比不上新增速度导致租户内存不足的告警,增加运维成本,对OB稳定性也有威胁。

image.png
LSM 存储架构图
早期版本的OB 0.4已经有了旁路导入功能,但需要借助hadoop大数据平台对数据进行清理,架构和配置非常复杂。在OceanBase 4.1版本中,重新引入了旁路导入功能,并直接嵌入到SQL命令中。所谓旁路导入简单来说就是越过通用的执行路径,直接将数据按照目标端的数据格式写入到目标端的底层存储中。将这个功能应用到OB上,就是让数据绕过SQL引擎和事务引擎,直接按照存储引擎的格式生成持久化的数据,写入SSTable,通过定制流程优化导入数据的效率。同时这一过程中,内存使用量非常低,能够减轻内存不足的压力。当然高效导入的同时也必然带来各自的限制约束。

SQL命令

目前 OceanBase 数据库支持以下语句进行旁路导入:

LOAD /*+ direct parallel(N)*/ DATA INSERT /*+ append enable_parallel_dml parallel(N) */ INTO  table_name select_sentence

测试内容

分别用标准导入和旁路导入在对规格为**(8vCPU,16GB 内存)租户对 LINEITEM 表(7.3GB,约6千万行)**进行数据导入测试对比。

特别说明:

  1. LINEITEM 是TPC-H测试模型中一张表,用TPCH工具生成10G的数据量,包含7.3G的LINEITEM数据。具体数据生成过程和表结构 可参考《OceanBase 数据库 TPC-H 测试》 https://www.oceanbase.com/docs/common-oceanbase-database-cn-0000000001953497

  2. LOAD DATA 语句仅支持加载 OBServer 节点本地的输入文件。因此,用户需要在导入之前将文件拷贝到某台 OBServer 节点上。并对文件路径进行赋权

    1、登录到要连接 OBServer 节点所在的机器。将导入数据复制到自定义目录下,如/home/admin
      obclient -h *** -P2881 -uroot@tpch -p****** -c -A -D testdb2
    2、设置导入的文件路径。
      obclient [(testdb2)]> SET GLOBAL secure_file_priv = “/home/admin”;
      Query OK, 0 rows affected

  3. 旁路导入能力当前仅支持 CSV 格式数据文件

使用 LOAD DATA 语句旁路导入数据

使用须知

  • 导入过程中会加表锁。会影响联机交易,特别注意。

  • 不支持在触发器(Trigger)使用。

  • 支持 lob 类型,但是性能比较差,lob 会走原来事务写入数据的路径。

  • 不能在多行事务中运行。

基本语法

1、使用 APPEND Hint 启用旁路导入功能。 LOAD DATA /*+ PARALLEL(4) APPEND */ INFILE 'file_name' ... 参数解释 PARALLEL(N) 加载数据的并行度,N 默认为 4。 APPEND 使用 Hint 启用旁路导入功能,即支持直接在数据文件中分配空间并写入数据。APPEND Hint 默认等同于使用的 direct(false, 0),同时可以实现在线收集统计信息(GATHER\_OPTIMIZER\_STATISTICS Hint)的功能。 2、使用 direct(bool, int) Hint 启用旁路导入功能。 LOAD DATA /*+ direct(need_sort,max_error) PARALLEL(N) */ INFILE 'file_name' ... 参数解释: direct 表示走旁路导入。 need\_sort 表示是否需要 OceanBase 数据库对数据进行排序。true:表示需要排序。false:表示不需要排序。 max\_error 表示最大的容忍的错误的行数。值为 INT 类型,超过这个数值LOAD DATA 会报失败。 PARALLEL(N) 加载数据的并行度,N 默认为 4

本次测试案例中使用使用 direct(bool, int) Hint 启用旁路导入功能

1、旁路导入命令 LOAD DATA /*+ direct(flase,0) PARALLEL(4) */ INFILE '/home/admin/tpch/lineitem.tbl' into table lineitem fields by '|' ; 2、标准导入命令 LOAD DATA /*+ PARALLEL(4) */ INFILE '/home/admin/tpch/lineitem.tbl' into table lineitem fields by '|' ;

使用 INSERT INTO SELECT 语句旁路导入数据

使用须知

  • 只支持 PDML(Parallel Data Manipulation Language,并行数据操纵语言),非 PDML 不能用旁路导入。

  • 导入过程中会加表锁。会影响联机交易,特别注意。

  • 不支持在触发器(Trigger)使用。

  • 支持 lob 类型,但是性能比较差,lob 会走原来事务写入数据的路径。

  • 不能在多行事务中运行。

基本语法

INSERT /*+ append enable_parallel_dml parallel(N) */ INTO  table_name select_sentence 参数解释: append 表示走旁路导入。 enable_parallel_dml parallel(N) 加载数据的并行度,N 默认为 4。一般情况下,enable_parallel_dml Hint 和 parallel Hint 必须配合使用才能开启并行 DML。不过,当目标表的 Schema 上指定了表级别的并行度时,仅需指定 enable_parallel_dml Hint。

测试结果

在规格为 (8vCPU,16GB 内存) 租户下,分别用标准导入和旁路导入方式对LINEITEM 表 (7.3GB,约6千万行) 进行数据导入测试对比。** 为避免操作之间互相影响,每次执行导入命令前对环境数据进行清理并手动发起合并**。结果如下

结果统计

column1 旁路导入 标准导入
LOAD DATA 6 min 3.950 sec 27min 58.564 sec
INSERT INTO SELECT 8min 27.754 sec 59min 36.865 sec

结果分析

结果显而易见,旁路导入在加载数据场景性能提升数倍。其中LOAD DATA场景约5倍,INSERT INTO SELECT场景约7倍

其中,标准导入时,通过观察OCP性能监控,发现MEMStore使用百分比波动频繁,内存在不断占用释放,租户在不断的触发内存转储;租户事务日志数,事务日志量、事务锁等待次数也趋于高水位。基于标准导入的原理,资源占用情况符合预期。结合OBSERVER日志和SQL_AUDIT表,也能看到标准的LOAD DATA就是把数据改写成普通的INSERT INTO语句进行批量插入。

总结、建议

1、旁路导入时,可以通过GV$SESSION_LONGOPS查看导入进度,OPNAME为direct load ,有执行耗时,详见的备注信息,但TIME_REMAING字段当前好像没生效。标准导入方式则没有监控手段。

2、因为OB的旁路导入方式是通过加HINT方式,所以mysql或obclient命令行连接OB时,一定要加 -c 参数,否则数据库无法识别HINT。

3、旁路导入会把所有的已有的数据都写一遍。如果原表的数据比较大,导入的数据比较少,可能不适合使用旁路导入。

4、因为LOAD DATA 本质上是导入本地文件,但由于 OceanBase 是分布式数据库,各个分区的数据可能分布在各个不同的 OBServer 节点,LOAD DATA 会对解析出来的数据进行计算,决定数据需要被发送到哪个 OBServer 节点。所以为了达到最佳性能,建议导入表的主副本和文件在同一个节点上,避免出现远程或分布式执行计划影响。

5、旁路导入分两个阶段load写入和merge合并阶段。所以如果针对load和merge阶段相关参数进行调优的话,相信旁路导入性能还会进一步提升。这一点希望官方能提供4.x版本数据移植时参数优化意见,目前看来4.x和3.2.3版本内核参数还是很大调整的,不少参数已经找不到了。

6、希望旁路导入场景进一步丰富,限制进一步解除。比如OMS ,OB导数工具,备份恢复等场景。

最后修改时间:2023-05-26 14:45:11
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论