blog-post

Manticore Search 4.2.0: 10倍更快的SELECT,修复了主要错误,支持Debian Bullseye

Manticore团队很高兴地宣布 Manticore Search版本4.2.0 。此次发布的新功能:

重大新功能

  • 对实时索引和全文查询的伪分片支持。在之前的版本中,我们添加了有限的伪分片支持。从这一版本开始,您可以通过启用 searchd.pseudo_sharding 来获得伪分片和多核处理器的所有好处。最酷的是,您不需要对索引或查询做任何处理,只需启用它,如果您的CPU有空余,则会被用来降低响应时间。它支持实时和普通索引的全文、过滤和分析查询。例如,这里是启用伪分片可以使大多数查询的平均响应时间减少约10倍的示例,使用的是 Hacker news精选评论数据集 乘以100(在一个普通索引中的1亿16百万文档)。
    4.2.0 伪分片开启与关闭
  • Debian Bullseye 现在得到了支持。
  • PQ事务现在是原子性和隔离性的。之前PQ事务的支持是有限的。它使得REPLACE into PQ更快,特别是当您需要同时替换很多规则时。性能详情:

上一个版本 4.0.2

插入100万PQ规则需要48秒,在10K批次中REPLACE仅需要406秒

root@perf3 ~ # mysql -P9306 -h0 -e "drop table if exists pq; create table pq (f text, f2 text, j json, s string) type='percolate';"; date; for m in `seq 1 1000`; do (echo -n "insert into pq (id,query,filters,tags) values "; for n in `seq 1 1000`; do echo -n "(0,'@f (cat | ( angry dog ) | (cute mouse)) @f2 def', 'j.json.language=\"en\"', '{\"tag1\":\"tag1\",\"tag2\":\"tag2\"}')"; [ $n != 1000 ] && echo -n ","; done; echo ";")|mysql -P9306 -h0; done; date; mysql -P9306 -h0 -e "select count(*) from pq"

Wed Dec 22 10:24:30 AM CET 2021
Wed Dec 22 10:25:18 AM CET 2021
+----------+
| count(*) |
+----------+
|  1000000 |
+----------+

root@perf3 ~ # date; (echo "begin;"; for offset in `seq 0 10000 30000`; do n=0; echo "replace into pq (id,query,filters,tags) values "; for id in `mysql -P9306 -h0 -NB -e "select id from pq limit $offset, 10000 option max_matches=1000000"`; do echo "($id,'@f (tiger | ( angry bear ) | (cute panda)) @f2 def', 'j.json.language=\"de\"', '{\"tag1\":\"tag1\",\"tag2\":\"tag2\"}')"; n=$((n+1)); [ $n != 10000 ] && echo -n ","; done; echo ";"; done; echo "commit;") > /tmp/replace.sql; date
Wed Dec 22 10:26:23 AM CET 2021
Wed Dec 22 10:26:27 AM CET 2021
root@perf3 ~ # time mysql -P9306 -h0 < /tmp/replace.sql

real    6m46.195s
user    0m0.035s
sys     0m0.008s

新版本 4.2.0

插入100万PQ规则需要34秒,在10K批次中REPLACE仅需要23秒

root@perf3 ~ # mysql -P9306 -h0 -e "drop table if exists pq; create table pq (f text, f2 text, j json, s string) type='percolate';"; date; for m in `seq 1 1000`; do (echo -n "insert into pq (id,query,filters,tags) values "; for n in `seq 1 1000`; do echo -n "(0,'@f (cat | ( angry dog ) | (cute mouse)) @f2 def', 'j.json.language=\"en\"', '{\"tag1\":\"tag1\",\"tag2\":\"tag2\"}')"; [ $n != 1000 ] && echo -n ","; done; echo ";")|mysql -P9306 -h0; done; date; mysql -P9306 -h0 -e "select count(*) from pq"

Wed Dec 22 10:06:38 AM CET 2021
Wed Dec 22 10:07:12 AM CET 2021
+----------+
| count(*) |
+----------+
|  1000000 |
+----------+

root@perf3 ~ # date; (echo "begin;"; for offset in `seq 0 10000 990000`; do n=0; echo "replace into pq (id,query,filters,tags) values "; for id in `mysql -P9306 -h0 -NB -e "select id from pq limit $offset, 10000 option max_matches=1000000"`; do echo "($id,'@f (tiger | ( angry bear ) | (cute panda)) @f2 def', 'j.json.language=\"de\"', '{\"tag1\":\"tag1\",\"tag2\":\"tag2\"}')"; n=$((n+1)); [ $n != 10000 ] && echo -n ","; done; echo ";"; done; echo "commit;") > /tmp/replace.sql; date
Wed Dec 22 10:12:31 AM CET 2021
Wed Dec 22 10:14:00 AM CET 2021
root@perf3 ~ # time mysql -P9306 -h0 < /tmp/replace.sql

