安装 manticore

你可以在各种操作系统上轻松安装和启动 Manticore,包括 Ubuntu、CentOS、Debian、Windows 和 MacOS。此外,你还可以将 Manticore 作为 Docker 容器使用。

连接到 manticore

默认情况下,Manticore 在以下端口等待连接:

  • 用于 MySQL 客户端的端口为 9306
  • 用于 HTTP/HTTPS 连接的端口为 9308
  • 用于其他 Manticore 节点和基于 Manticore 二进制 API 的客户端的端口为 9312

HTTP 是一种无状态协议,因此不需要任何特殊的连接阶段。你可以简单地向服务器发送 HTTP 请求并接收响应。要使用 HTTP 接口与 Manticore 进行通信,你可以使用你选择的编程语言中的任何 HTTP 客户端库,以发送 GET 或 POST 请求到服务器并解析 JSON 响应:

curl -s "http://localhost:9308/search"

SQL

mysql -h0 -P9306

php

  1. // https://github.com/manticoresoftware/manticoresearch-php
  2. require_once __DIR__ . '/vendor/autoload.php';
  3. $config = ['host'=>'127.0.0.1','port'=>9308];
  4. $client = new \Manticoresearch\Client($config);

创建数据表

现在让我们创建一个名为 “products” 的表,包含两个字段:

  1. title - 全文字段,将包含我们产品的标题
  2. price - 类型为 “float”

请注意,可以省略使用显式的 create 语句创建表。有关更多信息,请参阅“Auto schema”(自动模式)的相关内容。

添加文档

现在让我们向表中添加一些文档:

SQL

  1. insert into products(title,price) values ('Crossbody Bag with Tassel', 19.85), ('microfiber sheet set', 19.99), ('Pet Hair Remover Glove', 7.99);

HTTP

  1. POST /cli -d "create table products(title text, price float) morphology='stem_en'"

搜索

现在让我们查找其中一个文档。我们将使用的查询是 ‘remove hair’。正如你所看到的,它找到了一个标题为 ‘Pet Hair Remover Glove’ 的文档,并在其中突出显示了 ‘Hair remover’,尽管查询中是 “remove” 而不是 “remover”。这是因为在创建表时,我们启用了使用英语词干处理(morphology “stem_en”)。

sql

  1. select id, highlight(), price from products where match('remove hair');

JSON

  1. curl -sX POST http://localhost:9308/search -d '
  2. {
  3. "index": "products",
  4. "query": { "match": { "title": "remove hair" } },
  5. "highlight":
  6. {
  7. "fields": ["title"]
  8. }
  9. }'

PHP

  1. $result = $index->search('@title remove hair')->highlight(['title'])->get();
  2. foreach($result as $doc)
  3. {
  4. echo "Doc ID: ".$doc->getId()."\n";
  5. echo "Doc Score: ".$doc->getScore()."\n";
  6. echo "Document fields:\n";
  7. print_r($doc->getData());
  8. echo "Highlights: \n";
  9. print_r($doc->getHighlight());
  10. }

更新

假设我们现在想要更新文档 - 将价格更改为 18.5。这可以通过按任何字段进行过滤来完成,但通常你会知道文档的 ID 并基于此进行更新。

sql

  1. update products set price=18.5 where id = 1513686608316989452;

JSON

  1. curl -sX POST http://localhost:9308/update -d '
  2. {
  3. "index": "products",
  4. "id": 1513686608316989452,
  5. "doc":
  6. {
  7. "price": 18.5
  8. }
  9. }'

PHP

  1. $doc = [
  2. 'body' => [
  3. 'index' => 'products',
  4. 'id' => 2,
  5. 'doc' => [
  6. 'price' => 18.5
  7. ]
  8. ]
  9. ];
  10. $response = $client->update($doc);

删除

现在让我们删除所有价格低于 10 的文档。

sql

  1. delete from products where price < 10;

JSON

  1. curl -sX POST http://localhost:9308/delete -d '
  2. {
  3. "index": "products",
  4. "query":
  5. {
  6. "range":
  7. {
  8. "price":
  9. {
  10. "lte": 10
  11. }
  12. }
  13. }
  14. }'

PHP

  1. $result = $index->deleteDocuments(new \Manticoresearch\Query\Range('price',['lte'=>10]));

启动服务

Manticore Search 服务器可以使用不同的方法启动,具体取决于安装类型。

