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

OB 导数工具旁路导入实践

204

概述

OB 正常的数据写入路径会经过 SQL 解析、执行,写增量内存MEMTABLE,然后转储或合并到数据文件。OceanBase 还提供一种旁路写入路径,直接绕过 SQL 接口和增量内存,而是直接写入到数据文件中。旁路写入主要用在 OBKV、数据旁路导入场景中,相比常规写入路径链路更多,所以性能吞吐更好。在前面文章《OB 4.3 列存表使用体验》演示了使用 OB SQL 的 load data local 命令在客户端直接将文件通过旁路导入方法导入到 OB 数据库中。在 OB 4.2 版本里使用 OB 导数工具 obloader 也可以通过旁路导入方法快速将文件数据导入到 OB 4.2 实例中。不过这个方法有一些前提条件,本文主要是总结这个使用实践经验。


旁路导入原理

旁路导入的数据导入部分不是连接 OBServer 的 SQL 端口(默认2881)而是连接 RPC端口(默认 2882)。obloader 如果绕过 ODP 而直连 OBServer 的时候,通过额外指定 RPC 端口是可以实现旁路导入。这个使用不难,但是生产中不推荐客户端绕过 ODP 。因为原本业务数据的主副本位置对应用客户端是透明的(客户端不需要知道数据在哪个 OBServer 节点上,ODP 会负责 SQL 路由)。直连 OBServer 旁路写入数据,如果主副本不在这个节点,估计会产生跨机事务。

所以,这里分享的主要是 obloader 通过 ODP 连接 OB 实现旁路导入。ODP 默认连接端口 2883 也是 SQL 连接端口,在 4.1.3 版本推出了新的 RPC 端口(默认 2885)。这个功能在后面 4.1,4.2 序列没有再兼容,而是在 4.3.0 版本开始再次放出。ODP 4.1.3 我不想再用了,所以这次测试使用的是 ODP 4.3.0 版本。尽管 OB 集群是 4.2.1 版本,ODP 用 4.3.0 版本也是兼容的。为了隔离业务风险,这个 ODP 4.3.0 版本只给导数据的业务使用。


ODP 4.3.0 版本

