隔离和非隔离模式
用 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
。