在 Linux 中启动 Manticore Search:

当使用 DEB 或 RPM 包安装 Manticore Search 时,searchd 进程可以由操作系统的 init 系统运行和管理。大多数 Linux 版本现在使用 systemd,而旧版使用 SysV init。

要检查平台使用的 init 系统,请运行以下命令:

  1. ps --no-headers -o comm 1

这将显示运行为 init 进程的进程名称,可用于确定正在使用的 init 系统。

使用 systemd 启动和停止:

安装后,Manticore Search 服务不会自动启动。要启动 Manticore,请运行以下命令:

  1. sudo systemctl start manticore

要停止 Manticore,请运行以下命令:

  1. sudo systemctl stop manticore

Manticore 服务被设置为在启动时运行。可以通过运行以下命令进行检查:

  1. sudo systemctl is-enabled manticore

如果要在启动时禁用 Manticore,请运行:

  1. sudo systemctl disable manticore

要使 Manticore 在启动时运行,请运行:

  1. sudo systemctl enable manticore

searchd 进程会将启动信息记录在 systemd journal 中。如果启用了 systemd 记录,可以使用以下命令查看已记录的信息:

  1. sudo journalctl -u manticore

使用 systemd 自定义启动标志:

通过 systemctl set-environment _ADDITIONAL_SEARCHD_PARAMS,你可以指定 Manticore Search 守护程序应该使用的自定义启动标志。查看完整列表请参阅此处。

例如,要使用调试日志级别启动 Manticore,可以运行:

  1. sudo systemctl set-environment _ADDITIONAL_SEARCHD_PARAMS='--logdebug'
  2. sudo systemctl restart manticore

要撤消它,运行:

  1. sudo systemctl set-environment _ADDITIONAL_SEARCHD_PARAMS=''
  2. sudo systemctl restart manticore

请注意,systemd 环境变量在服务器重新启动时会被重置。

使用 service 启动和停止:

可以使用 service 命令启动和停止 Manticore:

  1. sudo service manticore start
  2. sudo service manticore stop

在 RedHat 系统上启用 sysV 服务启动,运行:

  1. chkconfig manticore on

在 Debian 系统上(包括 Ubuntu)启用 sysV 服务启动,运行:

  1. update-rc.d manticore defaults

请注意,searchd 是由 init 系统在 manticore 用户下启动的,服务器创建的所有文件都将属于该用户。如果 searchd 是在例如 root 用户下启动的,则文件权限将更改,这可能会导致再次将 searchd 作为服务运行时出现问题。

手动启动 Manticore:

你还可以直接调用 searchd(Manticore Search 服务器二进制文件)来启动 Manticore Search:

  1. searchd [OPTIONS]

请注意,如果没有指定配置文件的路径,searchd 将根据操作系统在多个位置查找配置文件。

searchd 命令行选项:

在所有操作系统中,searchd 可用的选项包括:

  • --help(简写为 -h)列出在特定构建中可以使用的所有参数。
  • --version(简写为 -v)显示 Manticore Search 版本信息。
  • --config <file>(简写为 -c <file>)告诉 searchd 使用指定的文件作为其配置。
  • --stop 用于异步停止 searchd,使用 Manticore 配置文件中指定的 PID 文件的详细信息。因此,您可能还需要使用 --config 选项向 searchd 确认要使用哪个配置文件。示例:

    1. $ searchd --config /etc/manticoresearch/manticore.conf --stop
  • --stopwait 用于同步停止 searchd。--stop 本质上告诉运行的实例退出(通过发送 SIGTERM),然后立即返回。--stopwait 还将尝试等待运行中的 searchd 实例实际完成关闭(例如,保存所有待处理的属性更改)并退出。示例:

    1. $ searchd --config /etc/manticoresearch/manticore.conf --stopwait

    可能的退出代码如下:

  • 0 表示成功

  • 1 表示连接到运行中的 searchd 服务器失败
  • 2 表示服务器在关闭期间报告了错误
  • 3 表示服务器在关闭期间崩溃

--status 命令用于使用(可选)提供的配置文件中的连接详细信息查询运行中的 searchd 实例状态。它将尝试使用配置文件中找到的第一个 UNIX socket 或 TCP 端口连接到运行中的实例。成功后,它将查询一些状态和性能计数器的值并打印出来。你还可以使用 SQL 协议通过 SHOW STATUS 命令访问相同的计数器。示例:

  1. $ searchd --status
  2. $ searchd --config /etc/manticoresearch/manticore.conf --status

