隔离和非隔离模式

用 C++ 编程语言编写的用户定义扩展 (UDx) 可以选择在隔离或非隔离模式下运行。隔离模式在一个单独的 zygote 进程中运行主 Vertica 进程之外的 UDx 代码。使用非隔离模式的 UDx 直接在 Vertica 进程中运行。

隔离模式

您可以在隔离模式下运行大多数 C++ UDx。隔离模式使用单独的 zygote 进程,因此隔离的 UDx 崩溃不会影响核心 Vertica 进程。在隔离模式下运行 UDx 代码时,将造成轻微影响。平均来说,使用隔离模式会使执行时间比非隔离模式增加大约 10%。

目前,所有 C++ UDx(用户定义的聚合除外)都可以使用隔离模式。使用 Python、R 和 Java 编程语言开发的所有 UDx 都必须在隔离模式下运行,因为 Python、R 和 Java 运行时无法直接在 Vertica 进程中运行。

使用隔离模式不会影响 UDx 的开发。对于支持隔离模式的 UDx,默认启用隔离模式。或者,您可以发出带有 NOT FENCED 修饰符的 CREATE FUNCTION 命令来禁用该函数的隔离模式。此外,您可以使用 ALTER FUNCTION 命令在任何支持隔离模式的 C++ UDx 上启用或禁用隔离模式。

非隔离模式

非隔离 UDx 在 Vertica 中运行,因此它们的开销很小,并且执行速度几乎与 Vertica 自有的内置函数一样快。但是,由于它们直接在 Vertica 中运行,因此其代码中的任何缺陷(例如内存泄漏)会导致 Vertica 主进程不稳定,从而关闭一个或多个数据库节点。

关于 zygote 进程

Vertica zygote 进程随 Vertica 一起启动。每个节点具有单个 zygote 进程。从属进程是“按需”创建的。zygote 会侦听请求,并在用户调用 UDx 时生成 UDx 端会话(在隔离模式下运行 UDx)。

关于隔离模式日志记录:

在隔离模式下运行的 UDx 代码记录在 UDxZygote.log 中,并存储在 Vertica 编录目录中的 UDxLogs 目录中。从属进程的日志条目用 UDx 语言(例如 C++)、节点以及 zygote 进程 ID 和 UDxSideProcess ID 表示。

例如,对于以下查询,将返回当前隔离的进程:

=> SELECT * FROM UDX_FENCED_PROCESSES;
    node_name     |   process_type   |            session_id            |  pid  | port  | status
------------------+------------------+----------------------------------+-------+-------+--------
 v_vmart_node0001 | UDxZygoteProcess |                                  | 27468 | 51900 | UP
 v_vmart_node0001 | UDxSideProcess   | localhost.localdoma-27465:0x800b |  5677 | 44123 | UP

以下是上一个查询中返回的隔离进程的相应日志文件:

2016-05-16 11:24:43.990 [C++-localhost.localdoma-27465:0x800b-5677]  0x2b3ff17e7fd0 UDx side process started
 11:24:43.996 [C++-localhost.localdoma-27465:0x800b-5677]  0x2b3ff17e7fd0 Finished setting up signal handlers.
 11:24:43.996 [C++-localhost.localdoma-27465:0x800b-5677]  0x2b3ff17e7fd0 My port: 44123
 11:24:43.996 [C++-localhost.localdoma-27465:0x800b-5677]  0x2b3ff17e7fd0 My address: 0.0.0.0
 11:24:43.996 [C++-localhost.localdoma-27465:0x800b-5677]  0x2b3ff17e7fd0 Vertica port: 51900
 11:24:43.996 [C++-localhost.localdoma-27465:0x800b-5677]  0x2b3ff17e7fd0 Vertica address: 127.0.0.1
 11:25:19.749 [C++-localhost.localdoma-27465:0x800b-5677]  0x41837940 Setting memory resource limit to -1
 11:30:11.523 [C++-localhost.localdoma-27465:0x800b-5677]  0x41837940 Exiting UDx side process

最后一行指示从属进程已终止。在此示例中,该从属进程在用户会话 (vsql) 关闭时终止。

关于隔离模式配置参数

隔离模式支持以下配置参数

  • FencedUDxMemoryLimitMB:用于隔离模式进程的最大内存大小(以 MB 为单位)。默认值为 -1(无限制)。当超过此限制时,将终止从属进程。

  • ForceUDxFencedMode:如果将此参数设置为 1,将强制所有支持隔离模式的 UDx 在隔离模式下运行,即使其定义指定了 NOT FENCED 也如此。默认值为 0(禁用)。

  • UDxFencedBlockTimeout:Vertica 服务器在因 ERROR 3399 中止之前等待 UDx 返回的最长时间(以秒为单位)。默认值为 60

另请参阅