real    0m23.248s
user    0m0.891s
sys     0m0.047s

次要变更

  • optimize_cutoff 现在作为配置选项在searchd部分中可用。当您想要限制所有索引中的RT块数量到特定数字时,它非常有用。
  • Commit 00874743 精确的 count(distinct &hellip;)FACET &hellip; distinct 在几个具有相同字段设置/顺序的本地物理索引(实时/普通)上。
  • PR #598 bigint支持YEAR()和其他时间戳函数。
  • Commit 8e85d4bc 自适应 rt_mem_limit 。之前,Manticore Search 在保存新的磁盘数据块之前,收集的数据恰好达到 rt_mem_limit,而在保存时仍然可以收集多达 10% 的数据(即双缓冲),以最小化可能的插入暂停。如果该限制也被耗尽,则添加新文档会被阻止,直到磁盘数据块完全保存到磁盘。新的自适应限制基于我们现在有 auto-optimize 的事实,因此磁盘数据块不完全遵守 rt_mem_limit 并提前开始刷新磁盘数据块并不是大问题。因此,我们现在收集最多 50% 的 rt_mem_limit 并将其保存为磁盘数据块。在保存时,我们查看统计数据(我们保存了多少,有多少新文档在保存期间到达)并重新计算下一次将使用的初始速率。例如,如果我们保存了 9000 万个文档,并且在保存期间另有 1000 万个文档到达,速率为 90%,因此我们知道下次可以收集最多 90% 的 rt_mem_limit 然后再开始刷新另一个磁盘数据块。速率值自动计算,从 33.3% 到 95%。
  • Issue #628 unpack_zlib 用于 PostgreSQL 源。感谢 Dmitry Voronin贡献
  • Commit 6d54cf2b indexer -v--version。之前您仍然可以看到索引器的版本,但不支持 -v/--version
  • Issue #662 默认情况下,Manticore 通过 systemd 启动时的无限 mlock 限制。
  • Commit 63c8cd05 spinlock -> op queue 用于 coro rwlock。
  • Commit 41130ce3 环境变量 MANTICORE_TRACK_RT_ERRORS 对于调试 RT 段损坏很有用。

破坏性变更

  • Binlog 版本已增加,先前版本的 binlog 不会被重播,因此请确保在升级期间干净地停止 Manticore Search:停止先前实例后,/var/lib/manticore/binlog/ 中不应有 binlog 文件,除非是 binlog.meta
  • Commit 3f659f36show threads option format=all 中新增列 “chain”。它显示了一些任务信息票据的堆栈,最适合分析需求,因此如果您正在解析 show threads 输出,请注意新列。
  • searchd.workers 自 3.5.0 起已被弃用,如果您仍在配置文件中使用它,启动时将触发警告。Manticore Search 将启动,但会有警告。

错误修复

  • Issue #650 Manticore 4.0.2 比 Manticore 3.6.3 慢。4.0.2 在批量插入方面比以前的版本快,但在单个文档插入方面明显较慢。此问题在 4.2.0 中已修复。
  • Commit 22f4141b RT 索引可能在强制 REPLACE 负载下损坏,或者可能崩溃
  • Commit 03be91e4 修复了合并分组器和组 N 排序时的平均值;修复了聚合的合并
  • Commit 2ea575d3 indextool --check 可能崩溃
  • Commit 7ec76d4a 由于 UPDATE 导致的 RAM 耗尽问题
  • Commit 658a727e 守护进程可能在 INSERT 上挂起
  • Commit 46e42b9b 守护进程可能在关闭时挂起
  • Commit f8d7d517 守护进程在关闭时可能崩溃
  • Commit 733accf1 守护进程可能在崩溃时挂起
  • Commit f7f8bd8c 守护进程在尝试使用无效节点列表重新加入集群时可能在启动时崩溃
  • Commit 14015561 在无法在启动时解析其代理之一的情况下,分布式索引可能会被完全遗忘在 RT 模式下
  • Issue #683 attr bit(N) engine=‘columnar’ 失败
  • Issue #682 创建表失败,但留下目录
  • Issue #663 配置失败,错误:未知键名 ‘attr_update_reserve’
  • Issue #632 Manticore 在批量查询时崩溃
  • Issue #679 批量查询在 v4.0.3 中再次导致崩溃
  • Commit f7f8bd8c 修复了在启动时尝试重新加入具有无效节点列表的集群时守护进程崩溃的问题
  • Issue #643 Manticore 4.0.2 在插入批处理后不接受连接
  • Issue #635 FACET 查询带有 ORDER BY JSON.field 或字符串属性可能会崩溃
  • Issue #634 在查询带有 packedfactors 时发生崩溃 SIGSEGV

安装Manticore Search

安装Manticore Search