以下是一些与 Manticore Search 服务器启动相关的命令行选项:

  • --pidfile 用于强制使用 PID 文件(存储 searchd 进程标识号), 尽管其他调试选项可能表示不使用(例如,--console)。这是一个调试选项。示例:

    1. $ searchd --console --pidfile
  • --console 用于强制 searchd 进入控制台模式。通常,Manticore 作为常规服务器应用程序运行,并将信息记录到日志文件中(如配置文件中指定的)。然而,在调试配置或服务器本身的问题,或尝试诊断难以追踪的问题时,将其强制转储信息直接到调用它的控制台/命令行可能更容易。在控制台模式下运行还意味着不会分叉进程(因此搜索是按顺序进行的),并且不会写入日志。(应注意,控制台模式不是运行 searchd 的预期方法。)示例:

    1. $ searchd --config /etc/manticoresearch/manticore.conf --console
  • --logdebug--logreplication--logdebugv--logdebugvv 选项在服务器日志中启用附加的调试输出。它们通过日志详细程度的不同来区分。这些都是调试选项,通常不应启用,因为它们可能会大量污染日志。它们可以在需要时临时启用,以协助复杂的调试会话。

  • --iostats 与日志选项一起使用(manticore.conf 中必须激活 query_log),以在查询期间更详细地提供有关进行的输入/输出操作的每个查询的信息,会有轻微的性能损失和稍大一些的日志。IO 统计信息不包括有关属性的 IO 操作的信息,因为这些是使用 mmap 加载的。要启用它,可以如下启动 searchd:

    1. $ searchd --config /etc/manticoresearch/manticore.conf --iostats
  • --cpustats 用于提供实际的 CPU 时间报告(除了墙上时间之外),同时在查询日志文件(对于每个给定的查询)和状态报告(聚合)中使用。它依赖于 Linux 系统调用 clock_gettime() 或在某些系统上回退到不太精确的调用。可以像这样启动 searchd:

    1. $ searchd --config /etc/manticoresearch/manticore.conf --cpustats
  • --port portnumber(简写为 -p)用于指定 Manticore 监听的端口,以接受二进制协议请求,通常用于调试目的。这通常默认为 9312,但有时需要在不同的端口上运行它。在命令行中指定将覆盖配置文件中指定的任何内容。有效范围是 0 到 65535,但通常需要特权帐户才能运行编号为 1024 及以下的端口。

以下是一些与 Manticore Search 服务器启动相关的其他命令行选项:

  • --listen(简写为 -l)用于指定 searchd 将侦听的地址、端口或路径。它允许您指定 searchd 将在其上侦听的完整路径、IP 地址和端口,或 Unix 域套接字路径。您可以仅指定 IP 地址(或主机名)和端口号,仅指定端口号,或指定 Unix 套接字路径。如果指定了端口号但没有地址,searchd 将侦听所有网络接口。Unix 路径由前导斜杠标识。作为最后一个参数,您还可以指定要在此套接字上使用的协议处理程序(监听器)。支持的协议值有 ‘sphinx’ 和 ‘mysql’(自 4.1 版本以来使用的 MySQL 协议)。

    1. $ searchd --port 9313
  • --force-preread 禁止服务器在预读表文件完成之前服务任何传入连接。默认情况下,服务器在启动时接受连接,同时将表文件惰性加载到内存中。此选项扩展了该行为,并使其等待文件加载完毕。

  • --index--table<table>(或简写为 -i-t<table>)强制此 searchd 实例仅为指定的表提供服务。与上述 --port 一样,这通常是为了调试目的;更长期的更改通常会应用于配置文件本身。

    1. $ searchd --index products
  • --strip-path 从表引用的所有文件名(停用词、词形变换、异常等)中剥离路径名。这对于使用可能具有不同路径布局的另一台机器构建的表非常有用。

  • --replay-flags=<OPTIONS> 开关可用于指定额外的二进制日志重放选项列表。支持的选项有:

    • accept-desc-timestamp,忽略降序事务时间戳并无论如何重放这些事务(默认行为是出错时退出)。
    • ignore-open-errors,忽略缺少的 binlog 文件(默认行为是在出错时退出)。
    • ignore-trx-errors,忽略任何事务错误并跳过当前的 binlog 文件(默认行为是在出错时退出)。
    • ignore-all-errors,忽略上述任何错误(默认行为是在出错时退出)。
    1. $ searchd --replay-flags=accept-desc-timestamp
  • --coredump 用于在崩溃时启用保存服务器的核心文件或 minidump。默认情况下禁用以加快服务器在崩溃时的重新启动速度。这对于调试目的很有用。

    1. $ searchd --config /etc/manticoresearch/manticore.conf --coredump
  • --new-cluster 用于引导复制集群并使服务器成为带有集群重新启动保护的参考节点。在 Linux 上,您还可以运行 manticore_new_cluster。它将通过 systemd 以 --new-cluster 模式启动 Manticore。

  • --new-cluster-force 引导复制集群并使服务器成为绕过集群重新启动保护的参考节点。在 Linux 上,您还可以运行 manticore_new_cluster --force。它将通过 systemd 以 --new-cluster-force 模式启动 Manticore。

