3.12. 查询服务器

3.12.1. 查询服务器定义

在 2.3 版更改: 已更改查询服务器和本机查询服务器的配置方法。

CouchDB委托计算 design documents 函数到外部查询服务器。外部查询服务器是一个特殊的操作系统进程,它通过标准输入/输出与CouchDB进行通信,使用一个非常简单的基于行的协议和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 .

参见

这个 Mango Query Server 是一种需要 无编程 ,可以更轻松地索引和查找文档中的数据。

这个 Native Erlang Query Server 允许运行 ddocs 本机用Erlang编写,绕过stdio通信和JSON序列化/反序列化往返开销。

3.12.2. 查询服务器配置

[query_server_config]
commit_freq

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

[query_server_config]
commit_freq = 5
os_process_limit
limit

对查询服务器可用的操作系统进程数的硬限制。默认值为 100 ::

[query_server_config]
os_process_limit = 100

设置 os_process_limit 太低可能会导致查询服务器耗尽,并在 os_process_timeout 错误,但将其设置得过高可能会占用过多的系统资源。生产设置通常是默认值的10-20倍。

os_process_soft_limit
soft limit

对查询服务器可用的操作系统进程数的软限制。默认值为 100 ::

[query_server_config]
os_process_soft_limit = 100

空闲操作系统进程将关闭,直到总数达到软限制。

例如,如果硬限制为200,软限制为100,则操作系统进程的总数永远不会超过200,CouchDB将关闭所有空闲的操作系统进程,直到达到100,此时它将保持其余进程不变,即使有些进程处于空闲状态。

reduce_limit

控制 Reduce overflow 当该输出引发错误时 reduce functions 太大了:

[query_server_config]
reduce_limit = true

通常,您不必禁用(通过设置 false 值)此选项自主提议 reduce 功能是 减少 输入。

3.12.3. 本地Erlang查询服务器

[native_query_servers]

警告

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

与沙盒模式不同,JavaScript在沙盒模式下不运行。这意味着Erlang代码可以完全访问您的操作系统、文件系统和网络,这可能会导致安全问题。虽然Erlang函数比JavaScript函数快,但是在运行它们时需要小心,尤其是当它们是由其他人编写的时候。

CouchDB有一个本地Erlang查询服务器,允许您在Erlang中编写map/reduce函数。

首先,您需要编辑 local.ini 包括 [native_query_servers] 章节:

[native_query_servers]
enable_erlang_query_server = true

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

让我们尝试一个map/reduce函数的例子,它统计每个修订的文档总数(版本“1”有x多个文档,“2”有y个文档。。。等等)。向数据库中添加一些文档,然后输入以下函数作为视图:

%% 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.

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

其他示例在 users@couchdb.apache.org mailing list .

3.12.5. 芒果

Mango是为 _find ,终结点。

[mango]
index_all_disabled

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

[芒果] 索引_all_disabled=false
default_limit

设置将在 _find 回应。单个请求可以通过设置 limit 直接在查询参数中。默认为 25 .

[芒果] 默认限制=25
index_scan_warning_threshold
index scan warning

这将设置扫描的文档与匹配的结果之间的比率,该比率将在“查找”响应中生成警告。例如,如果一个查询需要读取100个文档以返回10行,那么如果该值为 10 .

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

[芒果] 索引扫描警告阈值=10