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 声明中的继承能够更好地组织具有相似设置或结构的表,并减少配置的大小。父表和子表或父 source 和子 source 都可以使用继承。
父表或父 source 不需要特定的配置。
在子表或子 source 声明中,指定表或 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时使用的排序规则。已知排序规则名称列表请参阅 Collations。 -
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}打开/关闭查询的二级索引。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。