请注意,这些选项的使用可能受到不同版本和配置的影响。在使用这些选项时,请参阅 Manticore Search 的文档以获取详细信息。

windows 选项

以下是一些特定于 Windows 平台的 searchd 选项,用于处理服务,仅在 Windows 二进制文件中可用:

  • --install 将 searchd 安装为服务到 Microsoft Management Console(控制面板 / 管理工具 / 服务)。命令行中指定 --install 的任何其他参数也将成为未来启动服务时命令行的一部分。例如,作为调用 searchd 的一部分,您可能还需要使用 --config 指定配置文件,并且您将以及指定 --install。一旦调用,通常的启动/停止设施将通过管理控制台变得可用,因此您可以使用任何用于启动、停止和重新启动服务的方法来操作 searchd。示例:

    1. C:\WINDOWS\system32> C:\Manticore\bin\searchd.exe --install
    2. --config C:\Manticore\manticore.conf
  • --delete 从 Microsoft Management Console 和其他服务注册的地方删除服务,之前使用 --install 安装过。请注意,这不会卸载软件或删除表。这意味着服务将不会从服务系统调用,并且将不会在计算机的下一次启动时启动。如果当前正在作为服务运行,则当前实例将不会被终止(直到下一次重新启动或直到 --stop)。如果使用 --servicename 安装服务(自定义名称),则在调用卸载时需要指定相同的名称。示例:

    1. C:\WINDOWS\system32> C:\Manticore\bin\searchd.exe --delete
  • --servicename <name> 在安装或删除服务时将给定的名称应用于 searchd,该名称将出现在管理控制台中;默认为 searchd,但如果在可能有多个管理员登录到系统的服务器上部署,或者有多个 searchd 实例的系统上,可能适用于更具描述性的名称。请注意,除非与 --install--delete 结合使用,否则此选项不会执行任何操作。示例:

    1. C:\WINDOWS\system32> C:\Manticore\bin\searchd.exe --install
    2. --config C:\Manticore\manticore.conf --servicename ManticoreSearch
  • --ntservice 是一个由 Microsoft Management Console 传递给 searchd 的选项,在 Windows 平台上将其作为服务调用。通常情况下,不需要直接调用这个选项;通常在启动服务时由 Windows 调用,尽管在理论上,如果您想要从命令行(作为 --console 的补充)直接调用这个常规服务,也可以这样做。

  • --safetrace 强制 searchd 仅在崩溃报告中使用系统的 backtrace() 调用。在某些(罕见)情况下,这可能是获得该报告的“安全”方式。这是一个调试选项。

  • --nodetach 开关(仅限 Linux)告诉 searchd 不要分离到后台。这也将导致日志条目打印到控制台。查询处理正常运行。这是一个调试选项,当您在 Docker 容器中运行 Manticore 以捕获其输出时可能也很有用。

插件目录

Manticore 使用 plugin_dir 存储和使用 Manticore Buddy 插件。默认情况下,该值在标准安装中对 “manticore” 用户可访问。然而,如果您手动使用不同用户启动 searchd 守护程序,它可能无法访问 plugin_dir。为解决此问题,请确保在通用部分指定一个用户可以写入 searchd 守护程序的 plugin_dir。

信号

