Manticore 配置支持 shebang 语法,允许配置以编程语言编写并在加载时解释。这使得动态设置成为可能,例如通过查询数据库表生成表,根据外部因素修改设置,或包含包含表和源声明的外部文件。
配置文件由声明的解释器解析,输出作为实际配置。此过程在每次读取配置时发生,而不仅仅是在 searchd 启动时。
注意:此功能在 Windows 平台上不可用。
在以下示例中,使用 PHP 创建多个不同名称的表,并扫描特定文件夹以查找包含额外表声明的文件:
#!/usr/bin/php
...
<?php for ($i=1; $i<=6; $i++) { ?>
table test_<?=$i?> {
type = rt
path = /var/lib/manticore/data/test_<?=$i?>
rt_field = subject
...
}
<?php } ?>
...
<?php
$confd_folder='/etc/manticore.conf.d/';
$files = scandir($confd_folder);
foreach($files as $file)
{
if(($file == '.') || ($file =='..'))
{} else {
$fp = new SplFileInfo($confd_folder.$file);
if('conf' == $fp->getExtension()){
include ($confd_folder.$file);
}
}
}
?>
index 和 source 声明中的继承功能使得具有相似设置或结构的表能够更好地组织,并减少配置的大小。父表和子表或源都可以利用继承。
父表或源不需要特定的配置。
在子表或源声明中,指定表或源名称,后跟冒号 (:) 和父名称:
table parent {
path = /var/lib/manticore/parent
...
}
table child:parent {
path = /var/lib/manticore/child
...
}
子表将继承父表的整个配置。子表中声明的任何设置都会覆盖继承的值。请注意,对于多值设置,在子表中定义单个值将清除所有继承的值。例如,如果父表有多个 sql_query_pre 声明,而子表有一个 sql_query_pre 声明,则所有继承的 sql_query_pre 声明都会被清除。要覆盖父表继承的一些值,请在子表中显式声明它们。如果不需要父表的某个值,也适用此规则。例如,如果不需要父表的 sql_query_pre 值,可以在子表中将该指令声明为空值,如 sql_query_pre=。
请注意,如果子表为某个多值设置声明了一个值,则不会复制该设置的现有值。
继承行为适用于字段和属性,而不仅仅是表选项。例如,如果父表有两个整数属性,而子表需要一个新的整数属性,则必须将父表的整数属性声明复制到子表配置中。
SET [GLOBAL] server_variable_name = value
SET [INDEX table_name] GLOBAL @user_variable_name = (int_val1 [, int_val2, ...])
SET NAMES value [COLLATE value]
SET @@dummy_variable = ignored_value
Manticore Search 中的 SET 语句允许您修改变量值。变量名不区分大小写,服务器重启后变量值的更改不会保留。
Manticore Search 支持 SET NAMES 语句和 SET @@variable_name 语法,以兼容可能在连接时需要运行这些语句的第三方 MySQL 客户端库、连接器和框架。然而,这些语句对 Manticore Search 本身没有任何影响。
Manticore Search 中有四类变量:
- 会话级服务器变量:
set var_name = value - 全局服务器变量:
set global var_name = value - 全局用户变量:
set global @var_name = (value) - 全局分布式变量:
set index dist_table_name global @var_name = (value)
全局用户变量在并发会话之间共享。唯一支持的值类型是 BIGINT 列表,这些变量可以与 IN() 操作符一起用于过滤。此功能的主要用例是一次性将大量值列表上传到 searchd,然后多次重用,减少网络开销。全局用户变量可以传递给分布式表的所有代理,或者在分布式表中定义的本地表情况下本地设置。示例:
// in session 1
mysql> SET GLOBAL @myfilter=(2,3,5,7,11,13);
Query OK, 0 rows affected (0.00 sec)
// later in session 2
mysql> SELECT * FROM test1 WHERE group_id IN @myfilter;
+------+--------+----------+------------+-----------------+------+
| id | weight | group_id | date_added | title | tag |
+------+--------+----------+------------+-----------------+------+
| 3 | 1 | 2 | 1299338153 | another doc | 15 |
| 4 | 1 | 2 | 1299338153 | doc number four | 7,40 |
+------+--------+----------+------------+-----------------+------+
2 rows in set (0.02 sec)
Manticore Search 支持影响各自作用域中特定服务器设置的会话级和全局服务器变量。以下是已知的会话级和全局服务器变量列表:
已知的会话级服务器变量:
-
AUTOCOMMIT = {0 | 1}决定数据修改语句是否应隐式地由BEGIN和COMMIT包裹。 -
COLLATION_CONNECTION = collation_name选择后续查询中字符串值的ORDER BY或GROUP BY的排序规则。已知排序规则名称列表请参见 排序规则。 -
MAX_THREADS_PER_QUERY = <POSITIVE_INT_VALUE>在运行时重新定义 max_threads_per_query。会话级变量仅影响同一会话(连接)中运行的查询,即直到断开连接。值为 0 表示“无限制”。如果同时设置了会话级和全局变量,会话级变量优先。 -
net_write_timeout = <value>:调整写操作(即发送数据)的网络超时。全局值只能由 VIP 权限更改。 -
optimize_by_id = {0 | 1}:某些debug命令中使用的内部标志。 -
PROFILING = {0 | 1}启用当前会话的查询分析。默认值为 0。另见 show profile。 -
ro = {1 | 0}切换会话为只读模式或恢复。在show variables输出中,该变量显示为session_read_only。 -
throttling_period = <INT_VALUE>:当前运行查询将重新调度的时间间隔(毫秒)。值为 0 禁用节流,意味着查询将占用 CPU 核心直到完成。如果同时有来自其他连接的并发查询,它们将被分配到空闲核心或挂起直到核心释放。提供负值(-1)将节流重置为默认编译值(100ms),意味着查询每 100ms 重新调度一次,允许并发查询有执行机会。全局值(通过set global设置)只能在 VIP 连接上设置。 -
thread_stack = <value>:动态更改默认值,限制分配给单个任务的栈大小。注意这里的“线程”指的是用户空间线程,也称为协程,而非操作系统线程。如果例如加载 percolate 表时需求异常高,这可能有用。在这种情况下,“call pq” 会因栈大小不足而失败。通常应停止守护进程,在配置中增加该值,然后重启。但也可以尝试不重启,直接用此变量设置新值。全局值也可以通过set global thread_stack在线更改,但仅限 VIP 连接。 -
threads_ex(诊断用):强制 Manticore 表现得像运行在指定 CPU 配置上一样。简短示例,set threads_ex='4/2+6/3'表示“你有 4 个空闲 CPU 核心,调度多个查询时应按 2 批处理。同时,你有 6 个空闲 CPU 核心用于伪分片,部分应按 3 批处理”。此选项用于诊断,非常有用,例如查看查询在本地没有的配置(如 128 核 CPU)上的运行情况。或者快速限制守护进程表现为单线程,以定位瓶颈或调查崩溃。MORE -
WAIT_TIMEOUT/net_read_timeout = <value>设置连接超时,可以是会话级别或全局级别。全局只能在 VIP 连接上设置。
已知的全局服务器变量有:
ACCURATE_AGGREGATION:设置未来查询选项 accurate_aggregation 的默认值。AUTO_OPTIMIZE = {1|0}:开启或关闭 auto_optimize。cluster_user = name:设置用于mysqldump/mariadb-dump的用户名,以启用复制模式。COREDUMP= {1|0}:开启或关闭服务器崩溃时保存核心文件或迷你转储。更多详情见这里。CPUSTATS= {1|0}:开启或关闭CPU 时间跟踪。DISTINCT_PRECISION_THRESHOLD:设置未来查询选项 distinct_precision_threshold 的默认值。ES_COMPAT = {on/off/dashboards}:设置为on(默认)时,支持类似 Elasticsearch 的写请求;off禁用支持;dashboards启用支持并允许来自 Kibana 的请求(此功能为实验性)。EXPANSION_MERGE_THRESHOLD_DOCS:动态更改配置中的 expansion_merge_threshold_docs 设置值。EXPANSION_MERGE_THRESHOLD_HITS:动态更改配置中的 expansion_merge_threshold_hits 设置值。GROUPING_IN_UTC = {0 | 1}:设置为 1 时,使定时分组函数(day(), month(), year(), yearmonth(), yearmonthday())以 UTC 计算。更多详情请参阅 grouping_in_utc 配置参数文档。IOSTATS = {0 | 1}:启用或禁用查询日志中的 I/O 操作报告(属性除外)。LOG_DEBUG_FILTER = <string value>:过滤冗余日志消息。如果设置了该值,则所有级别高于 INFO(即DEBUG、DEBUGV等)的日志将与该字符串比较,仅当日志以该字符串开头时才输出。LOG_LEVEL = {info | debug | replication | debugv | debugvv}:更改当前日志详细级别。MAINTENANCE = {0 | 1}:设置为 1 时,将服务器置于维护模式。只有 VIP 连接的客户端可以在此模式下执行查询。所有新的非 VIP 连接将被拒绝。现有连接保持不变。MAX_THREADS_PER_QUERY = <POSITIVE_INT_VALUE>:运行时重新定义 max_threads_per_query。作为全局变量时,改变所有会话的行为。值为 0 表示“无限制”。如果同时设置了会话级和全局变量,会话级优先。NET_WAIT = {-1 | 0 | POSITIVE_INT_VALUE}:更改 net_wait_tm searchd 设置值。OPTIMIZE_CUTOFF = <value>:动态更改配置中的 optimize_cutoff 设置值。PSEUDO_SHARDING = {1|0}:开启或关闭搜索伪分片。QCACHE_MAX_BYTES = <value>更改 query_cache 的 RAM 使用限制为指定值。QCACHE_THRESH_MSEC = <value>更改 query_cache 的最小墙时阈值为指定值。QCACHE_TTL_SEC = <value>更改 query_cache 缓存结果的 TTL 为指定值。QUERY_LOG_FORMAT = {plain | sphinxql}更改当前日志格式。QUERY_LOG_MIN_MSEC = <value>更改 query_log_min_msec searchd 设置值。在此情况下,期望值为毫秒数,不解析配置中的时间后缀。警告:这是一个非常特殊且“硬性”的变量;被过滤的消息将直接丢弃,不会写入日志。最好使用类似 'grep' 的工具过滤日志,这样至少可以保留完整的原始日志作为备份。
RESET_NETWORK_TIMEOUT_ON_PACKET = {1|0}更改 reset_network_timeout_on_packet 参数。只有具有 VIP 连接的客户端可以更改此变量。SECONDARY_INDEXES = {1|0}开启/关闭搜索查询的 secondary indexes。TIMEZONE = <value>指定日期/时间相关函数使用的时区。更多详情请参阅 timezone 配置参数文档。
示例:
mysql> SET autocommit=0;
Query OK, 0 rows affected (0.00 sec)
mysql> SET GLOBAL query_log_format=sphinxql;
Query OK, 0 rows affected (0.00 sec)
mysql> SET GLOBAL @banned=(1,2,3);
Query OK, 0 rows affected (0.01 sec)
mysql> SET INDEX users GLOBAL @banned=(1,2,3);
Query OK, 0 rows affected (0.01 sec)
要使用户变量持久化,请确保启用 sphinxql_state。