编程

Docker 安装 ManticoreSearch

1288 2024-01-21 04:32:00

Docker 安装 Manticore Search 

Manticore Search 的 Docker 镜像可以在 Docker Hub 上公开获取,它来自于 Manticore Search docker GitHub 仓库。

要检索 Manticore 镜像,请运行如下命令:

docker pull manticoresearch/manticore

在 Docker 中启动并使用 Manticore

该镜像基于 Manticore 包的当前发行版。

默认配置包含示例实时表,并监听默认端口:

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

镜像附带了一些库,用于轻松索引 MySQL、PostgreSQL、XML 和 CSV 文件中的数据。

运行 Manticore Search 的 Docker 镜像

快速使用

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

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

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

该镜像附带一个示例表,可以按如下方式加载:

mysql> source /sandbox.sql

此外,mysql 客户端的历史记录中有几个示例查询,你可以在上表中运行,只需使用客户端中的 Up/Down 键即可查看并运行它们

生产使用

端口及挂载点

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

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

SQL/HTTP/Binary 的端口是 9306/9308/9312,根据将如何使用 Manticore 来公开它们。例如:

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

或者

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 Columnar Library 和 Manticore Buddy

Manticore Search Docker 镜像没有预装 Manticore Columnar 库,如果您需要列式存储和辅助索引,这是必要的。不过,通过将设置环境变量 EXTRA=1 可以在运行时轻松启用。比如,docker run -e EXTRA=1 ... manticoresearch/manticore。这将在 data 目录(生产环境中通常映射到数据卷)中下载并安装该库,并且之后不会重新下载除非 Manticore Search 版本更新。

使用 EXTRA=1 同时也会激活 Manticore Buddy,它用于处理特定命令。

如果你只需要 MCL(Manticore Columnar Library),可以设置环境变量 MCL=1

Docker-compose

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

version: '2.2'

services:
  manticore:
    container_name: manticore
    image: manticoresearch/manticore
    environment:
      - EXTRA=1
    restart: always
    ports:
      - 127.0.0.1:9306:9306
      - 127.0.0.1:9308:9308
    ulimits:
      nproc: 65535
      nofile:
         soft: 65535
         hard: 65535
      memlock:
        soft: -1
        hard: -1
    volumes:
      - ./data:/var/lib/manticore
#      - ./manticore.conf:/etc/manticoresearch/manticore.conf # uncomment if you use a custom config

除了使用暴露的端口 9306 和 9308,你可以运行 docker-compose exec manticore mysql 登录到实例中

HTTP 协议

HTTP 协议暴露于端口 9308。你可以本机映射并使用 curl 连接该端口:

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

创建表格:

POST /cli -d 'CREATE TABLE testrt ( title text, content text, gid integer)'

插入文档(document):

POST /insert
-d'{"index":"testrt","id":1,"doc":{"title":"Hello","content":"world","gid":1}}'

执行简单搜索:

POST /search -d '{"index":"testrt","query":{"match":{"*":"hello world"}}}'

日志

默认情况下,服务器将日志发送到 /dev/stdout,可以在主机上使用如下命令查看:

docker logs manticore

通过传递变量 QUERY_LOG_TO_STDOUT=true 可以将查询日志转到 Docker 日志中。 

具有复制功能的多节点集群

这是定义两个节点的集群的简单 docker-compose.yml

version: '2.2'

services:

  manticore-1:
    image: manticoresearch/manticore
    environment:
      - EXTRA=1
    restart: always
    ulimits:
      nproc: 65535
      nofile:
         soft: 65535
         hard: 65535
      memlock:
        soft: -1
        hard: -1
    networks:
      - manticore
  manticore-2:
    image: manticoresearch/manticore
    environment:
      - EXTRA=1
    restart: always
    ulimits:
      nproc: 65535
      nofile:
        soft: 65535
        hard: 65535
      memlock:
        soft: -1
        hard: -1
    networks:
      - manticore
networks:
  manticore:
    driver: bridge

启动:docker-compose up

新建一个集群:

$ docker-compose exec manticore-1 mysql

mysql> CREATE TABLE testrt ( title text, content text, gid integer);

mysql> CREATE CLUSTER posts;
Query OK, 0 rows affected (0.24 sec)

mysql> ALTER CLUSTER posts ADD testrt;
Query OK, 0 rows affected (0.07 sec)

MySQL [(none)]> exit
Bye

在第二个实例中加入到该集群

$ docker-compose exec manticore-2 mysql

mysql> JOIN CLUSTER posts AT 'manticore-1:9312';
mysql> INSERT INTO posts:testrt(title,content,gid)  VALUES('hello','world',1);
Query OK, 1 row affected (0.00 sec)

MySQL [(none)]> exit
Bye

第一个实例,你可以看到新记录:

$ docker-compose exec manticore-1 mysql

MySQL [(none)]> select * from testrt;
+---------------------+------+-------+---------+
| id                  | gid  | title | content |
+---------------------+------+-------+---------+
| 3891565839006040065 |    1 | hello | world   |
+---------------------+------+-------+---------+
1 row in set (0.00 sec)

MySQL [(none)]> exit
Bye

内存锁定及限制

建议重写 Manticore 实例的 docke r默认 ulimits:

 --ulimit nofile=65536:65536

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

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

使用 Docker 配置 Manticore Search

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

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 创建,搜索守护进程将无权打开它们。例如,以下是如何旋转所有表:

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

你也可以通过 Docker 环境变量单独设置 searchdcommon 配置项。

这些设置必须使用它们的 section 名作为前缀,对于 mysql_version_string 的示例,变量必须命名为 searchd_mysql_version_string

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' 将在端口 9370 中额外添加一个 SQL 接口、仅在实例 IP 上运行的端口 5443 中添加一个 SQL VIP 监听器,并且在端口 9316 中添加一个 HTTP 监听器,此外还将分别在 9306 和 9308上 添加默认值。

$ 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
[Mon Aug 17 07:31:58.719 2020] [1] using config file '/etc/manticoresearch/manticore.conf' (9130 chars)...
listening on all interfaces for http, port=9316
listening on all interfaces for mysql, port=9307
listening on 172.17.0.17:5443 for VIP mysql
listening on all interfaces for mysql, port=9306
listening on UNIX socket /var/run/mysqld/mysqld.sock
listening on 172.17.0.17:9312 for sphinx
listening on all interfaces for http, port=9308
prereading 0 indexes
prereaded 0 indexes in 0.000 sec
accepting connections

启动标志

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

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

在非根用户下运行

默认情况下,主 Manticore 进程 searchd 是在容器内的用户 manticore 下运行的,但启动容器时运行的脚本是在默认的 docker 用户(在大多数情况下是 root 用户)下运行的。如果这不是你想要的,你可以在 docker compose 的 yaml 文件中使用 docker ... --user manticoreuser: manticore ,使一切都在 manticore 用户下运行。请阅读以下内容,了解您可能遇到的卷权限问题以及如何解决。

启动时创建普通表

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

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 compose yaml 中使用 docker ... --user manticoreuser: manticore),您可能会面临权限问题,例如:

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

或者假如你使用了 -e EXTRA=1:

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

之所以会发生这种情况,是因为用于在容器内运行进程的用户可能无权修改已装载到容器中的目录。要修复它,您可以 chownchmod 挂载的目录。如果你在用户 manticore 下运行容器,则需要执行以下操作:

chown -R 999:999 data

用户 manticore 在容器内的d ID 是 999。