searchd 支持多个信号:

  • SIGTERM:启动干净的关闭。不会处理新查询,但已经启动的查询不会被强制中断。
  • SIGHUP:启动表的轮换。根据 seamless_rotate 设置的值,新查询可能会短暂停滞;客户端将收到临时错误。
  • SIGUSR1:强制重新打开 searchd 日志和查询日志文件,允许进行日志文件轮换。

环境变量

MANTICORE_TRACK_DAEMON_SHUTDOWN=1 启用详细记录,当 searchd 正在关闭时。在某些关闭问题(例如 Manticore 关闭时间过长或在关闭过程中冻结)的情况下很有用。

在 Docker 中启动和使用 Manticore

该镜像基于 Manticore 软件包的当前版本。

默认配置包括一个示例的实时表,并监听默认端口:

  • 9306 用于从 MySQL 客户端连接
  • 9308 用于通过 HTTP 连接
  • 9312 用于通过二进制协议连接(例如在运行集群的情况下)

该镜像附带了用于轻松索引数据的库,包括从 MySQL、PostgreSQL、XML 和 CSV 文件中索引数据的功能。

如何运行 Manticore Search Docker 镜像

快速使用:

以下是在容器中启动 Manticore 并通过 mysql 客户端登录的最简单方法:

  1. docker run -e EXTRA=1 --name manticore --rm -d manticoresearch/manticore && \
  2. echo "Waiting for Manticore docker to start. Consider mapping the data_dir to make it start faster next time" && \
  3. until docker logs manticore 2>&1 | grep -q "accepting connections"; do sleep 1; echo -n .; done && \
  4. echo && docker exec -it manticore mysql && docker stop manticore

请注意,退出 MySQL 客户端后,Manticore 容器将停止并删除,导致数据未被保存。有关在生产环境中使用 Manticore 的信息,请参见下文。

该镜像附带一个可以像这样加载的示例表:

  1. mysql> source /sandbox.sql

此外,mysql 客户端的历史记录中还有几个示例查询,您可以在客户端中使用上/下键查看并运行它们。

生产使用:

端口和挂载点

为了进行数据持久化,应将文件夹 /var/lib/manticore/ 挂载到本地存储或其他所需的存储引擎。

实例内的配置文件位于 /etc/manticoresearch/manticore.conf。对于自定义设置,应将此文件挂载到您自己的配置文件。

端口为 9306/9308/9312 用于 SQL/HTTP/二进制,根据您打算如何使用 Manticore,选择性地暴露它们。例如:

  1. docker run -e EXTRA=1 --name manticore -v $(pwd)/data:/var/lib/manticore -p 127.0.0.1:9306:9306 -p 127.0.0.1:9308:9308 -d manticoresearch/manticore

  1. docker run -e EXTRA=1 --name manticore -v $(pwd)/manticore.conf:/etc/manticoresearch/manticore.conf -v $(pwd)/data:/var/lib/manticore/ -p 127.0.0.1:9306:9306 -p 127.0.0.1:9308:9308 -d manticoresearch/manticore

如果希望端口对外部主机可用,请确保删除 127.0.0.1:。

Manticore 列式库和 Manticore Buddy

Manticore Search Docker 镜像不预安装 Manticore 列式库,如果需要列式存储和辅助索引,则需要安装它。但是,可以在运行时通过设置环境变量 EXTRA=1 轻松启用它。例如,docker run -e EXTRA=1 … manticoresearch/manticore。这将在数据目录中下载并安装库(通常在生产环境中映射为卷),并且除非 Manticore Search 版本更改,否则不会重新下载。

使用 EXTRA=1 还会激活 Manticore Buddy,用于处理某些命令。有关更多信息,请参阅更新日志。

如果只需要 MCL,则可以使用环境变量 MCL=1。

Docker-compose

在许多情况下,您可能希望将 Manticore 与 Docker Compose YAML 文件中指定的其他镜像一起使用。以下是在 docker-compose.yml 文件中的 Manticore Search 的最小推荐配置:

  1. version: '2.2'
  2. services:
  3. manticore:
  4. container_name: manticore
  5. image: manticoresearch/manticore
  6. environment:
  7. - EXTRA=1
  8. restart: always
  9. ports:
  10. - 127.0.0.1:9306:9306
  11. - 127.0.0.1:9308:9308
  12. ulimits:
  13. nproc: 65535
  14. nofile:
  15. soft: 65535
  16. hard: 65535
  17. memlock:
  18. soft: -1
  19. hard: -1
  20. volumes:
  21. - ./data:/var/lib/manticore
  22. # - ./manticore.conf:/etc/manticoresearch/manticore.conf # 如果使用自定义配置,请取消注释