ODP 4.3.0 版本跟 RPC 端口有关的信息如下。

    [root@server065 ~]# su - admin
    Last login: Tue Jul 16 17:09:50 CST 2024 on pts/1
    [admin@server065 ~]$ cd obproxy/
    [admin@server065 obproxy]$ bin/obproxy -V
    bin/obproxy -V
    obproxy (OceanBase 4.3.0.0 662024052217)
    REVISION: 1-local-ce722fff6fe682e411bc66df1206fe338300b224
    BUILD_TIME: May 22 2024 18:04:53
    BUILD_FLAGS: -g -O2 -D_OB_VERSION=1000 -D_NO_EXCEPTION -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS -DNDEBUG -D__USE_LARGEFILE64 -D_FILE_OFFSET_BITS=64 -D_LARGE_FILE -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -Wall -Wextra -Wunused-parameter -Wformat -Wconversion -Wno-deprecated -Wno-invalid-offsetof -finline-functions -fno-strict-aliasing -mtune=core2 -Wno-psabi -Wno-sign-compare -Wno-class-memaccess -Wno-deprecated-copy -Wno-ignored-qualifiers -Wno-aligned-new -Wno-format-truncation -Wno-literal-suffix -Wno-format-overflow -Wno-stringop-truncation -Wno-memset-elt-size -Wno-cast-function-type -Wno-address-of-packed-member -fno-omit-frame-pointer -Wl,-z,noexecstack,-z,relro,-z,now,-z,notext -fPIC -isystem home/jenkins/agent/workspace/rpm-obproxy-4.3.0.0-1.1.21/ob_source_code_dir/obproxy-tmp.147/BUILD/obproxy-4.3.0.0/deps/3rd/usr/local/oceanbase/deps/devel/include -isystem home/jenkins/agent/workspace/rpm-obproxy-4.3.0.0-1.1.21/ob_source_code_dir/obproxy-tmp.147/BUILD/obproxy-4.3.0.0/deps/3rd/usr/local/babassl-ob/include -isystem home/jenkins/agent/workspace/rpm-obproxy-4.3.0.0-1.1.21/ob_source_code_dir/obproxy-tmp.147/BUILD/obproxy-4.3.0.0/deps/3rd/usr/include -L/home/jenkins/agent/workspace/rpm-obproxy-4.3.0.0-1.1.21/ob_source_code_dir/obproxy-tmp.147/BUILD/obproxy-4.3.0.0/deps/3rd/usr/local/oceanbase/deps/devel/lib:/home/jenkins/agent/workspace/rpm-obproxy-4.3.0.0-1.1.21/ob_source_code_dir/obproxy-tmp.147/BUILD/obproxy-4.3.0.0/deps/3rd/usr/local/babassl-ob/lib -DGCC_52 -DSUPPORT_SSE4_2 -DHAVE_SCHED_GETCPU -DHAVE_REALTIME_COARSE -DOB_HAVE_EVENTFD -DHAVE_FALLOCATE -Werror


    Copyright (c) 2007-2020 Alipay Inc.
    [admin@server065 obproxy]$ bin/obproxy -h
    bin/obproxy -h
    ----------------------------------------------------------------------------------
    obproxy [OPTIONS]
    -h,--help print this help
    -p,--listen_port LPORT obproxy listen port
    -l,--promethues_listen_port PLPORT obproxy prometheus listen port
    -s,--rpc_listen_port PLPORT obproxy rpc service listen port
    -o,--optstr OPTSTR extra options string
    -n,--appname APPNAME application name
    -r,--rs_list RS_LIST root server list(format ip:sql_prot)
    -c,--cluster_name CLUSTER_NAME root server cluster name
    -d,--dump_config_sql DSQL dump config sql to file
    -e,--execute_config_sql ESQL exectue config sql(create tables, insert initial data)
    -N,--nodaemon don't run in daemon
    -V,--version VERSION current obproxy version
    -R,--releaseid RELEASEID current obproxy kernel release id
    -t,--regression_test TEST_NAME regression test




    复制

    ODP 启动成功后,会多了一个监听端口 2885 。

      [admin@server065 obproxy]$ netstat -ntlp |grep obproxy
      (Not all processes could be identified, non-owned process info
      will not be shown, you would have to be root to see it all.)
      tcp 0 0 0.0.0.0:2883 0.0.0.0:* LISTEN 41219/obproxy
      tcp 0 0 0.0.0.0:2884 0.0.0.0:* LISTEN 41219/obproxy
      tcp 0 0 0.0.0.0:2885 0.0.0.0:* LISTEN 41219/obproxy
      复制

      测试方法说明

      测试表是 TPC-H 中的最大的表 LINEITEM ,数据规模 scale 是 4 。文件信息如下,总记录数 23996604  。

        [root@server063 ob-loader-dumper-4.3.1-RELEASE]# ls -lrth data/1/tpch/s4/bak/LINEITEM.*
        -rwxr-xr-x 1 admin admin 325M Jul 16 11:48 data/1/tpch/s4/bak/LINEITEM.1.csv
        -rwxr-xr-x 1 admin admin 326M Jul 16 11:48 data/1/tpch/s4/bak/LINEITEM.2.csv
        -rwxr-xr-x 1 admin admin 326M Jul 16 11:48 data/1/tpch/s4/bak/LINEITEM.3.csv
        -rwxr-xr-x 1 admin admin 327M Jul 16 11:48 data/1/tpch/s4/bak/LINEITEM.4.csv
        -rwxr-xr-x 1 admin admin 328M Jul 16 11:49 data/1/tpch/s4/bak/LINEITEM.5.csv
        -rwxr-xr-x 1 admin admin 329M Jul 16 11:49 /data/1/tpch/s4/bak/LINEITEM.6.csv
        -rwxr-xr-x 1 admin admin 329M Jul 16 11:49 /data/1/tpch/s4/bak/LINEITEM.7.csv
        -rwxr-xr-x 1 admin admin 329M Jul 16 11:49 /data/1/tpch/s4/bak/LINEITEM.8.csv
        -rwxr-xr-x 1 admin admin 329M Jul 16 11:49 /data/1/tpch/s4/bak/LINEITEM.9.csv
        复制

        表结构如下:

          CREATE TABLE "LINEITEM" (
          "L_ORDERKEY" NUMBER(*,0) NOT NULL ENABLE,
          "L_PARTKEY" NUMBER(*,0) NOT NULL ENABLE,
          "L_SUPPKEY" NUMBER(*,0) NOT NULL ENABLE,
          "L_LINENUMBER" NUMBER(*,0) NOT NULL ENABLE,
          "L_QUANTITY" NUMBER(*,0),
          "L_EXTENDEDPRICE" NUMBER(*,0),
          "L_DISCOUNT" NUMBER(*,0),
          "L_TAX" NUMBER(*,0),
          "L_RETURNFLAG" CHAR(3),
          "L_LINESTATUS" CHAR(3),
          "L_SHIPDATE" DATE,
          "L_COMMITDATE" DATE,
          "L_RECEIPTDATE" DATE,
          "L_SHIPINSTRUCT" CHAR(25),
          "L_SHIPMODE" CHAR(10),
          "L_COMMENT" VARCHAR2(44),
          "L_EXT_1" VARCHAR2(100),
          PRIMARY KEY ("L_ORDERKEY", "L_LINENUMBER")
          ) PARTITION BY HASH(L_ORDERKEY) PARTITIONS 16
          ;
          复制

          数据库租户资源 4C7G ,MEMTABLE 内存比例 50%,转储参数比例 70%,写限速比例 90% 。

          obloader 版本 4.3.1 ,测试分别使用旁路导入和不使用旁路导入。导入命令如下,同时导入 9 个数据文件。参数 --direct 是开启旁路导入,--parallel 是 OBServer 的并行设置,用于旁路导入,--thread 是 obloader 客户端的并行设置,--rpc-port 是目标的 RPC 端口(直连 OBServer 就是 2882,连接 ODP 就是 2885)。

            bin/obloader -h 10.0.0.65 -P 2883 -u TPCH -t oboracle -c OB4216 -p abcABC123 --sys-password aaAA11__ -D TPCH --table LINEITEM --external-data --csv -f /data/1/tpch/s4/bak/   --truncate-table --column-separator='|' --thread 16 --rpc-port=2885 --direct --parallel=16


            bin/obloader -h 10.0.0.65 -P 2883 -u TPCH -t oboracle -c OB4216 -p abcABC123 --sys-password aaAA11__ -D TPCH --table LINEITEM --external-data --csv -f /data/1/tpch/s4/bak/ --truncate-table --column-separator='|' --thread 16
            复制
            开始时间
            结束时间
            总耗时(分钟)
            备注
            2024-07-18 17:30:432024-07-18 17:34:343.833旁路导入
            2024-07-18 17:43:232024-07-18 17:49:035.664非旁路导入

            从上面旁路导入性能提升约 32.3% 左右。当然这里是由于数据量和租户的资源规格都很小。如果是 百G 级别的数据导入,几亿的数据量级,加上更大的租户资源规格,性能还可以提升的更高。


            旁路导入性能监控

            下面在简单对比一下旁路导入和非旁路导入时 OB 租户的一些性能指标。

            旁路导入数据不经过 MEMTABLE,所以观察 MEMTABLE 不会有写入量的变化。但是这并不表示旁路导入的数据不经过 OB 内存。实际上它会占用 OB KVCache 的内存,当内存不足的时候还会用到临时数据文件(从 BLOCK FILE 中分配)。这个临时空间推测是未经压缩的(至少不是 zstd 压缩),加上还要做一些数据排序操作,旁路导入时产生的临时空间消耗可能会很大导致 block file 文件块用尽,然后报错:server out of disk 。这不是说磁盘文件满了,而是 OB 数据文件内部使用空间满了。在 OB 4.2 版本里数据文件初始大小看参数 datafile_size,可以自动扩展,每次扩展大小看 datafile_nextsize,最大大小看 datafile_maxsize。可以设置这三个参数来预防空间暴涨问题(注意默认设置不会自动扩展数据文件)。

            旁路导入期间(中后期)的数据 IO 吞吐也会比较大,可能导致 IO 延时变大,进而对正常的业务读写性能有一些影响。所以,客户端也要控制住 obloader 的并发参数,导入的力度不能大的超出了租户的可接受范围。


            obloader 是优秀的 OB 导数工具,不过有些功能初次使用看文档后还是要摸索一阵子。使用多了会积累一些经验。

            比如说连接 ORACLE 租户的时候,用户名必须大写,数据库名也必须大写,否则就连接不上。不同版本之间可能有些小的兼容性问题。业务需要充分的测试,稳定后不要轻易的更换版本。当 obdumper 和 obloader 搭配使用的时候,尽量使用同一个版本。此外,旁路导入连接 OB 也不要使用 F5或A10或其他软负载的 VIP,因为那个后端端口都是 ODP 的2883 。大批量的数据导入也不建议经过负载均衡设备(浪费设备网络吞吐)。


            其他参考:

            文章转载自数据库技术闲谈,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

            评论