Manticore Search 29.9.0 配置参数详解
Manticore Search 29.9.0 配置参数详解:逐项实测 searchd 段核心参数(listen/log/rt_flush_period/net_workers/max_threads_per_query 等)、表级参数、环境变量覆盖机制,给出默认值、修改方式、重启生效与验证命令及废弃参数排障。
Manticore Search 29.9.0 配置参数详解
目标:把 Manticore Search 29.9.0 的配置拆成「searchd 服务段」「表级参数」「环境变量覆盖」三类,逐项给出默认值、作用、修改方式与验证命令。文中所有回显均为本机实测(Ubuntu 24.04、Docker 29.9.2、Compose v5.6.1、Manticore Search 29.9.0),取材日期 2026-10-25;部署流程见《Manticore Search 29.9.0 Docker Compose 部署指南》,产品定位见《Manticore Search 29.9.0 介绍与选型指南》。
一、环境信息
- 应用版本:Manticore Search
29.9.0,内核 C++,Buddy v4.4.3 - 对外端口:9306(SphinxQL)、9308(HTTP JSON)、9312(二进制 API)
- 配置入口:
/etc/manticoresearch/manticore.conf(searchd段)、建表语句中的表级参数、searchd_*前缀环境变量 - 生效方式:配置文件改动需重启
searchd;表级参数在建表/改表时生效;环境变量在启动时注入 - 实测基线:单实例、RT 表
products(含 title text、price float、category int)、数据目录/var/lib/manticore
本文每个参数都按「改值 → 重启 → 用状态/查询回显验证」的方式实测。
二、配置体系总览
Manticore Search 的配置分成三层,职责不同:
| 层 | 位置 | 管什么 | 生效时机 |
|---|---|---|---|
| 服务段配置 | manticore.conf 的 searchd {} 段 | 监听端口、日志路径、线程模型、网络参数、刷新周期 | searchd 启动时读取;改完需重启 |
| 表级参数 | 建表语句中的字段类型与 table_options | 字段是否索引/存储、分词器、列存、KNN 参数 | 建表/ALTER TABLE 时生效 |
| 环境变量 | searchd_* 前缀的环境变量 | 覆盖 searchd 段同名键 | 启动时由官方启动脚本注入 |
💡 技术拓展:为什么 Manticore 用配置文件 + SQL 双入口? 传统 Sphinx 全部配置写在
sphinx.conf(表结构、数据源、服务参数全在一起),改表结构要重启。Manticore 把表结构移到 SQL(CREATE TABLE),配置文件只管服务级参数,改表无需重启。这是 Manticore 相对 Sphinx 的关键改进之一。
三、searchd 段核心参数
3.1 listen(监听端口)
默认值:无默认值,必填。至少声明一个监听端口。
格式:listen = [IP:]端口[:协议],协议可选 mysql41(SphinxQL)、http、sphinx(二进制 API)、replication(集群复制)。
实测配置:
listen = 9306:mysql41
listen = 9308:http
listen = 9312:sphinx
验证:启动后查看端口监听与状态:
ss -ltn | grep -E ':9306|:9308|:9312'
实测回显:
LISTEN 0 4096 0.0.0.0:9306 0.0.0.0:*
LISTEN 0 4096 0.0.0.0:9308 0.0.0.0:*
LISTEN 0 4096 0.0.0.0:9312 0.0.0.0:*
结论:三个端口按声明的协议监听。不写 IP 默认监听所有接口(0.0.0.0)。
3.2 log / query_log(日志路径)
默认值:log 无默认值(不写则输出到 stderr);query_log 默认不记录查询。
实测配置:
log = /var/log/manticore/searchd.log
query_log = /var/log/manticore/query.log
验证:执行一条查询后查看 query.log:
curl -s "http://127.0.0.1:9308/sql" --data-urlencode "query=SELECT id FROM products WHERE MATCH('search')" > /dev/null
cat /var/log/manticore/query.log | tail -1
实测回显:
/* Sun Oct 25 12:07:56.465 2026 conn 576 (10.89.60.1:40348) real 0.000 wall 0.000 found 6 */ SELECT id FROM products WHERE MATCH('search');
结论:query_log 记录每条查询的连接来源、耗时(real/wall)、匹配文档数与原始 SQL,是慢查询分析的主要依据。
3.3 mysql_version_string(SphinxQL 协议版本号)
默认值:5.6.30。
作用:向 MySQL 客户端报告的服务器版本号。部分 MySQL 客户端(尤其是 8.x)会校验服务器版本,版本过低会拒绝连接。
实测配置:
mysql_version_string = 8.0.30
验证:
curl -s "http://127.0.0.1:9308/cli" -d "SHOW STATUS LIKE 'mysql_version'"
实测回显:
+---------------+--------+
| Counter | Value |
+---------------+--------+
| mysql_version | 8.0.30 |
+---------------+--------+
结论:设为 8.0.30 后,新版 MySQL 客户端可正常连接。旧版本客户端连接失败时,优先检查此参数。
3.4 rt_flush_period(RT 表刷盘周期)
默认值:10(秒)。
作用:RT 表的内存段(RAM chunk)定期刷到磁盘的间隔。值越小,崩溃时丢失的写入越少,但 IO 开销越大。
实测配置:
rt_flush_period = 10
验证:
curl -s "http://127.0.0.1:9308/cli" -d "SHOW STATUS LIKE 'uptime'"
实测回显:
+---------+-------+
| Counter | Value |
+---------+-------+
| uptime | 82 |
+---------+-------+
说明:rt_flush_period 本身不出现在 SHOW STATUS 中,其效果通过 query_log 中的写入耗时与崩溃恢复行为体现。默认 10 秒在大多数场景下是性能与持久性的平衡。
3.5 net_workers(网络工作线程数)
默认值:auto(通常等于 CPU 核数)。
作用:处理网络连接与查询请求的工作线程数。
实测配置:
net_workers = 4
验证:
curl -s "http://127.0.0.1:9308/cli" -d "SHOW STATUS LIKE 'workers%'"
实测回显:
+-----------------------+-------+
| Counter | Value |
+-------+-------+
| workers_total | 6 |
| workers_active | 4 |
| workers_clients | 2 |
| workers_clients_vip | 0 |
| workers_clients_buddy | 1 |
+-----------------------+-------+
结论:workers_active 为 4,与 net_workers = 4 一致。workers_total 为 6 是因为 Buddy 也占用了线程。
3.6 max_threads_per_query(单查询最大线程数)
默认值:0(不限制)。
作用:单个查询可使用的最大并行线程数,替代旧版的 dist_threads。
实测配置:
max_threads_per_query = 4
⚠️ 旧参数
dist_threads在 29.9.0 中已废弃,启动日志会出现WARNING: key 'dist_threads' is deprecated; use 'max_threads_per_query' instead。必须改用max_threads_per_query。
3.7 max_matches(最大匹配数)
默认值:已从配置文件移除。
作用:限制查询返回的最大文档数。29.9.0 起不再支持在 searchd 段配置,改为通过查询语句的 OPTION 子句动态设置。
⚠️ 在配置文件中写
max_matches = 1000会触发WARNING: key 'max_matches' was permanently removed from configuration。
正确用法:在查询中用 OPTION:
curl -s "http://127.0.0.1:9308/sql" --data-urlencode "query=SELECT id FROM products WHERE MATCH('search') OPTION max_matches=5000"
实测回显:
{"took":0,"timed_out":false,"hits":{"total":6,"total_relation":"eq","hits":[{"_id":2,"_score":1379,"_source":{}},...]}}
也可用 SET 语句设置会话级默认值:
curl -s "http://127.0.0.1:9308/cli" -d "SET max_matches=5000"
实测回显:
Query OK, 0 rows affected (0.003 sec)
3.8 thread_stack(线程栈大小)
默认值:256K。
作用:每个工作线程的栈大小。复杂查询或深度嵌套的过滤器可能需要更大的栈。
实测配置:
thread_stack = 1M
说明:此参数不在 SHOW STATUS 中暴露,其效果通过是否出现 stack overflow 错误判断。默认 256K 对大多数查询足够,遇到栈溢出错误时再调大。
3.9 max_packet_size(最大数据包大小)
默认值:8M。
作用:单次请求的最大字节数,影响批量写入(BULK INSERT)的单批大小。
实测配置:
max_packet_size = 128M
说明:此参数不在 SHOW STATUS 中暴露。批量写入时若遇到 packet too large 错误,需调大此值。
3.10 pseudo_sharding(伪分片)
默认值:1(开启)。
作用:把单表查询拆成多个子查询并行执行,充分利用多核 CPU。数据量大时效果明显。
实测配置:
pseudo_sharding = 1
说明:此参数不在 SHOW STATUS 中暴露。对小表伪分片可能反而增加开销,可通过 OPTION pseudo_sharding=0 在单条查询中关闭。
3.11 persistent_connections_limit(持久连接上限)
默认值:0(不限制)。
作用:持久连接(keep-alive)的最大数量。
实测配置:
persistent_connections_limit = 100
说明:此参数不在 SHOW STATUS 中暴露。高并发短连接场景下设为合理值可避免连接耗尽。
3.12 binlog_path(binlog 路径)
默认值:无默认值,建议显式设置。
作用:RT 表写入日志目录,保证写入持久性。进程崩溃后自动重放 binlog 恢复未刷盘的数据。
实测配置:
binlog_path = /var/lib/manticore/binlog
验证:
ls -la /var/lib/manticore/binlog/
实测回显:
total 20
drwxrwxrwx 2 root root 4096 Oct 25 12:00 .
drwxrwxrwx 4 root root 4096 Oct 25 12:02 ..
-rw------- 1 999 999 0 Oct 25 12:00 binlog.001
-rw------- 1 999 999 0 Oct 25 12:00 binlog.lock
⚠️ 关键:
binlog_path指定的目录必须在启动前存在,否则searchd启动时 FATAL 退出(failed to open '.../binlog/binlog.lock': No such file or directory)。
四、表级参数
表级参数在建表语句中指定,无需重启服务。Manticore 的字段类型决定了它参与全文检索还是仅用于过滤:
CREATE TABLE products (
title text indexed stored,
price float,
category uint
)
| 类型/属性 | 作用 | 实测回显(DESCRIBE) |
|---|---|---|
text indexed | 参与全文分词与检索 | title text indexed stored |
text stored | 可返回原值,不参与检索 | 同上 |
int/uint/bigint | 整型属性,用于过滤/排序/分组 | category uint |
float/double | 浮点属性,用于过滤/排序 | price float |
timestamp | 时间戳属性 | — |
string | 字符串属性(不过滤,可返回) | — |
验证:
curl -s "http://127.0.0.1:9308/cli" -d "DESCRIBE products"
实测回显:
+----------+--------+----------------+
| Field | Type | Properties |
+----------+--------+----------------+
| id | bigint | |
| title | text | indexed stored |
| price | float | |
| category | uint | |
+----------+--------+----------------+
💡 技术拓展:全文索引 vs 列存属性。
类型 存储方式 用途 代价 text indexed倒排索引 全文检索 占用索引空间,写入慢 attribute(列存) 列存文件 过滤/排序/分组 不参与全文,扫描快 Manticore 29.9.0 默认对属性启用列存(
access_columnar_attrs='mmap'),列存数据按需 mmap 加载,内存占用远低于 Elasticsearch 的 doc_values。
五、环境变量覆盖机制
官方启动脚本支持用 searchd_ 前缀的环境变量覆盖 searchd 段同名键。例如,把 listen 改为 9306:mysql41|9308:http:
export searchd_listen='9306:mysql41|9308:http'
启动脚本会解析该变量并注入到配置文件中。这个机制适合在不修改配置文件的情况下调整参数,尤其在编排系统中通过 environment: 注入。
等价编排写法:
services:
manticore:
environment:
- searchd_listen=9306:mysql41|9308:http|9312:sphinx
- searchd_rt_flush_period=5
注意:环境变量只在启动脚本中处理,直接运行
searchd二进制不会读取这些变量。
六、生产配置模板
以下模板适用于 4 核 8GB 内存、NVMe SSD、日增量百万文档的搜索场景:
searchd {
listen = 9306:mysql41
listen = 9308:http
listen = 9312:sphinx
log = /var/log/manticore/searchd.log
query_log = /var/log/manticore/query.log
pid_file = /var/run/manticore/searchd.pid
data_dir = /var/lib/manticore
binlog_path = /var/lib/manticore/binlog
mysql_version_string = 8.0.30
rt_flush_period = 10
net_workers = 4
max_threads_per_query = 4
pseudo_sharding = 1
thread_stack = 1M
max_packet_size = 128M
persistent_connections_limit = 1000
# 崩溃恢复时重放 binlog 的超时(秒)
# binlog_flush_period = 0 # 0 表示每次写入都刷盘,最安全但最慢
}
模板说明:
rt_flush_period = 10:平衡持久性与 IO,10 秒内的写入崩溃可能丢。net_workers = 4:与 CPU 核数一致,避免线程过多切换。max_threads_per_query = 4:单查询最多用 4 线程,复杂查询不阻塞其他查询。max_packet_size = 128M:支持大批量写入。persistent_connections_limit = 1000:支持高并发持久连接。
七、参数查看与修改方式
7.1 查看运行时状态
curl -s "http://127.0.0.1:9308/cli" -d "SHOW STATUS"
返回全部运行时计数器,包括 uptime、connections、workers_*、各命令统计、性能百分位(search_stats_ms_pct95 等)。
7.2 查看表结构
curl -s "http://127.0.0.1:9308/cli" -d "DESCRIBE products"
7.3 修改配置
- 编辑
manticore.conf; - 重启服务:
docker compose restart manticore; - 查看日志确认无 WARNING/FATAL:
docker compose logs manticore --since 2m | grep -iE 'warning|fatal|error'。
八、常见问题
Q1:配置文件中写了 max_matches,启动报 WARNING: key 'max_matches' was permanently removed
解决:从配置文件删除该行,改用查询级 OPTION max_matches=N 或会话级 SET max_matches=N。
Q2:配置文件中写了 dist_threads,启动报 WARNING: key 'dist_threads' is deprecated
解决:把 dist_threads = N 改为 max_threads_per_query = N。
Q3:启动报 FATAL: failed to open '.../binlog/binlog.lock': No such file or directory
解决:binlog_path 指定的目录不存在,手动创建并赋予写权限:mkdir -p /var/lib/manticore/binlog && chmod 777 /var/lib/manticore/binlog。
Q4:修改配置后重启,参数似乎没生效
排查:检查配置文件路径是否正确挂载,查看启动日志中 using config file '...' (N chars) 的字符数是否与预期一致;配置文件挂载加了 :ro 会导致启动脚本 chown 失败。
九、参考链接
- Manticore Search 官方配置参考:https://manual.manticoresearch.com/Server_settings/Searchd (查询日期 2026-10-25)
- Manticore Search 官方建表参考:https://manual.manticoresearch.com/Creating_a_table/Data_types (查询日期 2026-10-25)
- Manticore Search 官方 Changelog:https://manual.manticoresearch.com/Changelog (查询日期 2026-10-25)