blog-post

Manticore Search 4.0.2: 完全的列式存储支持,自动索引压缩,锁系统改进,伪分片

主要新特性

  • 全面支持 Manticore 列式库 。之前 Manticore 列式库仅支持普通索引。现在它支持:
  • 实时索引中的 INSERTREPLACEDELETEOPTIMIZE
  • 复制
  • ALTER
  • indextool --check
  • 自动索引压缩 ( #478 )。最终,你不必手动或通过定时任务调用 OPTIMIZE 或其他类型的自动化。Manticore 现在自动处理。你可以通过 optimize_cutoff 设置默认压缩阈值。
  • 块快照和锁系统改进。这些变化起初可能外表上看不出来,但它们显著改善了实时索引中许多操作的行为。简单来说,之前大多数 Manticore 数据操作严重依赖锁,现在我们改用磁盘块快照。具体而言:
    • 读取操作(例如 SELECT,复制)使用快照执行
    • 仅更改内部索引结构而不修改模式/文档的操作(例如合并 RAM 段,保存磁盘块,合并磁盘块)使用只读快照执行,并在最后替换现有块
    • UPDATE 和 DELETE 针对现有块执行,但在合并的情况下,写入会被收集并随后应用于新块
    • UPDATE 依次为每个块获取一个排他锁。合并在收集块的属性阶段获取一个共享锁。因此在同一时间,仅有一个(合并或更新)操作可以访问块的属性。
    • 当合并进入需要属性的阶段时,它设置一个特殊标志。当 UPDATE 完成时,它检查该标志,如果已设置,整个更新将存储在一个特殊集合中。最后,当合并完成时,它将更新集应用于新生的磁盘块
    • ALTER 通过排他锁运行
    • 复制作为常规读取操作运行,但此外在 SST 之前保存属性,并在 SST 期间禁止更新
  • ALTER 可以添加/删除全文字段。之前只能添加/删除属性。
  • 🔬 实验性:用于全扫描查询的伪分片 - 允许并行化任何非全文搜索查询。现在无需手动准备分片,只需启用新选项 searchd.pseudo_sharding ,可以期待非全文搜索查询的响应时间最高降低到 CPU cores。注意,它可能会占用所有现有 CPU 核心,因此如果你不仅关心延迟,还关心吞吐量 - 请谨慎使用。

次要更改

  • Linux Mint 和 Ubuntu Hirsute Hippo 通过 APT 仓库 提供支持
  • 在某些情况下通过 HTTP 在大索引中更快地通过 id 更新(取决于 id 分布)
  • 系统d 的自定义启动标志 。现在你不需要手动启动 searchd,如果你需要以某些特定启动标志运行 Manticore
  • 新函数 LEVENSHTEIN() 计算 Levenshtein 距离
  • 添加新的 searchd 启动标志 --replay-flags=ignore-trx-errors--replay-flags=ignore-all-errors,因此如果 binlog 损坏,仍然可以启动 searchd
  • #621 - 显示来自 RE2 的错误
  • 更准确的 COUNT(DISTINCT) 适用于由本地普通索引组成的分布式索引
  • FACET DISTINCT 在进行分面搜索时去除重复项
  • 确切形式修饰符 现在不再需要 形态学 ,并且适用于启用 中缀/前缀 搜索的索引

破坏性更改

  • 新版本能够读取旧索引,但旧版本无法读取 Manticore 4 的索引
  • 删除按 id 隐式排序。如果需要,请显式排序
  • charset_table 的默认值从 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F, U+401->U+451, U+451 更改为 non_cjk
  • OPTIMIZE 会自动发生。如果你不需要,请确保在配置文件的 searchd 部分设置 auto_optimize=0
  • #616 ondisk_attrs_default 已被弃用,现已移除
  • 对于贡献者:我们现在在 Linux 构建中使用 Clang 编译器,因为根据我们的测试,它可以构建更快的 Manticore Search 和 Manticore 列式库
  • 如果在搜索查询中没有指定 max_matches ,则会隐式更新为性能所需的最低值,以支持新的列存储。这可能会影响 SHOW META 中的度量total,但不会影响实际找到的文档数量total_found

从 Manticore 3 迁移

  • 确保您干净地停止 Manticore 3:
  • /var/lib/manticore/binlog/ 中不应有 binlog 文件(目录中应只有 binlog.meta
  • 否则,Manticore 4 无法回复的 binlogs 将不会运行
  • 新版本可以读取旧索引,但旧版本无法读取 Manticore 4 的索引,因此请确保您进行备份,如果想要轻松回滚新版本
  • 如果您运行的是复制集群,请确保您:
  • 首先干净地停止所有节点
  • 然后启动最后停止的节点,使用 --new-cluster(在 Linux 中运行工具 manticore_new_cluster)。
  • 请阅读有关 重新启动集群 的更多详细信息

Bug 修复

  • 修复了许多复制问题:
  • 696f8649 - 修复在有活动索引的连接节点上进行 SST 时崩溃;在连接节点的文件块写入时新增 sha1 校验以加速索引加载;在连接节点的索引加载时新增变更索引文件的轮换;在连接节点替换活动索引时新增索引文件的移除;在供体节点新增发送文件和块的复制日志点
  • b296c55a - 当地址不正确时,JOIN CLUSTER 会崩溃
  • 418bf880 - 在大索引的初始复制中,连接节点可能会因 ERROR 1064 (42000): invalid GTID, (null) 而失败,供体可能在另一个节点连接时变得无响应
  • 6fd350d2 - 对于大索引,哈希可能计算错误,可能导致复制失败
  • #615 - 集群重启时复制失败
  • #574 - indextool --help 不显示参数 --rotate
  • #578 - searchd 在闲置状态下高 CPU 使用率,大约一天后发生
  • #587 - 立即刷新 .meta
  • #617 - manticore.json 被清空
  • #618 - searchd –stopwait 在 root 下失败。它还修复了 systemctl 行为(之前它显示 ExecStop 失败,并且没有等到 searchd 正常停止)
  • #619 - INSERT/REPLACE/DELETE 与 SHOW STATUS。 command_insertcommand_replace 等显示错误的度量
  • #620 - 普通索引的 charset_table 默认值错误
  • 8f753688 - 新的磁盘块未被 mlocked
  • #607 - Manticore 集群节点因无法通过名称解析节点而崩溃
  • #623 - 更新索引的复制可能导致未定义状态
  • ca03d228 - 索引器在对具有 json 属性的普通索引源进行索引时可能会挂起
  • 53c75305 - 修复 PQ 索引的“不等式”表达式过滤器
  • ccf94e02 - 修复了在 1000 个匹配以上的列表查询中选择窗口的问题。 SELECT * FROM pq ORDER BY id desc LIMIT 1000 , 100 OPTION max_matches=1100 以前无法正常工作
  • a0483fe9 - 发送到 Manticore 的 HTTPS 请求可能会导致警告 “max packet size(8388608) exceeded”

安装Manticore Search

安装Manticore Search