除了使用暴露的端口 9306 和 9308 外,您还可以通过运行 docker-compose exec manticore mysql 来登录到实例。

HTTP 协议

HTTP 协议在端口 9308 上公开。您可以将该端口映射到本地,并使用 curl 进行连接:

  1. docker run -e EXTRA=1 --name manticore -p 9308:9308 -d manticoresearch/manticore

创建一个 table

  1. curl -sX POST http://localhost:9308/cli -d 'CREATE TABLE testrt ( title text, content text, gid integer)'

插入文档

  1. curl -sX POST http://localhost:9308/insert
  2. -d'{"index":"testrt","id":1,"doc":{"title":"Hello","content":"world","gid":1}}'

进行搜索

  1. curl -sX POST http://localhost:9308/search -d ' {"index":"testrt","query":{"match":{"*":"hello world"}}}'

Logging

默认情况下,服务器设置为将其日志发送到 /dev/stdout,可以从主机上查看:

  1. docker logs manticore

可以通过传递变量 QUERY_LOG_TO_STDOUT=true 将查询日志重定向到 Docker 日志。

多节点具有复制的集群

以下是定义包含两个节点集群的简单 docker-compose.yml 文件:

  1. version: '2.2'
  2. services:
  3. manticore-1:
  4. image: manticoresearch/manticore
  5. environment:
  6. - EXTRA=1
  7. restart: always
  8. ulimits:
  9. nproc: 65535
  10. nofile:
  11. soft: 65535
  12. hard: 65535
  13. memlock:
  14. soft: -1
  15. hard: -1
  16. networks:
  17. - manticore
  18. manticore-2:
  19. image: manticoresearch/manticore
  20. environment:
  21. - EXTRA=1
  22. restart: always
  23. ulimits:
  24. nproc: 65535
  25. nofile:
  26. soft: 65535
  27. hard: 65535
  28. memlock:
  29. soft: -1
  30. hard: -1
  31. networks:
  32. - manticore
  33. networks:
  34. manticore:
  35. driver: bridge

启动: docker-compose up

创建集群:

  1. docker-compose exec manticore-1 mysql
  1. mysql> CREATE TABLE testrt ( title text, content text, gid integer);
  2. mysql> CREATE CLUSTER posts;
  3. Query OK, 0 rows affected (0.24 sec)
  4. mysql> ALTER CLUSTER posts ADD testrt;
  5. Query OK, 0 rows affected (0.07 sec)
  6. mysql> exit

在第二台实例上加入集群:

  1. docker-compose exec manticore-2 mysql
  1. mysql> JOIN CLUSTER posts AT 'manticore-1:9312';
  2. mysql> INSERT INTO posts:testrt(title,content,gid) VALUES('hello','world',1);
  3. Query OK, 1 row affected (0.00 sec)
  4. mysql> exit

回到第一台实例上, 能看到新的记录:

  1. docker-compose exec manticore-1 mysql
  1. MySQL [(none)]> select * from testrt;
  2. +---------------------+------+-------+---------+
  3. | id | gid | title | content |
  4. +---------------------+------+-------+---------+
  5. | 3891565839006040065 | 1 | hello | world |
  6. +---------------------+------+-------+---------+
  7. 1 row in set (0.00 sec)
  8. MySQL [(none)]> exit

内存锁定和限制

建议覆盖 Docker 对 Manticore 实例的默认 ulimits:

  1. --ulimit nofile=65536:65536

为了获得最佳性能,表组件可以被 “mlocked” 到内存中。当在 Docker 中运行 Manticore 时,实例需要额外的特权以允许内存锁定。在运行实例时,必须添加以下选项:

  1. --cap-add=IPC_LOCK --ulimit memlock=-1:-1

使用 Docker 配置 Manticore Search

如果你想使用包含表定义的自定义配置运行 Manticore,你需要将配置挂载到实例上:

  1. docker run -e EXTRA=1 --name manticore -v $(pwd)/manticore.conf:/etc/manticoresearch/manticore.conf -v $(pwd)/data/:/var/lib/manticore -p 127.0.0.1:9306:9306 -d manticoresearch/manticore

