使用 man ascii 来查看 ASCII 表。

【搜索客社区日报】第2023期 (2025-04-16)

社区日报kin122 发表了文章 • 0 个评论 • 213 次浏览 • 1 天前 • 来自相关话题

1.OpenSearch与Elasticsearch:一个最新的比较
https://zhuanlan.zhihu.com/p/668706342

2.Elasticsearch BBQ 与 OpenSearch FAISS:向量搜索性能对比
https://blog.csdn.net/UbuntuTo ... 64172

3.Elasticsearch 与 OpenSearch:解开向量搜索性能差距
https://zhuanlan.zhihu.com/p/719251376

编辑:kin122 
更多资讯:http://news.searchkit.cn

Easysearch Rollup 相比 OpenSearch Rollup 的优势分析

EasysearchINFINI Labs 小助手 发表了文章 • 0 个评论 • 219 次浏览 • 1 天前 • 来自相关话题

背景


在处理时序数据时,Rollup 功能通过数据聚合显著降低存储成本,并提升查询性能。Easysearch 与 OpenSearch 均提供了 Rollup 能力,但在多个关键维度上,[Easysearch Rollup](https://infinilabs.cn/blog/202 ... ollup/) 展现出更优的表现。本文将从查询体验、索引管理、聚合能力、性能优化和任务管理五个方面,分析 Easysearch Rollup 相较于 OpenSearch Rollup 的优势。

---

Easysearch vs OpenSearch


1. 查询体验:标准接口与无缝集成


Easysearch Rollup 支持通过标准的 _search API 查询原始索引,系统自动融合 Rollup 数据,用户无需变更现有代码或使用专用查询端点。相比之下,OpenSearch Rollup 虽然使用标准查询语法,但需要用户显式指定 Rollup 索引,无法自动结合原始数据,在需要同时访问原始与聚合数据的场景下显得更为繁琐。

  • 差异:Easysearch 支持自动融合原始与 Rollup 数据,OpenSearch 需手动指定索引。
  • 影响:Easysearch 显著降低了查询逻辑的复杂性和开发维护成本。

    ---

    2. 索引管理:自动化与扩展能力


    Easysearch Rollup 提供自动索引滚动功能,可通过 rollup.index_max_docs. 配置项为不同的目标 Rollup 索引设置文档数上限,触发新索引的动态创建,显著简化管理流程。此外,配置中支持使用变量(如 {{ctx.source_index}})动态生成目标索引名,便于多个任务复用同一模板,批量扩展 Rollup 任务时更加高效和灵活。

    相比之下,OpenSearch Rollup 依赖 Index State Management(ISM)策略或手动操作进行索引切换,配置复杂、监控成本高,且在大规模任务部署时缺乏灵活的模板化机制。

  • 差异:Easysearch 提供内建的自动滚动机制,OpenSearch 依赖外部策略或手动配置。
  • 影响:Easysearch 更易于统一管理和大规模扩展,运维成本更低。

    ---

    3. 聚合能力:更广泛的聚合类型支持


    Easysearch Rollup 支持丰富的聚合类型,包括数值字段的 avgsummaxminpercentiles,关键词字段的 terms,日期字段的 date_histogramdate_range,还支持 filter 聚合与 special_metrics(可自定义聚合字段和方式)等高级功能。OpenSearch Rollup 支持的聚合类型相对有限,不支持 date_rangefilter 等复杂聚合表达式。

  • 差异:Easysearch 提供更全面的聚合能力,OpenSearch 仅支持基础聚合。
  • 影响:Easysearch 更适合构建复杂的时序分析任务,满足更广泛的业务需求。

    ---

    4. 性能优化:精细化配置与资源控制


    Easysearch Rollup 提供多种性能优化选项,例如 ROLLUP_SEARCH_MAX_COUNT 控制并发查询数,rollup.hours_before 限制回溯时间范围,write_optimizationfield_abbr 用于优化写入效率与运行时的内存占用。而 OpenSearch Rollup 缺乏类似的专用配置项,主要依赖通用的集群参数,灵活性与精细度较低。

  • 差异:Easysearch 提供针对 Rollup 场景的专属优化选项,OpenSearch 优化能力较通用。
  • 影响:Easysearch 在资源使用效率、查询性能和成本控制方面更具优势。

    ---

    5. 任务管理:批量控制与更高灵活性


    Easysearch Rollup 支持使用通配符进行任务批量管理,且新建任务默认处于非激活状态,用户可按需启用。而 OpenSearch Rollup 中,任务默认立即启用,管理粒度较粗,仅支持单个任务的启停与修改,缺乏批量操作能力。

  • 差异:Easysearch 支持批量任务管理与按需启用,OpenSearch 功能较为基础。
  • 影响:Easysearch 在多任务环境下提供更高的管理效率和控制能力。

    ---

    实战示例:节点统计 Rollup 配置


    以下是一个 Easysearch Rollup 任务的配置示例:

    json<br /> {<br /> "rollup": {<br /> "source_index": ".infini_metrics",<br /> "target_index": "rollup_node_stats_{{ctx.source_index}}",<br /> "timestamp": "timestamp",<br /> "continuous": true,<br /> "page_size": 200,<br /> "cron": "*/5 1-23 * * *",<br /> "interval": "1m",<br /> "identity": ["metadata.labels.cluster_id", "metadata.labels.node_id"],<br /> "stats": [{ "max": {} }, { "min": {} }, { "value_count": {} }],<br /> "special_metrics": [<br /> {<br /> "source_field": "payload.elasticsearch.node_stats.jvm.mem.heap_used_in_bytes",<br /> "metrics": [{ "avg": {} }, { "max": {} }, { "min": {} }]<br /> }<br /> ],<br /> "write_optimization": true<br /> }<br /> }<br />

  • 亮点:支持自动索引滚动、标准 API 查询、special_metrics 高级聚合与写入优化等特性。

    ---

    总结


    综合来看,Easysearch Rollup 在以下方面优于 OpenSearch Rollup:

  • 查询接口的兼容性与无感知集成
  • 自动化的索引管理与扩展能力
  • 更丰富的聚合类型与表达能力
  • 针对性更强的性能优化参数
  • 灵活高效的任务批量管理机制

    这些优势使 Easysearch Rollup 更加适用于复杂、多样化的时序数据处理场景,特别是在对性能、扩展性与运维效率有较高要求的系统中表现出色。如果你正在寻找一款功能全面、易于管理的 Rollup 解决方案,Easysearch 是一个值得重点考虑的选择。

    关于 Easysearch


    ![](https://infinilabs.cn/img/blog ... er.png)

    INFINI Easysearch 是一个分布式的搜索型数据库,实现非结构化数据检索、全文检索、向量检索、地理位置信息查询、组合索引查询、多语种支持、聚合分析等。Easysearch 可以完美替代 Elasticsearch,同时添加和完善多项企业级功能。Easysearch 助您拥有简洁、高效、易用的搜索体验。

    官网文档:<https://docs.infinilabs.com/easysearch>;

    作者:张磊,极限科技(INFINI Labs)搜索引擎研发负责人,对 Elasticsearch 和 Lucene 源码比较熟悉,目前主要负责公司的 Easysearch 产品的研发以及客户服务工作。
    原文:https://infinilabs.cn/blog/202 ... llup/

【搜索客社区日报】第2022期 (2025-04-15)

社区日报God_lockin 发表了文章 • 0 个评论 • 364 次浏览 • 1 天前 • 来自相关话题

1. 我的ES有点强哦(需要梯子)
https://blog.devgenius.io/the- ... 7c791
2. ES索引重建的最佳实践(需要梯子)
https://medium.com/%40mrtkrkrt ... 2ef98
3. 用airflow做ES的索引轮换、snapshot(需要梯子)
https://medium.com/%40MadhavPr ... 240df
https://medium.com/%40MadhavPr ... 65b71
编辑:斯蒂文
更多资讯:http://news.searchkit.cn
 

谈谈 ES 6.8 到 7.10 的功能变迁(1)- 性能优化篇

ElasticsearchINFINI Labs 小助手 发表了文章 • 0 个评论 • 428 次浏览 • 2 天前 • 来自相关话题

前言


ES 7.10 可能是现在比较常见的 ES 版本。但是对于一些相迭代比较慢的早期业务系统来说,ES 6.8 是一个名副其实的“钉子户”。

借着工作内升级调研的任务东风,我整理从 ES 6.8 到 ES 7.10 ELastic 重点列出的新增功能和优化内容。将分为 6 个篇幅给大家详细阐述。

本系列文章主要针对 Elasticsearch 传统的使用功能和基础的模块,像是集群任务的管理、搜索、聚合还有字段类型这样的功能。对于付费功能或者全新的模块,比如:CCR、机器学习和数据流,这里不去深入探讨。

内容的主要来源于 Elastic [各个版本的发布信息](https://www.elastic.co/cn/blog/category/releases),这里主要比对 ES 6.8 版本到 7.10 版本的差异,并不一一枚举各个新的功能点出现的时间版本。

下面是第一篇:关于 ES 性能的优化

ES 7.10 的性能优化


集群协调算法升级


基于 Elastic 博客提供的资料,Elasticsearch 7.0 的核心改进在于集群协调层的彻底重构,取代了旧版 Zen Discovery 的局限性,引入更健壮、自动化的分布式共识机制。从理论上来说这次优化有着不少的进步,可以显著提升了高可用性与运维效率

主要的优化点有下面三点:

  1. 消除分裂脑(Split Brain)风险:通过自动化计算,确保集群状态更新的安全性。旧版 minimum_master_nodes 的手动配置被移除,避免人为误操作。

  2. 提升集群稳定性与恢复速度:节点故障时,集群更快达成一致,减少服务中断窗口。

  3. 简化运维复杂度:可以动态扩缩容无需手动调整配置,系统自动管理选举配置。同时提供更清晰的日志和错误提示,加速故障诊断。

    | 旧版配置 | ES 7.0 配置 | 作用 |
    | ------------------------------------ | ---------------------- | ----------------------------------------- |
    | discovery.zen.ping.unicast.hosts | discovery.seed_hosts | 定义初始发现的种子节点列表(IP 或主机名) |
    | discovery.zen.minimum_master_nodes | 已移除 | 由系统自动管理法定人数 |

    而在优化的原则里,Elastic 更强调安全第一。比如,在半数以上主节点永久丢失的风险场景下,ES 7.0 之前的集群会静默等待恢复,允许通过启动新空节点强制恢复,这样可能会导致数据不一致或丢失。在 Elasticsearch 7.0 以及更高版本中,这种不安全活动受到了更多限制。集群宁愿保持不可用状态,也不会冒这种风险(除非使用 elasticsearch-node 恢复工具)。

    这次优化显著降低了人为错误的风险:移除脆弱的手动配置,减少运维使用的理解成本。同时提升关键业务连续性:快速故障恢复与明确的容错机制,能适合更多场景需求。

    当然也并不是尽善尽美的,也会存在大集群下投票节点过多导致竞争激烈而[无法选主的问题](https://mp.weixin.qq.com/s/jU8HCEf2E6hkz_1ZVH_GaQ),这种情况下,建议部署独立的主节点,并且可以考虑适当增大 cluster.election.duration 的配置。

    Top K 对检索的加速


    这里的 Top K 主要是指在普通检索时展示前列的数据 Top K。也就是说 Elasticsearch 7.0 对检索数据的查询性能做了明显的改善。那是做了所有查询场景的提升么?

    ELastic 做了这么一个场景假设:如果用户通常只关注搜索结果的第一页,且并不关心具体匹配的文档总数,对于超出一定数量的数据搜索引擎可以展示“超过 10,000 条结果”并提供分页浏览来优化搜索效率。但是在实际过程中用户常在查询中使用高频词(如“the”或“a”),这迫使 Elasticsearch 为大量文档计算评分,明显占用了查询资源的使用,即使这些常见词对相关性排序贡献甚微。
    ![](https://infinilabs.cn/img/blog ... .5.png)

    而现在,Elasticsearch 现在可以跳过那些在早期阶段就被判定为不会进入结果集顶部的低排名记录的评分计算,从而显著提升查询速度。这里主要涉及了 block-max WAND 算法的实现。这是一个复杂且漫长的优化过程,有兴趣的同学可以阅读一下这段[Magic WAND: Faster Retrieval of Top Hits in Elasticsearch](https://www.elastic.co/blog/fa ... x-wand)。
    ![](https://infinilabs.cn/img/blog ... .6.png)

    从 Elastic 的测试结果来看,新算法的优化让 term 查询加速了 3-7 倍。当然从场景背景可以看出,这个优化主要在大数据量下有明显效果(小数据量也不会有太多的日常高频词)。

    默认开启 soft-delete 减少 translog


    从 Elasticsearch 7.4 开始,副本的数据恢复,不再完全依赖 translog 了,而是通过索引的 soft-delete 特性(Elasticsearch 7.0 起所有新索引默认启用软删除 soft-deletes)。这样就可以缩小 translog 的使用场景,从而 translog 的保留大小也可以减少了。

    那原来使用 translog 是什么样的呢?

    translog 是 ES 用于保证数据安全性的重要工具。同时副分片进行恢复时,它也起着重要作用,只要副分片待获取的差异数据是在 translog 所保留的数据范围内,就可以只从 trasnlog 复制差异的部分数据,而不用拖取整个分片。在之前的版本中,Elasticsearch 默认会保留 512M 或 12 小时的 translog 用于副本恢复。

    那现在使用的 soft-delete 是什么呢?

    soft-deletes 是 Lucene 中实现的特性。这个软删除有时候会和 lucene 本身的标记删除概念发生混淆。为了方便理解,我们在这里归纳一下,lucene 实现删除的方式是一种标记删除的方式,而这种标记删除可以分为硬删除和软删除。软删除和硬删除有一个明显的区分点是:硬删除,被删除的文档对应的文档号用索引文件 .liv 来描述。软删除 soft-delete,被标记为删除的文档不使用索引文件.liv 来描述,而是通过索引文件 .dvd .dvm 来描述

    这里再扩展一下,.liv 文件主要实现 fixedbitset 数据结构。而 .dvd .dvm 则组合实现了 docvalue 这种正排数据结构。

    正排索引的数据结构助力了 translog 的‘减负’,副本可以相对简便的通过软删除中的数据标记来实现数据恢复的处理。

    ![](https://infinilabs.cn/img/blog ... .4.png)

    相比较简洁高效的位图索引,docvalue 虽然实现了更多的功能,满足更多的场景,也会带来更多的问题。最明显的就是对于 update 操作,会导致 refresh 变得慢,有些压力场景下 refresh 会达到 10s 以上。

    数值/日期排序查询加速


    Elasticsearch 7.6 版本提升了按日期或数值(即任何存储为有符号 64 位整数(long 类型)的字段)进行排序的查询性能。

    这背后的优化原理和之前 top K 使用的 Block-Max WAND 算法有点相似,都是利用算法跳过非竞争性文档来实现加速。

    实际效果可能因环境而异,受多种参数影响。在 Elastic 进行的测试场景下,可以达到 35 倍的速度优化。

    FST 内存使用迁移到堆外


    Elastic 7.3 版本实现了这个优化,是藏在 release note 里的彩蛋。

    Also mmap terms index (.tip) files for hybridfs #43150 (issue: #42838)

    看似不经意的一行,但是带来效果却不小。FST 从堆内转移到堆外后,JVM 的空间可以空余出很客观的一部分
    ![](https://infinilabs.cn/img/blog ... .3.png)

    一直以来,ES 堆中常驻内存中占据比重最大是 FST,即 tip(terms index) 文件占据的空间,1TB 索引大约占用 2GB 或者更多的内存,因此为了节点稳定运行,业界通常认为一个节点 open 的索引不超过 5TB。现在,从 ES 7.3 版本开始,将 tip 文件修改为通过 mmap 的方式加载,这使 FST 占据的内存从堆内转移到了堆外由操作系统的 pagecache 管理。

    存储字段压缩优化


    Elasticsearch 7.10 基于 Apache Lucene 8.7 引入了对存储字段(stored fields)的更高压缩率优化。不管是对于基于 DEFLATE 的 index.codec: best_compression 还是基于 LZ4 的index.codec: default都有不错的表现,在 Elastic 的测试场景下,最大可达到 10%的存储空间减少。

    对于数据压缩 lucene 这次主要做了两个优化。

  4. Elastic 研究发现在存储数据的时候,底层的 block 越大,压缩效果越好,因为中间被压缩的重复数据可能越多。但是大块的 block 也可能因为解码重复数据降低查询速度。

  5. block 间通过共享字典来维持检索效率和数据压缩之间的平衡。

    2.1. 首先为压缩算法提供一个数据字典,它也可以用于字符串重复数据删除。如果在要压缩的数据流和字典之间有许多重复的字符串,那么最终可以得到更好的压缩比。在解压缩时也通过字典来快速补足。
    ![](https://infinilabs.cn/img/blog ... .1.png)

    2.2. 同时,ES 使用更大的数据块,这些数据块本身被分成一个字典和 10 个子块,这些子块使用这个字典进行压缩。
    ![](https://infinilabs.cn/img/blog ... .2.png)

    而对于实际业务场景中,日志和监控数据的重复率往往会很好,因此在这两个场景中的压缩效果也是最明显的。

    小结


    当然,除了这几项外,ES 在各个版本中也做了不少优化,比如:调整 search.max_buckets 增加到 65534;Date histogram 聚合性能优化等等。有兴趣的同学可以参照各个版本的 [release highlight](https://www.elastic.co/guide/e ... s.html)

    参考资料:

  6. [Save space and money with improved storage efficiency in Elasticsearch 7.10](https://www.elastic.co/blog/sa ... h-7-10)
  7. [Elasticsearch 7.3 的 offheap 原理](https://mp.weixin.qq.com/s/QviC_9ElknSS9kxXSMjjbg)
  8. [Elasticsearch 7.4 的 soft-deletes 是个什么鬼](https://mp.weixin.qq.com/s/_l8JAtqK_NOSP8b7OqSVDg)

    推荐阅读


【搜索客社区日报】第2021期 (2025-04-14)

社区日报Muses 发表了文章 • 0 个评论 • 577 次浏览 • 3 天前 • 来自相关话题

1、解决 Elasticsearch 分页查询性能瓶颈——从10分钟到秒级的优化实践
https://mp.weixin.qq.com/s/QyyWFim2y6mqhvzmb4FBZw

2、费曼讲解大模型参数微调——小白也能看懂
https://mp.weixin.qq.com/s/39vzs9RTB824oZvF01Kdmw

3、想得久≠答得对!LLM应该自主决定Reasoning长度!
https://mp.weixin.qq.com/s/XTiJrWkuRmyzW5KO3lwrow

4、如何合理规划Elasticsearch的索引|得物技术
https://mp.weixin.qq.com/s/eKuD4eSF4FS9Fw5xdj6Sow

5、我们为何必须坚持国产替代?
https://mp.weixin.qq.com/s/yliQf4cf1kBfwIG-w_hjTQ

编辑:Muse
更多资讯:http://news.searchkit.cn

代理 Elasticsearch 服务:INFINI Gateway VS Nginx

ElasticsearchINFINI Labs 小助手 发表了文章 • 0 个评论 • 983 次浏览 • 5 天前 • 来自相关话题

![](https://infinilabs.cn/img/blog ... er.png)

INFINI Gateway 简介


[INFINI Gateway](https://infinilabs.cn/products/gateway/) 是一款面向 Elasticsearch 的高性能应用网关,专为提升 Elasticsearch 集群的性能、安全性和可管理性而设计。它作为 Elasticsearch 的前置网关,能够处理所有客户端请求,并将其转发到后端的 Elasticsearch 集群,同时提供丰富的功能来优化请求处理和管理。此外还支持代理 Opensearch、[Easysearch](https://infinilabs.cn/products/easysearch/) 服务。

Nginx 简介


Nginx 是一个高性能的 HTTP 和反向代理服务器,以其高并发处理能力、低内存消耗和稳定性著称,广泛应用于 Web 服务器、负载均衡和反向代理等场景。在 Elasticsearch 的使用场景里,也有小伙伴使用 Nginx 来代理 Elasticsearch 的服务,利用 Nginx 的负载均衡能力,将请求转发到多个 Elasticsearch 节点。

这两个软件都能代理 Elasticsearch 服务,但是他们有什么区别?我们来一起分析分析。

负载均衡


Elasticsearch 是分布式系统,提倡使用 round-robin 方式将请求发送到多个节点。不管是 Nginx 还是 INFINI Gateway 都默认使用 round-boin 方式转发请求,也都支持 weighted round-robin(加权轮询)方式进行请求转发,这点两者相当。

节点自动更新


Elasticsearch 集群可能会遇到添加、删除节点的情况,代理程序能否感知 Elasticsearch 节点的变化将变得非常关键。

在 Nginx 中,所有转发节点的 IP 地址都必须写入到配置文件中。如果 Elasticsearch 集群加入了新的节点进行请求处理,则需要 Nginx 编辑配置文件把新节点的 IP 地址加入其中,然后重启或重载 Nginx 服务,才能将请求分发到新的节点。反之如果有节点下线,也要编辑 Nginx 配置文件并重载服务。

INFINI Gateway 是面向 Elasticsearch 设计的应用网关,具有后端节点发现和更新的功能,能够感知 Elasticsearch 集群节点加入、离开的情况。开启节点发现和更新功能后,Gateway 会定期自动更新节点列表,将请求均匀转发到列表中的节点。可参考之前的[博客](https://infinilabs.cn/blog/202 ... teway/)开启节点自动更新。

⚠️ 注意:INFINI Gateway 默认后端节点发现和更新的功能为关闭状态。

定向转发请求


使用 Elasticsearch 集群的场景多种多样,如果想对转发的节点做进一步控制,可能需要根据不同条件进行节点筛选:

  • IP 地址
  • 节点角色
  • 节点标签

    Nginx


    Nginx 支持根据 IP 地址进行转发的,将需要转发的节点 IP 地址写入配置文件即可。

    plain<br /> upstream es-cluster {<br /> server 192.168.56.102:9200;<br /> server 192.168.56.102:9201;<br /> server 192.168.56.102:9202;<br /> }<br />

    但不支持按节点角色、节点标签进行筛选,因为 Nginx 中并没有这种概念。

    INFINI Gateway


    INFINI Gateway 支持按 IP 地址进行筛选:

  • 不开节点发现:只转发到配置文件指定的节点(IP 地址)
  • 开启节点发现:转发到所有发现的节点

    ```plain
    flow:
    • name: cache_first
      filter:
      • elasticsearch:
        elasticsearch: prod
        refresh:
        enabled: true
        interval: 30s
        filter:
        hosts:
        exclude:
        • 192.168.3.201:9200
          include:
        • 192.168.3.202:9200
        • 192.168.3.203:9200
          <br /> <br /> 此外 Gateway 还支持通过节点角色、节点标签筛选转发节点。<br /> <br /> plain
          flow:
    • name: cache_first
      filter:
      • elasticsearch:
        elasticsearch: prod
        refresh:
        enabled: true
        interval: 30s
        filter:
        tags:
        exclude:
        • temp: cold
          include:
        • disk: ssd
          roles:
          exclude:
        • master
          include:
        • data
        • ingest
          ```

          多种筛选条件可以同时使用,详细信息请查看官方[文档](https://docs.infinilabs.com/ga ... earch/)。

          作者:杨帆,极限科技(INFINI Labs)高级解决方案架构师、《老杨玩搜索》栏目 B 站 UP 主,拥有十余年金融行业服务工作经验,熟悉 Linux、数据库、网络等领域。目前主要从事 Easysearch、Elasticsearch 等搜索引擎的技术支持工作,服务国内私有化部署的客户。
          原文:https://infinilabs.cn/blog/202 ... ginx/

【搜索客社区日报】第2020期 (2025-04-11)

社区日报Fred2000 发表了文章 • 0 个评论 • 1021 次浏览 • 6 天前 • 来自相关话题

1、Agent 时代的 HTTP 来了?谷歌 A2A 开源协议打破企业间 Agent 壁垒
https://www.infoq.cn/article/y9gcWYGXUhRYqvXqsy1f

2、Easysearch 索引备份之 Clone API
https://blog.csdn.net/yangmf20 ... 88006

3、Elasticsearch 8.X 如何利用嵌入向量提升搜索能力?
https://mp.weixin.qq.com/s/Vv2i3FOSUTAhnTiKJM2h3A

4、ES 集群日增数据统计难?手把手教你精准计算文档数&存储量!
https://cloud.tencent.com/deve ... 09449

5、INFINI Console:助力 Elasticsearch 集群平滑升级,保障业务零中断
https://infinilabs.cn/case/ind ... nsole

编辑:Fred
更多资讯:http://news.searchkit.cn

【搜索客社区日报】第2019期 (2025-04-10)

社区日报Se7en 发表了文章 • 0 个评论 • 1106 次浏览 • 6 天前 • 来自相关话题

1.vllm近期更新的一些trick总结
https://mp.weixin.qq.com/s/R_X0qxSiA3X4FqhWzyQM1g
2. MCP,竟然是两位年轻工程师的杰作
https://mp.weixin.qq.com/s/4F9PokMiKTaobeKQaw7Wcg
3.为 Kubernetes 提供智能的 LLM 推理路由:Gateway API Inference Extension 深度解析
https://mp.weixin.qq.com/s/jRxY4GJgnvzk-o3nBmjP4g
4.基于 MCP 实现 AI 应用架构新范式的一线实践(含78页架构图下载)
https://mp.weixin.qq.com/s/r1wKHJDzUgWncZvNko2O2Q

编辑:Se7en
更多资讯:http://news.searchkit.cn

Operator 开发入门系列(一):Hello World!

默认分类INFINI Labs 小助手 发表了文章 • 0 个评论 • 1139 次浏览 • 6 天前 • 来自相关话题

背景


我们公司最近计划将产品迁移到 Kubernetes 环境。 为了更好地管理和自动化我们的应用程序,我们决定使用 Kubernetes Operator。 本系列博客将记录我们学习和开发 Operator 的过程,希望能帮助更多的人入门 Operator 开发。

目标读者


  • 对 Kubernetes 有一定了解的开发人员和运维人员
  • 希望使用 Operator 自动化管理应用程序的人员
  • 对 Go 语言有基本了解的人员

    准备工作


    在开始之前,你需要准备以下环境:

  • Go 语言环境 (>= 1.23): Operator 通常使用 Go 语言开发,你需要安装 Go 语言环境。 建议使用 Go 1.21 或更高版本。 可以从 [https://go.dev/dl/](https://go.dev/dl/) 下载安装包。 安装完成后,请配置好 GOPATHPATH 环境变量。

  • Kubernetes 集群: 你需要一个可用的 Kubernetes 集群来部署和测试 Operator。 可以使用 Minikube、Kind 或其他的 Kubernetes 发行版。

  • kubectl 命令行工具: kubectl 是 Kubernetes 的命令行工具,用于与 Kubernetes 集群交互。 请确保你已经安装并配置了 kubectl, 并且能够连接到你的 Kubernetes 集群。

  • Kubebuilder (>= 3.0): Kubebuilder 是一个用于快速构建 Kubernetes Operator 的框架。 使用 Kubebuilder 可以简化 Operator 的开发流程,并生成一些必要的代码框架。 可以使用以下命令安装 Kubebuilder:

    bash<br /> cd $HOME/go/bin<br /> curl -L -o kubebuilder "<a href="https://go.kubebuilder.io/dl/latest/" rel="nofollow" target="_blank">https://go.kubebuilder.io/dl/latest/</a>$(go env GOOS)/$(go env GOARCH)"<br /> chmod +x kubebuilder<br />

    请确保 $HOME/go/bin 目录在你的 PATH 环境变量中。 可以运行 kubebuilder version 命令来验证 Kubebuilder 是否安装成功。

  • Docker (可选): 如果你需要构建 Operator 的 Docker 镜像,你需要安装 Docker。

    我的环境是 MacOS(arm64) + Orbstack

    什么是 Operator?


    简单来说,Operator 是 Kubernetes 的扩展,它利用自定义资源(Custom Resources, CRs)来自动化管理应用程序。Operator 允许我们像管理 Kubernetes 内置资源一样管理复杂的应用程序,例如数据库、消息队列等。

    为什么选择 Operator?


    Operator 提供了一种声明式的方式来管理应用程序的生命周期,包括部署、升级、备份、恢复等。它可以简化运维流程,提高自动化程度,并确保应用程序的状态符合预期。

    我们的第一个 Operator:Hello World


    这个 Operator 将监听一个名为 HelloWorld 的自定义资源,并在 Kubernetes 中创建一个 Pod,该 Pod 运行一个简单的 "Hello World" 应用程序。

    1. 初始化 Kubebuilder 项目


    首先,我们需要使用 Kubebuilder 创建一个新的项目。 在你的 GOPATH 目录下创建一个新的目录,例如 hello-world-operator,然后进入该目录,运行以下命令

    bash<br /> kubebuilder init --domain infini.cloud --repo github.com/infinilabs/hello-world-operator<br />

    这个命令会创建一个新的 Kubebuilder 项目,并生成一些必要的文件和目录。

    2. 创建自定义资源(Custom Resource Definition, CRD)


    接下来,我们需要定义 HelloWorld 资源的结构。 运行以下命令

    bash<br /> kubebuilder create api --group example --version v1alpha1 --kind HelloWorld<br />

    这个命令会创建一个新的 API 定义,包括 api/v1alpha1/helloworld_types.gocontrollers/helloworld_controller.go 两个文件。

    编辑 api/v1alpha1/helloworld_types.go 文件,修改 HelloWorldSpec 的定义,添加 namemessage 字段:

    go<br /> // HelloWorldSpec defines the desired state of HelloWorld<br /> type HelloWorldSpec struct {<br /> // INSERT ADDITIONAL SPEC FIELDS - desired state of cluster<br /> // Important: Run "make" to regenerate code after modifying this file<br /> <br /> // Name is the name of the HelloWorld resource<br /> Name string `json:"name,omitempty"`<br /> <br /> // Message is the message to be printed by the pod<br /> Message string `json:"message,omitempty"`<br /> }<br />

    3. 实现 Reconcile 逻辑


    编辑 controllers/helloworld_controller.go 文件,实现 Reconcile 函数, 创建一个 Pod,该 Pod 运行一个 busybox 镜像,并输出 HelloWorld 资源中定义的 message

    go<br /> package controllers<br /> <br /> import (<br /> "context"<br /> "fmt"<br /> <br /> corev1 "k8s.io/api/core/v1"<br /> apierrors "k8s.io/apimachinery/pkg/api/errors"<br /> metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"<br /> "k8s.io/apimachinery/pkg/runtime"<br /> ctrl "sigs.k8s.io/controller-runtime"<br /> "sigs.k8s.io/controller-runtime/pkg/client"<br /> "sigs.k8s.io/controller-runtime/pkg/log"<br /> <br /> examplev1alpha1 "github.com/infinilabs/hello-world-operator/api/v1alpha1"<br /> )<br /> <br /> // HelloWorldReconciler reconciles a HelloWorld object<br /> type HelloWorldReconciler struct {<br /> client.Client<br /> Scheme *runtime.Scheme<br /> }<br /> <br /> //+kubebuilder:rbac:groups=example.com,resources=helloworlds,verbs=get;list;watch;create;update;patch;delete<br /> //+kubebuilder:rbac:groups=example.com,resources=helloworlds/status,verbs=get;update;patch<br /> //+kubebuilder:rbac:groups=example.com,resources=helloworlds/finalizers,verbs=update<br /> //+kubebuilder:rbac:groups=core,resources=pods,verbs=get;list;watch;create;update;patch;delete<br /> <br /> // Reconcile is part of the main kubernetes reconciliation loop which aims to<br /> // move the current state of the cluster closer to the desired state.<br /> // For more details, check Reconcile and its Result here:<br /> // - <a href="https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.13.0/pkg/reconcile" rel="nofollow" target="_blank">https://pkg.go.dev/sigs.k8s.io ... ncile</a><br /> func (r *HelloWorldReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {<br /> log := log.FromContext(ctx)<br /> <br /> // 1. Fetch the HelloWorld instance<br /> helloWorld := &examplev1alpha1.HelloWorld{}<br /> err := r.Get(ctx, req.NamespacedName, helloWorld)<br /> if err != nil {<br /> if apierrors.IsNotFound(err) {<br /> // Object not found, return. Created objects are automatically garbage collected.<br /> // For additional cleanup logic use finalizers.<br /> log.Info("HelloWorld resource not found. Ignoring since object must be deleted")<br /> return ctrl.Result{}, nil<br /> }<br /> // Error reading the object - requeue the request.<br /> log.Error(err, "Failed to get HelloWorld")<br /> return ctrl.Result{}, err<br /> }<br /> <br /> // 2. Define the desired Pod<br /> pod := &corev1.Pod{<br /> ObjectMeta: metav1.ObjectMeta{<br /> Name: helloWorld.Name + "-pod",<br /> Namespace: helloWorld.Namespace,<br /> Labels: map[string]string{<br /> "app": helloWorld.Name,<br /> },<br /> },<br /> Spec: corev1.PodSpec{<br /> Containers: []corev1.Container{<br /> {<br /> Name: "hello-world",<br /> Image: "busybox",<br /> Command: []string{"sh", "-c", fmt.Sprintf("echo '%s' && sleep 3600", helloWorld.Spec.Message)},<br /> },<br /> },<br /> },<br /> }<br /> <br /> // 3. Set HelloWorld instance as the owner and controller<br /> if err := ctrl.SetControllerReference(helloWorld, pod, r.Scheme); err != nil {<br /> log.Error(err, "Failed to set controller reference")<br /> return ctrl.Result{}, err<br /> }<br /> <br /> // 4. Check if the Pod already exists<br /> found := &corev1.Pod{}<br /> err = r.Get(ctx, client.ObjectKey{Name: pod.Name, Namespace: pod.Namespace}, found)<br /> if err != nil && apierrors.IsNotFound(err) {<br /> log.Info("Creating a new Pod", "Pod.Namespace", pod.Namespace, "Pod.Name", pod.Name)<br /> err = r.Create(ctx, pod)<br /> if err != nil {<br /> log.Error(err, "Failed to create new Pod", "Pod.Namespace", pod.Namespace, "Pod.Name", pod.Name)<br /> return ctrl.Result{}, err<br /> }<br /> // Pod created successfully - return and requeue<br /> return ctrl.Result{Requeue: true}, nil<br /> } else if err != nil {<br /> log.Error(err, "Failed to get Pod")<br /> return ctrl.Result{}, err<br /> }<br /> <br /> // 5. Pod already exists - don't requeue<br /> log.Info("Skip reconcile: Pod already exists", "Pod.Namespace", found.Namespace, "Pod.Name", found.Name)<br /> return ctrl.Result{}, nil<br /> }<br /> <br /> // SetupWithManager sets up the controller with the Manager.<br /> func (r *HelloWorldReconciler) SetupWithManager(mgr ctrl.Manager) error {<br /> return ctrl.NewControllerManagedBy(mgr).<br /> For(&examplev1alpha1.HelloWorld{}).<br /> Owns(&corev1.Pod{}).<br /> Complete(r)<br /> }<br />

    4. 安装 CRD 到 Kubernetes 集群


    运行以下命令安装 CRD 到 Kubernetes 集群:

    bash<br /> make install<br />

    5. 运行 Operator


    运行以下命令在本地运行 Operator:

    bash<br /> make run<br />

    6. 创建 HelloWorld 资源


    创建一个名为 my-hello-world.yaml 的文件,内容如下:

    yaml<br /> apiVersion: example.com/v1alpha1<br /> kind: HelloWorld<br /> metadata:<br /> name: my-hello-world<br /> spec:<br /> name: my-hello-world<br /> message: "Hello World from Operator!"<br />

    使用 kubectl apply -f my-hello-world.yaml 创建资源。

    7. 验证


    使用 kubectl get pods 命令查看是否创建了名为 my-hello-world-pod 的 Pod。 使用 kubectl logs my-hello-world-pod 查看 Pod 的日志,确认是否输出了 "Hello World from Operator!"。

    总结


    恭喜你完成了第一个 Operator! 虽然这个 Operator 非常简单,但它展示了 Operator 的基本原理:监听自定义资源,并根据资源的状态来管理 Kubernetes 资源。 在接下来的系列中,我们将深入探讨 Operator 的更多高级特性。

    敬请期待下一篇博客!

    作者:罗厚付,极限科技(INFINI Labs)云上产品设计与研发负责人,拥有多年安全风控及大数据系统架构经验,主导过多个核心产品的设计与落地,日常负责运维超大规模 ES 集群(800+节点/1PB+数据)。
    原文:https://infinilabs.cn/blog/202 ... rt-1/

Easysearch 自动备份:快照生命周期管理

EasysearchINFINI Labs 小助手 发表了文章 • 0 个评论 • 1220 次浏览 • 2025-04-09 18:28 • 来自相关话题

之前介绍了 Easysearch 如何[使用 S3 进行快照备份](http://infinilabs.cn/blog/2025 ... ackup/),毕竟那是手工操作。Easysearch 还提供了[快照生命周期管理](https://docs.infinilabs.com/ea ... m_api/),能够按照策略自动创建、删除快照,极大地方便了用户的日常管理。

快照生命周期管理计划由创建计划、删除计划以及快照配置组成。

  • 创建计划和删除计划包含一个 cron 表达式,指定任务的频率和时间。
  • 删除计划可以指定快照保留策略,以保留过去 30 天的快照或仅保留最近的 10 个快照。
  • 快照配置包括快照的索引和存储库,并支持所有通过 API 创建快照时的参数。此外,还可以指定快照名称中使用的日期的格式和时区。

    快照生命周期创建的快照名称格式为 <policy _ name>-<date>-<Random number>

    比如, 计划每 2 分钟对索引 .infini_metrics-00001 创建一个快照,并且只保留最近的 2 个快照。

    plain<br /> curl -XPOST -uadmin:admin -H 'Content-Type: application/json' 'https://localhost:9200/_slm/policies/daily-policy' -d '<br /> {<br /> "description": "测试快照策略",<br /> "creation": {<br /> "schedule": {<br /> "cron": {<br /> "expression": "*/2 * * * *",<br /> "timezone": "Asia/Shanghai"<br /> }<br /> },<br /> "time_limit": "1h"<br /> },<br /> "deletion": {<br /> "schedule": {<br /> "cron": {<br /> "expression": "*/1 * * * *",<br /> "timezone": "Asia/Shanghai"<br /> }<br /> },<br /> "condition": {<br /> "max_count": 2<br /> },<br /> "time_limit": "1h"<br /> },<br /> "snapshot_config": {<br /> "date_format": "yyyy-MM-dd-HH:mm",<br /> "date_format_timezone": "Asia/Shanghai",<br /> "indices": ".infini_metrics-00001",<br /> "repository": "easysearch_s3_repo",<br /> "ignore_unavailable": "true",<br /> "include_global_state": "false"<br /> }<br /> }'<br />

    自动创建的快照如下图,一个 16 点 34 分创建的,另一个 16 点 36 分创建的。

    ![](https://infinilabs.cn/img/blog ... /1.png)

    ⚠️ 注意:虽然指定只保留最近两个快照,但因为创建和删除其实是两个独立的任务,所以会短暂出现存在 3 个快照的现象,等删除任务调度一次就会删除多余的快照了。

    如果遇到维护需要停止自动备份,也有相应的 API 来启停快照策略。

    停止策略

    plain<br /> curl -XPOST -uadmin:admin 'https://localhost:9200/_slm/policies/daily-policy/_start'<br />

    启动策略

    plain<br /> curl -XPOST -uadmin:admin 'https://localhost:9200/_slm/policies/daily-policy/_stop'<br />

    查看策略

    plain<br /> curl -XGET -uadmin:admin 'https://localhost:9200/_slm/policies'<br />

    删除策略

    plain<br /> curl -XDELETE -uadmin:admin 'https://localhost:9200/_slm/policies/daily-policy?pretty'<br />

    更多详细信息请参考[官方文档](https://docs.infinilabs.com/ea ... m_api/)。

    关于 Easysearch


    ![](https://infinilabs.cn/img/blog ... er.png)

    INFINI Easysearch 是一个分布式的搜索型数据库,实现非结构化数据检索、全文检索、向量检索、地理位置信息查询、组合索引查询、多语种支持、聚合分析等。Easysearch 可以完美替代 Elasticsearch,同时添加和完善多项企业级功能。Easysearch 助您拥有简洁、高效、易用的搜索体验。

    官网文档:<https://docs.infinilabs.com/easysearch/main/>;

    作者:杨帆,极限科技(INFINI Labs)高级解决方案架构师、《老杨玩搜索》栏目 B 站 UP 主,拥有十余年金融行业服务工作经验,熟悉 Linux、数据库、网络等领域。目前主要从事 Easysearch、Elasticsearch 等搜索引擎的技术支持工作,服务国内私有化部署的客户。

Easysearch S3 备份实战

EasysearchINFINI Labs 小助手 发表了文章 • 0 个评论 • 1229 次浏览 • 2025-04-09 18:28 • 来自相关话题

Easysearch 内置了 S3 插件,这意味着用户可以直接使用该功能而无需额外安装任何插件。通过这一内置支持,用户能够方便快捷地执行 Amazon S3 上的数据快照操作。这种设计不仅简化了配置流程,也提高了工作效率,使得数据备份或迁移等任务变得更加简单易行。对于需要频繁与 S3 存储服务交互的应用场景来说,这是一个非常实用且高效的功能特性。

Minio


MinIO 是一款高性能的开源对象存储系统,专为存储大量的非结构化数据而设计。它提供了与 Amazon S3 兼容的 API,本次测试我们使用 MinIO 作为存储仓库。

建立 Bucket


进入 MinIO 管理界面,创建测试用的 bucket。

![](https://infinilabs.cn/img/blog ... /1.png)

![](https://infinilabs.cn/img/blog ... /2.png)

创建 Access key


测试的 Access Key 设置的比较简单。

![](https://infinilabs.cn/img/blog ... /3.png)

Easysearch


为了能够使用 S3 存储,Easysearch 要进行必要的配置。

easyearch.yml


修改 easysearch.yml 配置 S3 信息。

plain<br /> s3.client.default.endpoint: 172.17.0.4:9000<br /> s3.client.default.protocol: http<br />

⚠️ 注意:修改了 easysearch.yml 需要重启生效。

keystore


为了安全,我们把 S3 的 Access key 信息加入 keystore 中。

plain<br /> bin/easysearch-keystore add s3.client.default.access_key #输入easysearch<br /> bin/easysearch-keystore add s3.client.default.secret_key #输入easysearch<br /> bin/easysearch-keystore list<br />

注册存储库


在 INFINI Console 的开发工具中,使用命令注册 s3 存储库。

plain<br /> PUT /_snapshot/easysearch_s3_repo?verify=true&pretty<br /> {<br /> "type": "s3",<br /> "settings": {<br /> "bucket": "easysearch-bucket",<br /> "compress": true<br /> }<br /> }<br />

更多参数请查看[文档](https://infinilabs.cn/docs/lat ... zon-s3)。

创建快照


在 [INFINI Console](https://infinilabs.cn/products/console/) 的开发工具中,使用命令创建快照。

![](https://infinilabs.cn/img/blog ... /4.png)

![](https://infinilabs.cn/img/blog ... /5.png)

备份执行完成。

S3 查看快照


我们在 INFINI Console 中通过命令创建了快照,可以在 MinIO 的 bucket 中进行进一步确认是否有相关文件。

![](https://infinilabs.cn/img/blog ... /6.png)

![](https://infinilabs.cn/img/blog ... /7.png)

快照还原测试


删除以备份索引 .infini_metrics-0001,删除前先查看下索引情况,文档数 557953。

![](https://infinilabs.cn/img/blog ... /8.png)

删除 .infini_metrics-0001 索引。

![](https://infinilabs.cn/img/blog ... /9.png)

确认 .infini_metrics-0001 索引已被删除。

![](https://infinilabs.cn/img/blog ... 10.png)

进行快照还原。

![](https://infinilabs.cn/img/blog ... 11.png)

验证恢复索引。

![](https://infinilabs.cn/img/blog ... 12.png)

索引 .infini_metrics-0001 已经还原了,文档数也一致。

小结


Easysearch 使用 S3 存储备份的步骤如下:

  1. S3 服务建立 Bucket、Access Key。
  2. Easysearch 编辑 easysearch.yml 添加 S3 服务 endpoint 信息。
  3. easysearch-keystore 添加 S3 的 Access key 信息,加密保存。
  4. Easysearch 注册 S3 存储仓库。
  5. 执行快照备份。

    关于 Easysearch


    ![](https://infinilabs.cn/img/blog ... er.png)

    INFINI Easysearch 是一个分布式的搜索型数据库,实现非结构化数据检索、全文检索、向量检索、地理位置信息查询、组合索引查询、多语种支持、聚合分析等。Easysearch 可以完美替代 Elasticsearch,同时添加和完善多项企业级功能。Easysearch 助您拥有简洁、高效、易用的搜索体验。

    官网文档:<https://docs.infinilabs.com/easysearch/main/>;

    作者:杨帆,极限科技(INFINI Labs)高级解决方案架构师、《老杨玩搜索》栏目 B 站 UP 主,拥有十余年金融行业服务工作经验,熟悉 Linux、数据库、网络等领域。目前主要从事 Easysearch、Elasticsearch 等搜索引擎的技术支持工作,服务国内私有化部署的客户。

【搜索客社区日报】第2018期 (2025-04-09)

社区日报kin122 发表了文章 • 0 个评论 • 1238 次浏览 • 2025-04-09 17:03 • 来自相关话题

1.Query Rewriting查询改写方案汇总
https://zhuanlan.zhihu.com/p/26631768854

2.RAG结合上下文提升召回成功率|Claude
https://zhuanlan.zhihu.com/p/721306620

3.RAG探索之路的血泪史及曙光
https://zhuanlan.zhihu.com/p/664921095

4.加速 HNSW 图的合并
https://mp.weixin.qq.com/s/5s2xuXKaTmznTo7bijeVqA


编辑:kin122    
更多资讯:http://news.searchkit.cn

【搜索客社区日报】第2017期 (2024-04-08)

社区日报God_lockin 发表了文章 • 0 个评论 • 1477 次浏览 • 2025-04-08 09:41 • 来自相关话题

1. 不看微信?拿Kibana把你从slack和telegram里炸出来(需要梯子)
https://faun.pub/how-to-config ... 29bb4
2. 一个月撸150亿的日志,你来你也行(需要梯子)
https://medium.com/%40lunguh/h ... 33ab4
3. 无痛更新ES证书可行不?(需要梯子)
https://medium.com/%40ashishof ... b2a7c
编辑:斯蒂文
更多资讯:http://news.searchkit.cn
 

【搜索客社区日报】第2015期 (2025-04-03)

社区日报Se7en 发表了文章 • 0 个评论 • 2208 次浏览 • 2025-04-03 18:01 • 来自相关话题

1.Nacos 发布 MCP Registry,实现存量应用接口“0改动”升级到 MCP 协议
https://mp.weixin.qq.com/s/bgDd82lj0jBUWifLMNByjw
2.自动化新时代:OWL、CRAB 与 MCP 如何打通“最后一公里”
https://mp.weixin.qq.com/s/jvQRFRlADYJUtDyYQ29qQQ
3.Nvidia 收购 Run:ai 后开源的 KAI-Scheduler vs HAMi:GPU 共享的技术路线分析与协同展望
https://mp.weixin.qq.com/s/6qEdQjjh3YeSnCxGymHnHQ
4.学习如何设计大型系统
https://github.com/donnemartin ... rimer

编辑:Se7en
更多资讯:http://news.searchkit.cn

【搜索客社区日报】第2014期 (2025-04-02)

社区日报kin122 发表了文章 • 0 个评论 • 2377 次浏览 • 2025-04-02 13:40 • 来自相关话题

1.架构性能跃迁!iLogTail超大规模日志采集最佳实践
https://mp.weixin.qq.com/s/YRxn8Ur9Ykl6Q0ZKyuWbxQ

2.深度剖析Elasticsearch倒排索引数据结构
https://mp.weixin.qq.com/s/hDVxDCLD9UQbBk7sqcoPFQ

3.为什么 Apache Doris 是比 Elasticsearch 更好的实时分析替代方案?
https://mp.weixin.qq.com/s/JgjE-hk_MpRyXFHPhhYnyA

4.RAG与微调的实用比较
https://mp.weixin.qq.com/s/VHq_3mCNP3G9rakKPcbJtg

编辑:kin122 
更多资讯:http://news.searchkit.cn