3.12. 查询服务器

3.12.1. 查询服务器定义

在版本 2.3 中更改: 更改了查询服务器和原生查询服务器的配置方法。

CouchDB 将 设计文档 函数的计算委托给外部查询服务器。外部查询服务器是一个特殊的 OS 进程,它通过标准输入/输出使用非常简单的基于行的协议与 JSON 消息进行通信。

可以使用以下模式的環境變數定義外部查詢伺服器

COUCHDB_QUERY_SERVER_LANGUAGE="PATH ARGS"

其中

  • LANGUAGE: 是此查询服务器可能执行的代码的编程语言。例如,在野外有 PYTHONRUBYCLOJURE 等查询服务器。此值以小写形式也用于 ddoc 字段 language 来确定哪个查询服务器处理函数。

    请注意,您可以为同一编程语言设置多个查询服务器,但必须为它们命名不同的名称(例如 PYTHONDEV 等)。

  • PATH: 是运行查询服务器的可执行二进制程序的系统路径。

  • ARGS: 可选地,您可以为可执行文件 PATH 指定其他命令行参数。

默认的查询服务器是用 JavaScript 编写的,通过 Mozilla SpiderMonkey 运行。它不需要特殊的环境设置来启用,但等效于以下两个变量

COUCHDB_QUERY_SERVER_JAVASCRIPT="/opt/couchdb/bin/couchjs /opt/couchdb/share/server/main.js"
COUCHDB_QUERY_SERVER_COFFEESCRIPT="/opt/couchdb/bin/couchjs /opt/couchdb/share/server/main-coffee.js"

默认情况下,couchjs 将最大运行时分配限制为 64MiB。如果您在 ddoc 函数中遇到内存不足问题,您可以调整内存限制(此处,增加到 512 MiB)

COUCHDB_QUERY_SERVER_JAVASCRIPT="/usr/bin/couchjs -S 536870912 /usr/share/server/main.js"

有关可用选项的更多信息,请参阅 couchjs -h

注意

CouchDB 版本 3.0.0 到 3.2.2 包含针对自定义 reduce 函数的性能回归。CouchDB 3.3.0 及更高版本附带了一个实验性修复,该修复包含在单独的 .js 文件中。

要启用此修复,您需要定义一个自定义的 COUCHDB_QUERY_SERVER_JAVASCRIPT 环境变量,如上所述。couchjs 的路径需要保持与您在 couchdb 文件中找到的路径相同,并且 main.js 的路径需要设置为 /path/to/couchdb/share/server/main-ast-bypass.js

在 Linux 系统上的默认安装中,这将是 COUCHDB_QUERY_SERVER_JAVASCRIPT="/opt/couchdb/bin/couchjs /opt/couchdb/share/server/main-ast-bypass.js"

另请参阅

Mango 查询服务器 是一种声明式语言,不需要编程,允许更轻松地索引和查找文档中的数据。

原生 Erlang 查询服务器 允许以原生方式运行用 Erlang 编写的 ddocs,绕过 stdio 通信和 JSON 序列化/反序列化往返开销。

3.12.2. 查询服务器配置

[query_server_config]
commit_freq

指定将视图索引更改提交到磁盘之前的延迟时间(以秒为单位)。默认值为 5

[query_server_config]
commit_freq = 5
os_process_limit

查询服务器可用的 OS 进程数量的硬限制。默认值为 100

[query_server_config]
os_process_limit = 100

os_process_limit 设置得太低会导致查询服务器饥饿,并表现为 os_process_timeout 错误,而将其设置得太高可能会使用过多的系统资源。生产环境设置通常是默认值的 10-20 倍。

os_process_soft_limit

查询服务器可用的 OS 进程数量的软限制。默认值为 100

[query_server_config]
os_process_soft_limit = 100

空闲的 OS 进程将被关闭,直到总数达到软限制。

例如,如果硬限制为 200,软限制为 100,则 OS 进程的总数永远不会超过 200,CouchDB 将关闭所有空闲的 OS 进程,直到它达到 100,此时它将保留其余进程,即使其中一些是空闲的。

reduce_limit

控制 Reduce 溢出 错误,该错误在 reduce 函数 的输出过大时引发

[query_server_config]
reduce_limit = true

通常,您不必禁用(通过设置 false 值)此选项,因为 reduce 函数的主要目的是减少输入。

3.12.3. 原生 Erlang 查询服务器

[native_query_servers]

警告

由于安全限制,Erlang 查询服务器默认情况下处于禁用状态。

与 JavaScript 查询服务器不同,Erlang 查询服务器不会在沙箱模式下运行。这意味着 Erlang 代码可以完全访问您的 OS、文件系统和网络,这可能会导致安全问题。虽然 Erlang 函数比 JavaScript 函数更快,但您需要谨慎运行它们,尤其是那些由其他人编写的函数。

CouchDB 具有一个原生 Erlang 查询服务器,允许您用 Erlang 编写 map/reduce 函数。

首先,您需要编辑您的 local.ini 以包含一个 [native_query_servers] 部分

[native_query_servers]
enable_erlang_query_server = true

要查看这些更改,您还需要重新启动服务器。

让我们尝试一个 map/reduce 函数的示例,该函数计算每个修订版本数量的总文档数(有 x 个文档在版本“1”处,有 y 个文档在“2”处……等等)。向数据库添加一些文档,然后将以下函数作为视图输入

%% Map Function
fun({Doc}) ->
    <<K,_/binary>> = proplists:get_value(<<"_rev">>, Doc, null),
    V = proplists:get_value(<<"_id">>, Doc, null),
    Emit(<<K>>, V)
end.

%% Reduce Function
fun(Keys, Values, ReReduce) -> length(Values) end.

如果一切顺利,在运行视图后,您应该会看到每个修订版本数量的总文档数列表。

其他示例可在 [email protected] 邮件列表 上找到。

3.12.5. Mango

Mango 是为 _find 端点提供服务的查询引擎。

[mango]
index_all_disabled

设置为 true 以禁用“索引所有字段”文本索引。当存在具有嵌套数组字段的文档时,这会导致内存不足问题。默认值为 false

[mango]
index_all_disabled = false
default_limit

设置将在 _find 响应中返回的默认结果数。单个请求可以通过在查询参数中直接设置 limit 来覆盖此设置。默认值为 25

[mango]
default_limit = 25
index_scan_warning_threshold

这将设置扫描的文档与匹配的结果之间的比率,该比率将在 _find 响应中生成警告。例如,如果查询需要读取 100 个文档才能返回 10 行,则如果此值为 10,则会生成警告。

默认值为 10。将值设置为 0 将禁用警告。

[mango]
index_scan_warning_threshold = 10