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

概述
常见的数据库都提供标准的导入功能,例如使用命令行工具,内置SQL命令或图形用户界面导入CSV文件或其他格式的数据。但是当面对大量数据处理时,标准导入的效率就显得不够高了。标准导入的请求执行路径几乎一致,从客户端接收到数据,SQL 层进行数据解析,容错处理,路由分发,事务封装最后再进程存储持久化,瓶颈点很明显:1)一行一行数据进行,2)SQL 层过滤解析,3)CLOG 日志量大,非常耗时低效。
同时,OceanBase(OB)的存储引擎是基于LSM(Log-Structured Merge Tree)的。它将LSM树划分为三层,第一层是MemTable,第二层是增量层(也称转储层,即LSM树C0层),第三层是基线层(即LSM树C1层)。在日常批量导入时,由于新增数据是写入内存MemTable的,有利于数据插入。但如果导入并发度控制不当,就会因为内存释放速度比不上新增速度导致租户内存不足的告警,增加运维成本,对OB稳定性也有威胁。

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千万行)**进行数据导入测试对比。
特别说明:
-
LINEITEM 是TPC-H测试模型中一张表,用TPCH工具生成10G的数据量,包含7.3G的LINEITEM数据。具体数据生成过程和表结构 可参考《OceanBase 数据库 TPC-H 测试》 https://www.oceanbase.com/docs/common-oceanbase-database-cn-0000000001953497
-
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 -
旁路导入能力当前仅支持 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导数工具,备份恢复等场景。