请注意,在容器内运行的 Manticore Search 是在 manticore 用户下运行的。执行与表文件相关的操作(如创建或轮换普通表)也应该在 manticore 用户下执行。否则,文件将以 root 用户的身份创建,搜索守护程序将无权打开它们。例如,以下是如何轮换所有表的示例:

  1. docker exec -it manticore gosu manticore indexer --all --rotate

你还可以使用 Docker 环境变量设置单独的 searchd 和 common 配置设置。

这些设置必须以它们的部分名称为前缀,例如,对于 mysql_version_string,变量必须命名为 searchd_mysql_version_string:

  1. docker run -e EXTRA=1 --name manticore -p 127.0.0.1:9306:9306 -e searchd_mysql_version_string='5.5.0' -d manticoresearch/manticore

在 listen 指令的情况下,使用 Docker 变量 searchd_listen 可以添加新的监听接口。多个接口可以用分号(“|”)分隔。要仅在网络地址上侦听,可以使用 $ip(从 hostname -i 内部检索)作为地址别名。

例如 -e searchd_listen='9316:http|9307:mysql|$ip:5443:mysql_vip' 将在端口 9307 上添加一个额外的 SQL 接口,端口 5443 上仅在实例的 IP 上运行的 SQL VIP 监听器,以及端口 9316 上的 HTTP 监听器,除了默认的 9306 和 9308,分别。

  1. $ docker run -e EXTRA=1 --rm -p 1188:9307 -e searchd_mysql_version_string='5.5.0' -e searchd_listen='9316:http|9307:mysql|$ip:5443:mysql_vip' manticore
  2. [Mon Aug 17 07:31:58.719 2020] [1] using config file '/etc/manticoresearch/manticore.conf' (9130 chars)...
  3. listening on all interfaces for http, port=9316
  4. listening on all interfaces for mysql, port=9307
  5. listening on 172.17.0.17:5443 for VIP mysql
  6. listening on all interfaces for mysql, port=9306
  7. listening on UNIX socket /var/run/mysqld/mysqld.sock
  8. listening on 172.17.0.17:9312 for sphinx
  9. listening on all interfaces for http, port=9308
  10. prereading 0 indexes
  11. prereaded 0 indexes in 0.000 sec
  12. accepting connections

启动标志

要使用自定义启动标志启动 Manticore,请在使用 docker run 时将它们指定为参数。确保不包括 searchd 命令并包括 --nodetach 标志。以下是一个示例:

  1. docker run -e EXTRA=1 --name manticore --rm manticoresearch/manticore:latest --replay-flags=ignore-trx-errors --nodetach

在非 root 用户下运行

默认情况下,Manticore 主进程 searchd 在容器内以用户 manticore 的身份运行,但在启动容器时运行的脚本是以默认的 docker 用户(在大多数情况下为 root)的身份运行的。如果这不是你想要的,你可以使用 docker ... --user manticore 或在 Docker Compose YAML 中使用 user: manticore,使所有内容都在 manticore 用户下运行。请阅读下面关于可能的卷权限问题以及如何解决的信息。

在启动时创建普通表

要构建在自定义配置文件中指定的普通表,可以使用 CREATE_PLAIN_TABLES=1 环境变量。它将在 Manticore 启动之前执行 indexer --all。如果你不使用卷,并且可以轻松重新创建表,这将非常有用。

  1. docker run -e CREATE_PLAIN_TABLES=1 --name manticore -v $(pwd)/manticore.conf:/etc/manticoresearch/manticore.conf -p 9306:9306 -p 9308:9308 -d manticoresearch/manticore

故障排除

挂载卷的权限问题

如果你在非根用户下运行 Manticore Search Docker(使用 docker ... --user manticore 或在 Docker Compose YAML 中使用 user: manticore),可能会遇到权限问题,例如:

  1. FATAL: directory /var/lib/manticore write error: failed to open /var/lib/manticore/tmp: Permission denied

或者在使用 -e EXTRA=1 的情况下:

  1. mkdir: cannot create directory ‘/var/lib/manticore/.mcl/’: Permission denied

这可能是因为在容器内运行进程的用户可能没有权限修改你挂载到容器的目录。为了解决这个问题,你可以使用 chownchmod 修改挂载的目录。如果你在用户 manticore 下运行容器,你需要执行:

  1. chown -R 999:999 data

因为在容器内,用户 manticore 的用户 ID 是 999。