愚者求师之过,智者从师之长。

从 Redis 开源协议变更到 ES 国产化:一次技术自主的机遇

Muses 发表了文章 • 0 个评论 • 2832 次浏览 • 2024-04-11 16:05 • 来自相关话题

引言


近日,Redis Labs 宣布其主导的开源项目 Redis 将采用双重源代码可用许可证(RSALv2)和服务器端公共许可证(SSPLv1)。这一重大决策标志着 Redis 从传统的 BSD 许可证向更加严格的控制权转变,同时也引发了广泛的社区和行业讨论。这不仅是一个关于许可证变更的故事,更是关于开源社区如何响应,以及这一变化如何激发对国产技术探索和发展的深刻思考。Redis,作为最受欢迎的开源键值存储数据库之一,其开源协议的变更反映了开源软件在商业化道路上的挑战和压力。Redis Labs 的 CEO Rowan Trollope 指出,这一变化旨在防止云服务提供商免费使用 Redis 代码,同时促进 Redis 社区的可持续发展和创新。

![](https://infinilabs.com/img/blo ... is.png)

Redis 协议变更的深远影响


Redis 决定放弃 BSD 协议,转而采用双重源代码可用许可证(RSALv2 和 SSPLv1),标志着开源界的一个重要转折点。这一变化不仅影响了 Redis 本身,更引发了社区成员和技术行业的激烈讨论,许多人担心这将限制 Redis 的开源精神和广泛应用。然而,也有声音认为,这为其他开源项目,如 KeyDB、Dragonfly 和 Garnet 等,提供了发展的机遇,尤其是在提供与 Redis 兼容的替代解决方案方面。尽管 Redis 的这一变更在技术和法律上引发了争议,它也激发了开源社区对于如何在维护开源精神和寻求商业可持续性之间找到平衡的探索。此外,Redis 团队对于保持客户端库的开源许可和继续支持开源社区版的承诺,展示了一种尝试在新的许可模式下保持开放性和可接入性的方法。由于 Redis 的广泛应用,其协议变更对云服务商、Linux 发行版,甚至整个开源软件生态都产生了不小的冲击。一方面,云服务提供商需要重新评估其服务模型;另一方面,一些 Linux 发行版可能需要考虑将 Redis 从其软件仓库中移除。

ES 国产化的契机


Redis 开源协议的变更同时也让人们重新审视其他关键技术,特别是 Elasticsearch(ES)的依赖和发展。ES 作为一个强大的搜索和数据分析引擎,在全球范围内被广泛使用。随着对开源项目商业化模式的重新考量,中国开发者和企业开始寻求国产化的 ES 替代品,旨在减少对外部技术的依赖,同时推动国内技术生态的多元化和自主创新。但是国产化的探索并非没有挑战。从技术兼容性、性能优化到社区生态建设,每一步都需要深思熟虑和持续的努力。然而,Redis 的许可证变更为国内技术自主提供了一个独特的视角,鼓励开发者、企业乃至政府机构更加积极地参与到开源技术的本土化和创新中来。Redis 开源协议的变更引发的讨论和行动,凸显了开源社区对于自身未来发展方向的深刻反思。这一变革不仅关乎一个项目的许可模式转变,更触及到开源项目如何在保持开放和自由的同时,寻找到可持续发展的道路。此外,它也促使更多的开源项目和企业思考如何在全球化的技术生态中保持竞争力和影响力。

Easysearch:国产化的新选择


针对这一需求,极限科技 隆重推出了 [Easysearch](https://infinilabs.cn/docs/latest/easysearch) 搜索引擎软件,旨在提供一个与 Elasticsearch 兼容的国产化解决方案。Easysearch 不仅支持原生 Elasticsearch 的 DSL 查询语法,还提供了诸多企业级功能的增强,如更高的性能、稳定性和扩展性,以及更加丰富的安全管理和数据压缩功能。这表明,国产化技术的发展不仅是为了替代,更是在原有基础上进行创新和优化。ES 国产化解决方案 Easysearch 的推出,是响应国家对信创、自主可控战略布局的具体行动。通过提供兼容性强、功能丰富且稳定的国产技术替代品,不仅有助于减少对外部技术的依赖,也为国内技术生态的繁荣和创新贡献力量。这一过程中,既涵盖了对现有技术的深入理解和应用,也包含了对新技术、新方法的探索和实践。

![](https://infinilabs.com/img/blo ... er.png)

结语


Redis 开源协议的变更和 Elasticsearch 国产化解决方案的兴起,共同反映了当前技术世界中开源与商业、国际与国产之间复杂而微妙的关系。这一趋势不仅仅是技术领域的变化,更是全球化背景下,各国在技术自主、安全与发展方面所做出的战略性调整。随着更多开源项目和技术面临类似的挑战,我们或许可以预见,技术自主和开源创新将成为推动未来技术发展的两大关键力量。

参考


探索搜索引擎的新时代:Windows 安装 Easysearch 完全指南

Muses 发表了文章 • 0 个评论 • 1242 次浏览 • 2024-03-19 21:07 • 来自相关话题

相信最近大家都已经听过Easysearch的名头,成功拿下了墨天轮搜索型数据库的榜首!什么?您不知道?那我再给您介绍下:
INFINI Easysearch 是一个分布式的近实时搜索与分析引擎,核心引擎基于开源的 Apache Lucene。Easysearch 的目标是提供一个轻量级的 Elasticsearch 可替代版本,并继续完善和支持更多的企业级功能。与 Elasticsearch 相比,Easysearch 更关注在搜索业务场景的优化和继续保持其产品的简洁与易用性。
相信看完了上面您已经对使用Easysearch有了想法,不要想,行动!我将带领您在windows环境中使用[Easysearch](https://infinilabs.com/download/?product=easysearch),有几种安装方法可供选择!

方法一:使用Docker


对于已在Windows系统上安装了Docker的用户来说,通过Docker安装Easysearch是最直接高效的方法。接下来我将介绍Docker部署Easysearch的方法,如果没有安装Docker请跳过!

Docker 环境下使用 Easysearch


在使用 Docker 运行 Easysearch 之前,请确保已进行系统调优并安装好Docker服务,且Docker服务正常运行。

最快方式:启动临时的docker容器,可以从前台查看到admin的初始密码

<br /> bash
docker run --name easysearch -p 9200:9200 dockerproxy.com/infinilabs/easysearch:latest
```

个性配置

从宿主机挂载数据目录及日志目录,并配置jvm内存为512m。

  1. 在宿主机上创建目录
    <br /> bashCopy code<br /> sudo mkdir -p /data/easysearch/{data,logs}<br />

  2. 修改目录权限
    ```
    bashCopy code

    容器内es用户的uid为602,通过调整宿主机的目录权限,确保在容器内部es用户有权限读写挂载的数据卷

    sudo chown -R 602.602 /data/easysearch
    ```

  3. 后台运行容器
    <br /> bashCopy code<br /> docker run -d --restart always -p 9200:9200 \<br /> -e ES_JAVA_OPTS="-Xms512m -Xmx512m" \<br /> -v /data/easysearch/data:/app/easysearch/data \<br /> -v /data/easysearch/logs:/app/easysearch/logs \<br /> --name easysearch --hostname easysearch \<br /> dockerproxy.com/infinilabs/easysearch:latest<br />

  4. 查看初始密码
    ```
    bashCopy code

    由于以上容器是后台启动,需要通过日志找出admin的初始密码

    docker logs easysearch 2>/dev/null | grep -w Usage
    ```

    容器启停


  5. 启动容器
    <br /> bashCopy code<br /> docker start easysearch<br />

  6. 停止容器
    <br /> bashCopy code<br /> docker stop easysearch<br />
    后续验证工作,请继续查看安装指南。

    方法二:不使用HTTPS安装Easysearch

    在某些情况下,您可能需要或者偏好不通过HTTPS方式进行安装。这种方法需要您手动下载并设置Easysearch及其依赖。

    步骤1:下载并安装Easysearch

    首先,手动下载 Easysearch 并将其解压到您希望的安装目录。

    步骤2:下载并安装JDK


  7. 手动下载[JDK](https://release.infinilabs.com ... 64.zip)安装包。
  8. 将JDK解压到Easysearch安装目录下。
  9. 将解压出来的JDK目录重命名为jdk

    步骤3:修改Easysearch配置

    鉴于Windows默认不包含openssl,生成证书可能较为困难。您可以通过修改config/easysearch.yml文件来绕过证书验证:
    <br /> security.enabled: false<br />

    方法三:通过git-for-windows安装

    对于喜欢使用命令行的用户,可以通过安装git-for-windows,利用bash环境来执行安装命令。

    步骤1:安装Easysearch

    通过以下在线脚本命令安装Easysearch:
    <br /> bashCopy code<br /> curl -sSL <a href="http://get.infini.cloud" rel="nofollow" target="_blank">http://get.infini.cloud</a> | bash -s -- -p easysearch -d /d/opt/easysearch<br />

    步骤2:下载并安装JDK


  10. 使用curl命令将JDK下载到指定目录:
    <br /> bashCopy code<br /> curl -# <a href="https://release.infinilabs.com/easysearch/jdk/zulu17.42.19-ca-jdk17.0.7-win_x64.zip" rel="nofollow" target="_blank">https://release.infinilabs.com ... 4.zip</a> -o /d/opt/jdk.zip<br />

  11. 解压JDK文件,并将解压后的目录重命名为jdk
    <br /> bashCopy code<br /> cd /d/opt/easysearch && unzip -q /d/opt/jdk.zip<br /> mv zulu* jdk<br />

    步骤3:设置JAVA_HOME环境变量

    配置JAVA_HOME环境变量,以确保Easysearch能正确找到JDK。
    <br /> bashCopy code<br /> export JAVA_HOME=/d/opt/easysearch/jdk<br />

    步骤4:初始化证书、密码和插件

    执行以下命令,初始化所需的配置:
    <br /> bashCopy code<br /> bin/initialize.sh<br />

    步骤5:运行Easysearch

    最后,使用以下命令启动Easysearch:
    <br /> bashCopy code<br /> bin/easysearch.bat<br />
    通过以上任一方法,您都应该能够成功在Windows系统上安装并运行Easysearch。请选择最适合您的需求和环境的安装方法。
    请根据Easysearch和JDK的最新版本,适时更新上述命令和下载链接。接下来,请继续完成验证工作。

    验证工作

    为了保证Easysearch数据安全,初始化脚本会为admin用户生成随机的密码,如果使用Docker运行Easysearch或执行初始化脚本时同意记录初始密码到日志文件,则可在Docker日志文件或logs/initialize.log中找到admin用户对应的初始化密码。
    由于初始脚本会自动覆盖集群上次使用的证书及内置的admin用户密码,请勿多次运行!如果您忘记了初始密码,可以通过内置的证书来进行密码重置。
    ```
    bashCopy code

    根据初始化脚本生成的随机密码访问 Easysearch 的 REST API

    curl -ku admin:xxx https://localhost:9200
    ```
    也可以在浏览器中输入网址 https://localhost:9200/,即可验证Easysearch是否完成启动。推荐使用[INFINI Console](https://infinilabs.com/docs/latest/console/)来进行集群管理,功能更加强大和方便。
    注:各类客户端及周边工具,如 Logstash、Filebeat 请使用7.10.2 oss版本来连接Easysearch。并打开config/easysearch.yml中的配置项elasticsearch.api_compatibility: true

    如果你已经按照上面的步骤完成了安装,那么接下来请尽情的使用Easysearch吧!如果在安装过程中出现了问题的请私聊我!对了,希望在其他环境中部署Easysearch的也可以查询我们的安装指南,上面有详细的安装步骤!祝你好运!

Elasticsearch 国产化

yangmf2040 发表了文章 • 0 个评论 • 1271 次浏览 • 2024-03-16 16:36 • 来自相关话题

背景

Elasticsearch 这些年来在搜索领域一直是领头羊。国内也有非常多的企业在使用 Elasticsearch 来做查询搜索、数据分析、安全分析等等。甚至一些很重要的行业、系统都在使用 Elasticsearch。在使用 Elasticsearch 的道路上狂飙的时候,我们也观察到了一些问题:

  1. Elasticsearch 不再是开源软件了。
  2. Elastic 公司退出了中国直销市场,不提供本土化支持了。
  3. 国家对信创、自主可控的战略化布局。
  4. 国际形势从合作共赢到自闭对垒。
  5. Elasticsearch 软件本身安全问题频发。
  6. Elasticsearch 软件在性能、稳定性和扩展性方面存在很大的提升空间。

    基于以上这些问题,推出一个 Elasticsearch 国产化解决方案就很有必要了。我们的解决方案是推出一款名为 Easysearch 的软件,作为 Elasticsearch 国产化替代 。
    出发点是在兼容原 Elasticsearch 软件的基础之上,完善更多的企业级功能,同时提高产品的性能、稳定性和扩展性。
    下面我将从几个方面简单介绍下 Easysearch 软件。

    兼容性

    支持原生 Elasticsearch 的 DSL 查询语法,原业务代码无需调整。
    支持 SQL ,方便熟悉 SQL 的开发人员上手分析数据。
    兼容 Elasticsearch 的 SDK。
    兼容现有索引存储格式。
    支持冷热架构和索引生命周期,真正做到无缝衔接。

    功能增强

    提供企业级的安全管理,可对接 LDAP、AD 认证。
    重构分布式架构,保持稳定的同时,能支持更大规模的数据。
    在不降低性能的同时,实现更高压缩比的数据压缩,直接节省磁盘 40% 以上。
    支持 KNN、异步搜索、数据脱敏、可搜索快照、审计等企业级功能。

    容灾

    支持基于 CDC 的集群复制技术,实现同版本间的容灾。
    支持基于请求双写的复制技术,实现跨版本容灾。

    信创

    全面适配国产 CPU、操作系统,并获得厂家认证。
    ![](https://www.infinilabs.com/img ... ge.png)

    迁移方案

    支持原索引存储格式,可通过快照备份直接恢复到 Easysearch 集群。
    提供迁移工具,直接可视化操作迁移数据。

    简单的介绍就到这里了,更多信息请访问:[https://www.infinilabs.com/products/easysearch](https://www.infinilabs.com/products/easysearch/)

    最后

    如有需要请联系我,让我们一起位祖国的信创事业添砖加瓦。
    ![](https://www.infinilabs.com/img ... fo.jpg)






Easysearch 内核完善之 OOM 内存溢出优化案例一则

liaosy 发表了文章 • 0 个评论 • 1001 次浏览 • 2024-03-15 10:37 • 来自相关话题

![](https://www.infinilabs.com/img ... pg.png)

最近某客户在使用 Easysearch 做聚合时,报出 OOM 导致掉节点的问题,当时直接让客户试着调整 indices.breaker.request.limit ,但是不起作用,于是又看了下 Easysearch 在断路器相关的代码,并自己测试了下。

断路器的种类和作用


Easysearch 内部有个 Circuit breaker 机制,目的是防止各种请求的负载过大导致 OutOfMemoryError,比较常用的断路器有 7 种,分别是:

  • Parent circuit breaker 父断路器
  • Field data circuit breaker fielddata 断路器
  • Request circuit breaker 请求断路器
  • In flight requests circuit breaker 传输请求断路器
  • Accounting requests circuit breaker lucene 内存占用断路器
  • Script compilation circuit breaker 脚本编译断路器
  • Regex circuit breaker 正则表达式断路器

    其中在执行消耗内存较多的聚合查询时,Request circuit breaker 用得最多。

    复现测试


    我在模拟客户场景测试聚合查询时,发现断路器并没有覆盖查询的整个流程,仍然会有 OOM 的风险。我测试了一个高基数 5 百万的 Terms aggregation,就没有触发断路,而是在等待了 1 分多钟后直接 OOM 了。我的测试环境是单节点 内存配置为 -Xmx1g,测试索引只有 1 个 shard。

    测试语句如下:

    <br /> curl -X GET "localhost:9211/leader-01/_search?pretty" -H 'Content-Type: application/json' -d'<br /> {<br /> "size": 1,<br /> "aggs": {<br /> "a": {<br /> "terms": { "field": "agent.id.keyword", "size": 5000000 }<br /> }<br /> }<br /> }' > a.txt<br />

    Easysearch OOM 日志:

    ![](https://infinilabs.com/img/blo ... 1.webp)

    内存泄漏分析


    使用 MemoryAnalyzer 分析生成的 jvm 堆转储文件:

    ![](https://infinilabs.com/img/blo ... 2.webp)

    最大的内存占用来自 Java 线程java.lang.Thread @ 0x7c8bb1d00。这个线程浅层(Shallow)保留的对象占用了 112.8MB 内存。但该线程实际保留(Retained)的对象内存占用高达 851 MB,成为整个内存占用的绝对大头。

    进一步查看 Leak Suspects

    ![](https://infinilabs.com/img/blo ... 3.webp)

    非常明确的给出了具体的内存泄露的对象:StringTerms$Bucket[7500010]

    数组长度达到了七百五十万,占用内存:731,001,720 字节(占总内存的 68.65%)。

    按照提示的GlobalOrdinalsStringTermsAggregator.java:586 行,去查看代码,实际上是将收集完的OrdBucket 转换为 StringTerms.Bucket,并且有一个 copy BytesRef的操作。

    至此,原因和解决办法都清楚了,只要在转换之前预估一下将要增长的内存并调用断路器检测一下内存,一旦超出允许范围就快速触发 CircuitBreakingException,避免长时间等待后 OOM 引起的节点宕机了。

    最新版 Elasticsearch 对比


    作为对比,我又测试了下 Elasticsearch 最新版本 8.12.2,同样的测试环境和测试方法,结果依然是 OOM:

    ![](https://infinilabs.com/img/blo ... 4.webp)

    从这里可以看出 Elasticsearch 即使是最新版的断路器机制也还有很多改进的余地,比如增加对有 OOM 风险查询的覆盖率,还有就是在触发 GC 时,对 GC 堆内存回收的判断过于简单。

    Easysearch 最新版本的改进


    Easysearch 刚刚发布的 1.7.1 版本已经增加了上面的改进,后面也会持续改进查询聚合操作的内存控制,最新版本的跨集群复制(CCR)也增加了对 source_reuse 索引的支持,能更好的满足客户降本增效的需求,欢迎大家下载试用。

    附官网下载链接:<https://www.infinilabs.com/dow ... gt%3B

    关于 Easysearch


    ![about easysearch](https://www.infinilabs.com/img ... er.png)

    INFINI Easysearch 是一个分布式的近实时搜索与分析引擎,核心引擎基于开源的 Apache Lucene。Easysearch 的目标是提供一个轻量级的 Elasticsearch 可替代版本,并继续完善和支持更多的企业级功能。 与 Elasticsearch 相比,Easysearch 更关注在搜索业务场景的优化和继续保持其产品的简洁与易用性。

    官网文档:<https://www.infinilabs.com/doc ... gt%3B

    作者:张磊,原文:<https://www.infinilabs.com/blo ... gt%3B

INFINI Labs 产品更新 | Easysearch 1.7.1发布,改进跨集群复制的数据加载等

liaosy 发表了文章 • 0 个评论 • 1622 次浏览 • 2024-03-04 15:25 • 来自相关话题

![release](https://www.infinilabs.com/img ... er.png)

INFINI Labs 产品又更新啦~,包括 Console,Gateway,Agent 1.23.0 和 Easysearch 1.7.1。本次各产品更新了很多亮点功能,如 Console 优化实例管理中增加磁盘空闲空间显示,Easysearch 改进 HierarchyCircuitBreakerService 并添加断路器、改进跨集群复制的数据加载,增加对 source_reuse 索引的支持等。欢迎大家下载体验。

以下是本次更新的详细说明。


INFINI Easysearch v1.7.1


INFINI Easysearch 是一个分布式的近实时搜索与分析引擎,核心引擎基于开源的 Apache Lucene。Easysearch 的目标是提供一个轻量级的 Elasticsearch 可替代版本,并继续完善和支持更多的企业级功能。

Easysearch 本次更新如下:

Bug fix


  • 修复 source_reuse 与字段别名冲突
  • 改进 HierarchyCircuitBreakerService 并添加断路器
  • 修复 _meta 不为空且 启用 source_reuse 时的映射解析错误
  • 修复 source_reuse 下对多值还原不正确的问题

    Improvements


  • 改进 HierarchyCircuitBreakerService 并添加断路器
  • 改进跨集群复制的数据加载,增加对 source_reuse 索引的支持

    INFINI Console v1.23.0


    INFINI Console 是一款非常轻量级的多集群、跨版本的搜索基础设施统一管控平台。通过对流行的搜索引擎基础设施进行跨版本、多集群的集中纳管, 企业可以快速方便的统一管理企业内部的不同版本的多套搜索集群。

    Console 在线体验: <http://demo.infini.cloud>; (用户名/密码:readonly/readonly)。

    Console 本次更新如下:

    Bug fix


  • 修复数据迁移中数据分片范围因精度导致数据溢出显示为负数
  • 修复删除实例队列后消费的 Offset 未重置问题
  • 修复网友提出的各种问题,如集群设置默认打开节点、索引采集等

    Improvements


  • 优化初始化配置向导,分步骤执行
  • 优化实例管理中增加磁盘空闲空间显示
  • 优化实例队列名称显示

    INFINI Gateway v1.23.0


    INFINI Gateway 是一个面向搜索场景的高性能数据网关,所有请求都经过网关处理后再转发到后端的搜索业务集群。基于 INFINI Gateway 可以实现索引级别的限速限流、常见查询的缓存加速、查询请求的审计、查询结果的动态修改等等。

    Gateway 本次更新如下:

    Bug fix


  • 修复删除实例队列后消费的 Offset 未重置问题


    期待反馈


    欢迎下载体验使用,如果您在使用过程中遇到如何疑问或者问题,欢迎前往 INFINI Labs Github(<https://github.com/infinilabs>;) 中的对应项目中提交 Feature Request 或提交 Bug。

  • 下载地址: <https://www.infinilabs.com/download>;

    您还可以通过邮件联系我们:hello@infini.ltd

    或者拨打我们的热线电话:(+86) 400-139-9200

    欢迎加入 Discord 聊天室:<https://discord.gg/4tKTMkkvVX>;

    也欢迎大家微信扫码添加小助手(INFINI-Labs),加入用户群一起讨论交流。

    ![联系我们](https://www.infinilabs.com/img ... ew.jpg)


    关于极限科技(INFINI Labs)


    ![INFINI Labs](https://www.infinilabs.com/img ... bs.png)

    极限科技,全称极限数据(北京)科技有限公司,是一家专注于实时搜索与数据分析的软件公司。旗下品牌极限实验室(INFINI Labs)致力于打造极致易用的数据探索与分析体验。

    极限科技是一支年轻的团队,采用天然分布式的方式来进行远程协作,员工分布在全球各地,希望通过努力成为中国乃至全球企业大数据实时搜索分析产品的首选,为中国技术品牌输出添砖加瓦。

    官网:<https://www.infinilabs.com>;

如何防止 Elasticsearch 服务 OOM?

yangmf2040 发表了文章 • 0 个评论 • 1942 次浏览 • 2024-02-26 10:12 • 来自相关话题

Elasticsearch(简称:ES) 和传统关系型数据库有很多区别, 比如传统数据中普遍都有一个叫“最大连接数”的设置。目的是使数据库系统工作在可控的负载下,避免出现负载过高,资源耗尽,谁也无法登录的局面。

那 ES 在这方面有类似参数吗?答案是没有,这也是为何 ES 会被流量打爆的原因之一。

针对大并发访问 ES 服务,造成 ES 节点 OOM,服务中断的情况,极限科技旗下的 [INFINI Gateway](https://www.infinilabs.com/products/gateway/) 产品(以下简称 “极限网关”)可从两个方面入手,保障 ES 服务的可用性。

  1. 限制最大并发访问连接数。
  2. 限制非重要索引的请求速度,保障重要业务索引的访问速度。

    下面我们来详细聊聊。

    架构图


    ![](https://www.infinilabs.com/img ... /0.png)
    所有访问 ES 的请求都发给网关,可部署多个网关。

    限制最大连接数


    在网关配置文件中,默认有最大并发连接数限制,默认最大 10000。

    ```
    entry:

    • name: my_es_entry
      enabled: true
      router: my_router
      max_concurrency: 10000
      network:
      binding: $[[env.GW_BINDING]]

      See gateway.disable_reuse_port_by_default for more information.

      reuse_port: true
      ```

      使用压测程序测试,看看到达10000个连接后,能否限制新的连接。
      ![](https://www.infinilabs.com/img ... /1.png)
      超过的连接请求,被丢弃。更多信息参考[官方文档](https://www.infinilabs.com/doc ... entry/)。

      限制索引写入速度


      我们先看看不做限制的时候,测试环境的写入速度,在 9w - 15w docs/s 之间波动。虽然峰值很高,但不稳定。
      ![](https://www.infinilabs.com/img ... /2.png)
      接下来,我们通过网关把写入速度控制在最大 1w docs/s 。
      对网关的配置文件 gateway.yml ,做以下修改。

      ```yaml
      env: # env 下添加
      THROTTLE_BULK_INDEXING_MAX_BYTES: 40485760 #40MB/s
      THROTTLE_BULK_INDEXING_MAX_REQUESTS: 10000 #10k docs/s
      THROTTLE_BULK_INDEXING_ACTION: retry #retry,drop
      THROTTLE_BULK_INDEXING_MAX_RETRY_TIMES: 10 #1000
      THROTTLE_BULK_INDEXING_RETRY_DELAY_IN_MS: 100 #10

      router: # route 部分修改 flow

    • name: my_router
      default_flow: default_flow
      tracing_flow: logging_flow
      rules:
      • method:
        • "*"
          pattern:
        • "/_bulk"
        • "/{any_index}/_bulk"
          flow:
        • write_flow

          flow: #flow 部分增加下面两段
    • name: write_flow
      filter:
      • flow:
        flows:
        • bulking_indexing_limit
      • elasticsearch:
        elasticsearch: prod
        max_connection_per_node: 1000
    • name: bulking_indexing_limit
      filter:
      • bulk_request_throttle:
        indices:
        "test-index":
        max_bytes: $[[env.THROTTLE_BULK_INDEXING_MAX_BYTES]]
        max_requests: $[[env.THROTTLE_BULK_INDEXING_MAX_REQUESTS]]
        action: $[[env.THROTTLE_BULK_INDEXING_ACTION]]
        retry_delay_in_ms: $[[env.THROTTLE_BULK_INDEXING_RETRY_DELAY_IN_MS]]
        max_retry_times: $[[env.THROTTLE_BULK_INDEXING_MAX_RETRY_TIMES]]
        message: "bulk writing too fast" #触发限流告警message自定义
        log_warn_message: true

        ```

        再次压测,test-index 索引写入速度被限制在了 1w docs/s 。
        ![](https://www.infinilabs.com/img ... /3.png)

        限制多个索引写入速度


        上面的配置是针对 test-index 索引的写入速度控制。如果想添加其他的索引,新增一段配置即可。
        比如,我允许 abc 索引写入达到 2w docs/s,test-index 索引最多不超过 1w docs/s ,可配置如下。

        ```yaml

    • name: bulking_indexing_limit
      filter:
      • bulk_request_throttle:
        indices:
        "abc":
        max_requests: 20000
        action: drop
        message: "abc doc写入超阈值" #触发限流告警message自定义
        log_warn_message: true
        "test-index":
        max_bytes: $[[env.THROTTLE_BULK_INDEXING_MAX_BYTES]]
        max_requests: $[[env.THROTTLE_BULK_INDEXING_MAX_REQUESTS]]
        action: $[[env.THROTTLE_BULK_INDEXING_ACTION]]
        retry_delay_in_ms: $[[env.THROTTLE_BULK_INDEXING_RETRY_DELAY_IN_MS]]
        max_retry_times: $[[env.THROTTLE_BULK_INDEXING_MAX_RETRY_TIMES]]
        message: "bulk writing too fast" #触发限流告警message自定义
        log_warn_message: true
        ```

        限速效果如下
        ![](https://www.infinilabs.com/img ... /4.png)

        限制读请求速度


        我们先看看不做限制的时候,测试环境的读取速度,7w qps 。
        ![](https://www.infinilabs.com/img ... /5.png)
        接下来我们通过网关把读取速度控制在最大 1w qps 。
        继续对网关的配置文件 gateway.yml 做以下修改。

        ```yaml

    • name: default_flow
      filter:
      • request_path_limiter:
        message: "Hey, You just reached our request limit!" rules:
        • pattern: "/(?Pabc)/_search"
          max_qps: 10000
          group: index_name
      • elasticsearch:
        elasticsearch: prod
        max_connection_per_node: 1000
        ```

        再次进行测试,读取速度被限制在了 1w qps 。
        ![](https://www.infinilabs.com/img ... /6.png)

        限制多个索引读取速度


        上面的配置是针对 abc 索引的写入速度控制。如果想添加其他的索引,新增一段配置即可。
        比如,我允许 abc 索引读取达到 1w qps,test-index 索引最多不超过 2w qps ,可配置如下。

        ```yaml

    • name: default_flow
      filter:
      • request_path_limiter:
        message: "Hey, You just reached our request limit!"
        rules:
        • pattern: "/(?Pabc)/_search"
          max_qps: 10000
          group: index_name
        • pattern: "/(?Ptest-index)/_search"
          max_qps: 20000
          group: index_name
      • elasticsearch:
        elasticsearch: prod
        max_connection_per_node: 1000
        ```

        ![](https://www.infinilabs.com/img ... /7.png)

        多个网关限速


        限速是每个网关自身的控制,如果有多个网关,那么后端 ES 集群收到的请求数等于多个网关限速的总和。
        ![](https://www.infinilabs.com/img ... /8.png)
        本次介绍就到这里了。相信大家在使用 ES 的过程中也遇到过各种各样的问题。欢迎大家来我们这个平台分享自己的问题、解决方案等。如有任何问题,请随时联系我,期待与您交流!
        ![](https://www.infinilabs.com/img ... gf.png)



用 Easysearch 帮助大型车企降本增效

yangmf2040 发表了文章 • 0 个评论 • 4278 次浏览 • 2024-02-02 15:15 • 来自相关话题

最近某头部汽车集团需要针对当前 ES 集群进行优化,背景如下:
ES 用于支撑包括核心营销系统、管理支持系统、财务类、IT 基础设施类、研发、自动驾驶等多个重要应用,合计超 50 余套集群,累计数据超 1.5PB 。
本文针对其中一个 ES 集群进行分享,该集群原本使用的是 ES 7.3.2 免费版,数据已经 130TB 了,14 个节点。写入数据时经常掉节点,写入性能也不稳定,当天的数据写不完。迫切需要新的解决方案。
分析业务场景后总结需求要点:主要是写,很少查。审计需求,数据需要长期保存。
这个需求比较普遍,处理起来也很简单:

  • 使用 Easysearch 软件,只需少量节点存储近两天的数据。
  • 索引设置开启 ZSTD 压缩功能,节省磁盘空间。
  • 每天索引数据写完后,第二天执行快照备份存放到 S3 存储。
  • 备份成功后,删除索引释放磁盘空间。
  • 需要搜索数据时,直接从快照搜索。

    ![](https://www.infinilabs.com/img ... /0.png)
    将近期的数据,存放到本地磁盘,保障写入速度。写入完毕的索引,在执行快照备份后,可删除索引,释放本地磁盘空间。

    Easysearch 配置要点


    <br /> path.repo: ["/S3-path"]<br /> node.roles: ["data","search"]<br /> node.search.cache.size: 500mb<br />

  • path.repo : 指定 S3 存储路径,上传快照用。
  • node.roles : 只有 search 角色的节点,才能去搜索快照中的数据。
  • node.search.cache.size : 执行快照搜索时的,缓存大小。

    更多信息请参考[官方文档](https://www.infinilabs.com/doc ... pshot/)。

    旧数据迁移


    通过 Console 将原 ES 集群的数据,迁移到新 Easysearch 集群。迁移时,复制 mapping 和 setting,并在 setting 中添加如下设置。

    <br /> "codec": "ZSTD",<br /> "source_reuse": true,<br />

    ![](https://www.infinilabs.com/img ... /1.png)
    ![](https://www.infinilabs.com/img ... /2.png)
    原索引数据量大,可拆分成多个小任务。
    ![](https://www.infinilabs.com/img ... /3.png)
    迁移完,索引存储空间一般节省 50% 左右。
    原索引 279GB ,迁移完后 138GB。
    ![](https://www.infinilabs.com/img ... /4.png)

    搜索快照数据


    挂载快照后,搜索快照里的索引和搜索本地的索引,语法完全一样。
    ![](https://www.infinilabs.com/img ... /5.png)
    如何判断一个索引是在快照还是本地磁盘呢?可以查看索引设置里的 settings.index.store.type
    ![](https://www.infinilabs.com/img ... /6.png)
    如果是 remote_snapshot ,说明是快照中的数据。如果是空值,则是集群本地的数据。
    这次迁移,节省了 6 台主机资源。更重要的是,用上对象存储后,主机磁盘空间压力骤减。
    这次介绍就到这里了,有问题联系我。

    ![](https://www.infinilabs.com/img ... gf.png)


    关于 Easysearch


    ![Easysearch](https://infinilabs.com/img/blo ... er.png)

    INFINI Easysearch 是一个分布式的近实时搜索与分析引擎,核心引擎基于开源的 Apache Lucene。Easysearch 的目标是提供一个轻量级的 Elasticsearch 可替代版本,并继续完善和支持更多的企业级功能。与 Elasticsearch 相比,Easysearch 更关注在搜索业务场景的优化和继续保持其产品的简洁与易用性。

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

Easysearch:语义搜索、知识图和向量数据库概述

liaosy 发表了文章 • 0 个评论 • 3943 次浏览 • 2024-01-24 20:56 • 来自相关话题


什么是语义搜索?


语义搜索是一种使用自然语言处理算法来理解单词和短语的含义和上下文以提供更准确的搜索结果的搜索技术。旨在更好地理解用户的意图和查询内容,而不仅仅是根据关键词匹配,还通过分析查询的语义和上下文来提供更准确和相关的搜索结果。

传统的关键词搜索主要依赖于对关键词的匹配,而忽略了查询的含义和语境。但语义搜索的优点在于它可以更好地满足用户的意图,尤其是对于复杂的查询和问题。它能够理解查询的上下文,处理模糊或不完整的查询,并提供更相关和有用的搜索结果。例如,当用户搜索"最近的餐厅"时,语义搜索可以根据用户的位置信息和上下文,提供附近的餐厅列表,而不仅仅是简单地匹配关键词"最近"和"餐厅"。

![](https://www.infinilabs.com/img ... p1.jpg)

语义搜索的历史


语义搜索的概念可以追溯到计算机科学的早期,在 20 世纪 50 年代和 1960 年代就有人尝试开发自然语言处理系统。然而,直到 20 世纪 90 年代和 2000 年代,语义搜索领域才取得了重大进展,这在一定程度上要归功于机器学习和人工智能的进步。

语义搜索最早的例子之一是 Douglas Lenat 在 1984 年创建的 Cyc 项目。该项目旨在建立一个全面的常识知识本体或知识库,可用于理解自然语言查询。虽然 Cyc 项目面临诸多挑战,最终没有实现其目标,但它为未来语义搜索的研究奠定了基础。

20 世纪 90 年代末,Ask Jeeves(现称为 Ask.com)等搜索引擎开始尝试自然语言查询和语义搜索技术。这些早期的努力受到当时技术的限制,但它们展示了更复杂的搜索算法的潜力。

2000 年代初 Web 本体语言 (OWL) 的发展提供了一种以机器可读格式表示知识和关系的标准化方法,使得开发语义搜索算法变得更加容易。2008 年被微软收购的 Powerset 和 2007 年推出的 Hakia 等公司开始使用语义搜索技术来提供更相关的搜索结果。

如今,许多搜索引擎和公司正在使用语义搜索来提高搜索结果的准确性和相关性。其中包括于 2012 年推出知识图谱的谷歌,以及使用语义搜索为其 Alexa 虚拟助手提供支持的亚马逊。随着人工智能领域的不断发展,语义搜索可能会变得更加复杂且适用于广泛的应用。

语义搜索的最新改进


语义搜索的最新改进有助于进一步推动该领域的发展。一些最值得注意的包括:

基于 Transformer 的模型:基于 Transformer 的模型,例如 BERT(来自 Transformers 的双向编码器表示),彻底改变了自然语言处理和语义搜索。这些模型能够更好地理解单词和短语的上下文,从而更容易提供更相关的搜索结果。

多模态搜索:多模态搜索是指跨文本、图像、视频等多种模式搜索信息的能力。机器学习的最新进展使得开发更准确、更复杂的多模态搜索算法成为可能。

对话式搜索:对话式搜索涉及使用自然语言处理和机器学习来为用户查询提供更准确、更人性化的响应。这项技术已经被用于虚拟助手,例如亚马逊的 Alexa 和苹果的 Siri。

个性化:个性化是指根据用户的偏好和之前的搜索历史来定制搜索结果的能力。随着在线可用数据量的不断增长,这一点变得越来越重要。

特定领域搜索:特定领域搜索涉及使用语义搜索技术在特定领域或行业(例如医疗保健或金融)内进行搜索。这有助于为这些行业的用户提供更准确、更相关的搜索结果。

总体而言,语义搜索的最新进展使得在线查找信息变得更加容易,并为未来更复杂的搜索算法铺平了道路。

语义搜索和知识图谱有什么关系?


语义搜索和知识图(knowledge graph)密切相关,因为两者都涉及使用语义技术来改进搜索结果。

知识图是一种用于组织和表示知识的图形结构,通过节点和边的连接展示实体和关系之间的语义关联性。例如,知识图可能包含有关特定公司的信息,包括其位置、产品和员工以及这些实体之间的关系。

另一方面,语义搜索是一种使用自然语言处理和机器学习来更好地理解搜索查询中单词和短语的含义的搜索技术。语义搜索算法使用知识图和其他语义技术来分析实体和概念之间的关系,并基于此分析提供更相关的搜索结果。

换句话说,知识图谱为语义搜索提供了丰富的知识背景,帮助理解查询意图和提供准确的搜索结果。同时,语义搜索可以帮助构建和扩展知识图谱,提高搜索的准确性和语义理解能力。

例如,谷歌的知识图使用庞大的结构化数据数据库来支持其搜索结果,并提供有关搜索结果中出现的实体(例如人物、地点和事物)的附加信息。这使得用户更容易找到他们正在寻找的信息并探索相关的概念和实体。

向量数据库、知识图谱和语义搜索


向量数据库是另一种可以与语义搜索和知识图相结合使用以改进搜索结果的技术。它主要用于处理和分析具有向量特征的数据,如图像、音频、文本、时间序列等。

传统的关系型数据库主要用于存储结构化的数据,而向量数据库则专注于存储和处理高维向量。它的设计目标是能够高效地进行向量相似性搜索和聚类等操作,以支持复杂的数据分析和机器学习任务。向量数据库使用机器学习算法将数据表示为向量,向量是数据的数学表示,可用于各种计算任务,例如,向量可用于表示人、地点和事物等实体以及它们之间的关系。通过比较这些向量,搜索算法可以识别数据本身可能无法立即显现的关系和模式。

在语义搜索和知识图的背景下,向量数据库可以通过更好地理解实体和概念之间的关系来提高搜索结果的准确性。

例如,当用户搜索“ London ”时,语义搜索算法可以使用知识图和向量数据库来了解用户可能指的是英国伦敦市,而不是其他同名实体。

通过使用向量数据库来表示和比较实体和概念,搜索算法可以提供更相关和更准确的搜索结果。

总体而言,向量数据库、语义搜索和知识图谱都是共同提高搜索算法的准确性和效率的技术。通过利用这些技术,搜索引擎和其他应用程序可以更好地理解实体和概念之间的关系,从而更轻松地找到用户正在寻找的信息。

关于 Easysearch


![Easysearch](https://infinilabs.com/img/blo ... er.png)

INFINI Easysearch 是一个分布式的近实时搜索与分析引擎,核心引擎基于开源的 Apache Lucene。Easysearch 的目标是提供一个轻量级的 Elasticsearch 可替代版本,并继续完善和支持更多的企业级功能。与 Elasticsearch 相比,Easysearch 更关注在搜索业务场景的优化和继续保持其产品的简洁与易用性。

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

参考资料


【INFINI 动手实战训练营-北京站】海量数据不再头疼,使用 Easysearch 来实现降本增效,硬件直接减半

liaosy 发表了文章 • 0 个评论 • 2260 次浏览 • 2024-01-16 00:44 • 来自相关话题

Workshop.png



您是否遇到过以下问题?

  • 当前部分原始日志压缩归档存放到 HDFS,但不能直接灵活查询;
  • 使用 Elasticsearch 存储日志,开销较大,硬件资源投入较高;
  • 当前日志集群不断增长,存储接近 PB 量级,且还在不断接入新的数据;
  • 希望降低日志保留成本,同时满足按需查询的需求,平衡性能和成本;
  • 集群规模大,分片过多,管理存在挑战,希望降低维护成本等。

    针对使用 Elasticsearch 来作为日志存储的以上痛点,INFINI Labs 推出的 Easysearch 提供了若干存储优化的解决方案:

  • 优化措施一:集成高效压缩算法
    Easysearch 采用业界最先进的 Zstd 压缩算法,高压缩率,低 CPU 消耗,针对 Doc Values、Store 字段进行高度无缝压缩,不影响正常的使用体验,可以降低 50% 的存储开销。
  • 优化措施二:无缝去除 Source 字段
    Easysearch 利用 DocValues 和 BKD Tree 来重建 Source,合并冗余存储,不影响日志的正常检索和查看,可以大幅降低存储需求,在一些指标场景,甚至可以降低 80% 的存储开销。
  • 优化措施三:归档数据直接检索
    您是否还在通过关闭索引来降低海量数据带来的集群压力,或者您是否已经将快照备份直接放到 S3 或者 HDFS 中了,现在通过 Easysearch 提供的归档数据的直接检索能力,可以进一步释放本地节点的磁盘空间,进而释放物理机器资源,并根据需要按需查询归档索引,而不需要恢复归档再查询,简单方便。

    通过以上优化举措,我们可以用不到一半的机器即可承载原有的数据,并且结合 Easysearch 内置其它的内核优化,索引和查询性能也将大幅提升,同时集群更加稳定可靠。

    快来与 INFINI Labs 的技术专家面对面,第一时间了解极限实验室的发布最新产品和功能特性,通过动手实战,快速掌握最前沿的搜索技术,并用于实际项目中。活动免费,欢迎报名参加。

    活动时间:2024 年 1 月 18 日 13:30~17:30
    活动地点:北京市海淀区 Wework 辉煌时代大厦 3 楼 3E 会议室

    分享议题

  • Easysearch 总体介绍及搭建实战
  • Easysearch 存储优化原理与实践
  • Elasticsearch -> Easysearch 在线迁移实操
  • Console、Gateway、Loadgen 及 INFINI Labs 其他工具介绍与使用

    参会提示

  • 请务必自备电脑(Windows 系统环境请提前安装好 Linux 虚拟机)
  • 请提前在 INFINI Labs 官网下载对应平台最新安装包(INFINI Easysearch、INFINI Gateway、INFINI Console)
  • 下载地址:[https://www.infinilabs.com/download](https://www.infinilabs.com/download)
  • 如有任何疑问可添加 INFINI Labs 小助手(微信号: INFINI-Labs)进行联系

    ![微信号: INFINI-Labs](https://www.infinilabs.com/img ... de.png)

    活动报名

    名额有限,对 Easysearch 搜索引擎感兴趣的朋友们速度报名(扫描海报中二维码或点击此处 [链接](https://www.huodongxing.com/event/6733634533000) 即可免费报名)。

    20231214-095304-qrcode.jpg



开启安全功能 ES 集群就安全了吗?

yangmf2040 发表了文章 • 0 个评论 • 2992 次浏览 • 2023-12-27 10:38 • 来自相关话题

背景


经常跟 ES 打交道的朋友都知道,现在主流的 ES 集群安全方案是:RBAC + TLS for Internal + HTTPS 。

![](https://www.infinilabs.com/img ... ge.png)

作为终端用户一般只需要关心用户名和密码就行了。作为管理和运维 ES 的人员来说,可能希望 ES 能提供密码策略来强制密码强度和密码使用周期。遗憾的是 ES 对密码强度和密码使用周期没有任何强制要求。如果不注意,可能我们天天都在使用“弱密码”或从不修改的密码(直到无法登录)。而且 ES 对连续的认证失败,不会做任何处理,这让 ES 很容易遭受暴力破解的入侵。

那还有没有别的办法,进一步提高安全呢? 其实,网关可以来帮忙。

虽然网关无法强制提高密码复杂度,但可以提高 ES 集群被暴力破解的难度。

大家都知道,暴力破解--本质就是不停的“猜”你的密码。以现在的 CPU 算力,一秒钟“猜”个几千上万次不过是洒洒水,而且 CPU 监控都不带波动的,很难发现异常。从这里入手,一方面,网关可以延长认证失败的过程--延迟返回结果,让破解不再暴力。另一方面,网关可以记录认证失败的情况,做到实时监控,有条件的告警。一旦出现苗头,可以使用网关阻断该 IP 或用户发来的任何请求。

场景模拟


首先,用网关代理 ES 集群,并在 default_flow 中增加一段 [response_status_filter](https://www.infinilabs.com/doc ... ilter/) 过滤器配置,对返回码是 401 的请求,跳转到 rate_limit_flow 进行降速,延迟 5 秒返回。

```

  • name: default_flow
    filter:
    • elasticsearch:
      elasticsearch: prod
      max_connection_per_node: 1000
    • response_status_filter:
      exclude:
      • 401
        action: redirect_flow
        flow: rate_limit_flow
  • name: rate_limit_flow
    filter:
    • sleep:
      sleep_in_million_seconds: 5000
      ```

      ![](https://www.infinilabs.com/img ... 29.png)

      其次,对于失败的认证,我们可以通过 Console 来做个看板实时分析,展示。

      折线图、饼图图、柱状图等,多种展示方式,大家可充分发挥。

      最后,可在 Console 的告警中心,配置对应的告警规则,实时监控该类事件,方便及时跟进处置。

      效果测试


      先带上正确的用户名密码测试,看看返回速度。

      ![](https://www.infinilabs.com/img ... image(2).png)


      0.011 秒返回。再使用错误的密码测试。

      ![](https://www.infinilabs.com/img ... image(3).png)

      整整 5 秒多后,才回返结果。如果要暴力破解,每 5 秒钟甚至更久才尝试一个密码,这还叫暴力吗?

      看板示例


      此处仅仅是抛砖引玉,欢迎大家发挥想象。

      ![](https://www.infinilabs.com/img ... image(4).png)

      告警示例


      建立告警规则,用户 1 分钟内超过 3 次登录失败,就产生告警。

      ![](https://www.infinilabs.com/img ... image(5).png)

      可在告警中心查看详情,也可将告警推送至微信、钉钉、飞书、邮件等。

      ![](https://www.infinilabs.com/img ... image(6).png)

      查看告警详情,是 es 用户触发了告警。

      ![](https://www.infinilabs.com/img ... image(7).png)

      最后,剩下的工作就是对该账号的处置了。如果有需要可以考虑阻止该用户或 IP 的请求,对应的过滤器文档在[这里](https://www.infinilabs.com/doc ... ilter/),老规矩加到 default_flow 里就行了。

      如果小伙伴有其他办法提升 ES 集群安全,欢迎和我们一起讨论、交流。我们的宗旨是:让搜索更简单!

INFINI Gateway 如何防止大跨度查询

yangmf2040 发表了文章 • 0 个评论 • 2347 次浏览 • 2023-12-19 23:54 • 来自相关话题

背景


业务每天生成一个日期后缀的索引,写入当日数据。
业务查询有时会查询好多天的数据,导致负载告警。
现在想对查询进行限制--只允许查询一天的数据(不限定是哪天),如果想查询多天的数据就走申请。

技术分析


在每天一个索引的情况下,要进行多天的数据查询,有三种途径:

  1. 查询时,指定多个索引
  2. 查询时,写前缀+*号,模糊匹配多个索引
  3. 查询别名,别名关联多个索引

    需求实现


    我们只需用网关代理 ES 集群,并在 default_flow 中增加一段 [request_path_filter](https://www.infinilabs.com/doc ... ilter/) 过滤器的配置,只允许查询一个索引且格式如 "xxx-2023-12-06", "xxx.2023.12.06", "xxx20231206" 。

    ```

    • request_path_filter:
      message: "Query scope exceeds limit, please contact the administrator for application."
      must:
      suffix:
      • _search
        regex:
      • \/[a-z]+[-.]?\d{4}[-.]?\d{1,2}[-.]?\d{1,2}\/
        ```

        ![](https://www.infinilabs.com/img ... /1.png)
        如果需要指定其他格式,请自行修改 regex 的正则表达式。

        创建测试索引


        在 [INFINI Console](https://www.infinilabs.com/docs/latest/console/) 开发工具中执行下列语句:

        <br /> POST test-2023-12-06/_doc<br /> {<br /> "test":"test"<br /> }<br /> <br /> POST test-2023-12-6/_doc<br /> {<br /> "test":"test"<br /> }<br /> POST test.2023.12.06/_doc<br /> {<br /> "test":"test"<br /> }<br /> POST test.2023.12.6/_doc<br /> {<br /> "test":"test"<br /> }<br /> <br /> POST test20231206/_doc<br /> {<br /> "test":"test"<br /> }<br /> <br /> POST test/_doc<br /> {<br /> "test":"test"<br /> }<br />

        查询测试语句


        ```

        预计成功的查询

        curl localhost:8000/test-2023-12-06/_search?pretty
        curl localhost:8000/test-2023-12-6/_search?pretty
        curl localhost:8000/test.2023.12.06/_search?pretty
        curl localhost:8000/test.2023.12.6/_search?pretty
        curl localhost:8000/test20231206/_search?pretty

        预计失败的查询

        curl localhost:8000/test-2023-12-06,test-2023-12-6/_search?pretty
        curl localhost:8000/test-2023-12/_search?pretty
        curl localhost:8000/test
        /_search?pretty
        curl localhost:8000/*/_search?pretty
        ```

        查询结果


        预计成功的查询


        ![](https://www.infinilabs.com/img ... /2.png)

        预计失败的查询


        ![](https://www.infinilabs.com/img ... /3.png)
        此外,我们在 Console 中的 Request Analysis 看板中也能看到,哪些请求被拒绝,哪些请求被“放行”。
        ![](https://www.infinilabs.com/img ... /4.png)

        查询多个索引(多天)


        现在我们已经实现了业务只能查一个索引,即一天的数据。当业务需要查询多天的索引时,我们只需创建一个别名,关联多个索引就行了。注意别名也要符合格式要求:字母开头 + 日期格式后缀。
        下面我们创建一个 test-1111-1-1 的别名,关联前面的三个测试索引。

        <br /> POST /_aliases<br /> {<br /> "actions" : [<br /> { "add" : { "indices" : ["test-2023-12-06", "test.2023.12.06","test-2023-12-6"], "alias" : "test-1111-1-1" } }<br /> ]<br /> }<br />

        查询别名
        ![](https://www.infinilabs.com/img ... /5.png)
        待业务查询用完之后,删除别名即可。

        <br /> POST /_aliases<br /> {<br /> "actions" : [<br /> { "remove": { "indices" : ["test-2023-12-06", "test.2023.12.06","test-2023-12-6"], "alias" : "test-1111-1-1" } }<br /> ]<br /> }<br />

        最后,我们只需严格控制别名的创建,就能实现我们最初的需求了。

INFINI Labs 产品更新 | Easysearch 新增快照搜索功能,Console 支持 OpenSearch 存储

liaosy 发表了文章 • 0 个评论 • 2212 次浏览 • 2023-12-15 23:14 • 来自相关话题

![release](https://www.infinilabs.com/img ... er.png)

INFINI Labs 产品又更新啦~,包括 Easysearch v1.7.0、Console v1.13.0。本次各产品更新了 Easysearch 快照搜索功能;Console 支持 OpenSearch 集群存储系统数据、优化了初始化安装向导流程等。

以下是本次更新的详细说明。

INFINI Easysearch v1.7.0


INFINI Easysearch 是一个分布式的近实时搜索与分析引擎,核心引擎基于开源的 Apache Lucene。Easysearch 的目标是提供一个轻量级的 Elasticsearch 可替代版本,并继续完善和支持更多的企业级功能。

Easysearch 本次更新如下:

Features


发布快照搜索功能 Beta 版本,此功能旨在提高对已备份数据的使用效率。让用户利用对象存储(如 AWS S3、MinIO、Microsoft Azure Storage、Google Cloud Storage 等)技术来大幅降低存储成本。

Bug fix


  • 修复单个节点场景下,从快照恢复多个 shard 的索引时,恢复不完整的问题
  • 修复无法删除索引已关联的 ILM 策略问题

    Improvements


  • 初始化脚本优化,新增重复执行判断

    INFINI Console v1.12.0


    INFINI Console 是一款非常轻量级的多集群、跨版本的搜索基础设施统一管控平台。通过对流行的搜索引擎基础设施进行跨版本、多集群的集中纳管, 企业可以快速方便的统一管理企业内部的不同版本的多套搜索集群。

    Console 在线体验: <http://demo.infini.cloud>; (用户名/密码:readonly/readonly)。

    Console 本次更新如下:

    Features


    支持 OpenSearch 集群存储系统数据

    Bug fix


  • 优化初始化安装流程
  • 新增探针初始化配置
  • 安装向导,新增凭据检查功能
  • 安装向导,新增管理员密码重置功能
  • 探针管理,支持自动关联 Auto Enroll

    期待反馈


    欢迎下载体验使用,如果您在使用过程中遇到如何疑问或者问题,欢迎前往 INFINI Labs Github(<https://github.com/infinilabs>;) 中的对应项目中提交 Feature Request 或提交 Bug。

  • 下载地址: <https://www.infinilabs.com/download>;

    您还可以通过邮件联系我们:hello@infini.ltd

    或者拨打我们的热线电话:(+86) 400-139-9200

    欢迎加入 Discord 聊天室:<https://discord.gg/4tKTMkkvVX>;

    也欢迎大家微信扫码添加小助手(INFINI-Labs),加入用户群一起讨论交流。

    ![联系我们](https://www.infinilabs.com/img ... ew.jpg)

    关于极限科技(INFINI Labs)


    ![INFINI Labs](https://www.infinilabs.com/img ... bs.png)

    极限科技,全称极限数据(北京)科技有限公司,是一家专注于实时搜索与数据分析的软件公司。旗下品牌极限实验室(INFINI Labs)致力于打造极致易用的数据探索与分析体验。

    极限科技是一支年轻的团队,采用天然分布式的方式来进行远程协作,员工分布在全球各地,希望通过努力成为中国乃至全球企业大数据实时搜索分析产品的首选,为中国技术品牌输出添砖加瓦。

    官网:<https://www.infinilabs.com>;

使用极限网关助力 ES 集群无缝升级、迁移上/下云

yangmf2040 发表了文章 • 0 个评论 • 2194 次浏览 • 2023-12-04 08:22 • 来自相关话题

在工作中大家可能会遇到以下这些场景:

  • 自建 ES 集群需要平滑迁移到 XX 云;
  • 从 XX 云将 ES 集群迁移到自建机房;
  • ES 集群进行跨版本升级,同时保留回退能力;
    这些场景往往都还有个共同的需求:迁移过程要保证业务的最小停机时间。  
    幸运的是,在这三个场景中,我们都能使用极限网关来帮助我们进行更丝滑的迁移或升级。下面,我们以迁移 ES 集群上云为例,介绍下整个工作过程。
  • 自建版本: 5.4.2
  • 云上版本: 5.6.16
  • Gateway 和 Console 建议用最新版本

    迁移架构

    通过将应用端流量走网关的方式,请求同步转发给自建 ES,网关记录所有的写入请求,并确保顺序在 XX 云 ES 上重放请求,两侧集群的各种故障都妥善进行了处理,从而实现透明的集群双写,实现安全无缝的数据迁移。
    ![](https://www.infinilabs.com/img ... /1.jpg)
    业务端如果已经部署在云上,可以使用云上的 SLB 服务来访问网关,确保后端网关的高可用,如果业务端和极限网关还在企业内网,可以使用极限网关自带的 4 层浮动 IP 来确保网关的 [高可用](https://www.infinilabs.com/doc ... ng_ip/) 。

    执行步骤

    部署 INFINI Gateway

    为了保证数据的无缝透明迁移,通过网关来进行双写。

    1. [系统调优](https://gateway.infinilabs.com ... ation/)
    2. [安装 INFINI Gateway](https://www.infinilabs.com/doc ... stall/)
    3. 修改网关配置  
          在此 [下载](https://github.com/infinilabs/ ... sk.yml) 网关双写配置,默认网关会加载配置文件 gateway.yml 。如果要指定其他配置文件使用 -config 选项。  
         配置文件内容较多,下面仅展示必要部分。
      <br />   #primary<br />   PRIMARY_ENDPOINT: <a href="http://192.168.56.3:7171" rel="nofollow" target="_blank">http://192.168.56.3:7171</a><br />   PRIMARY_USERNAME: elastic<br />   PRIMARY_PASSWORD: password<br />   PRIMARY_MAX_QPS_PER_NODE: 10000<br />   PRIMARY_MAX_BYTES_PER_NODE: 104857600 #100MB/s<br />   PRIMARY_MAX_CONNECTION_PER_NODE: 200<br />   PRIMARY_DISCOVERY_ENABLED: false<br />   PRIMARY_DISCOVERY_REFRESH_ENABLED: false<br />   #backup<br />   BACKUP_ENDPOINT: <a href="http://192.168.56.3:9200" rel="nofollow" target="_blank">http://192.168.56.3:9200</a><br />   BACKUP_USERNAME: admin<br />   BACKUP_PASSWORD: admin<br />   BACKUP_MAX_QPS_PER_NODE: 10000<br />   BACKUP_MAX_BYTES_PER_NODE: 104857600 #100MB/s<br />   BACKUP_MAX_CONNECTION_PER_NODE: 200<br />   BACKUP_DISCOVERY_ENABLED: false<br />   BACKUP_DISCOVERY_REFRESH_ENABLED: false<br />
      PRIMARY_ENDPOINT:配置主集群地址和端口  
      PRIMARY_USERNAME、PRIMARY_PASSWORD: 访问主集群的用户信息  
      BACKUP_ENDPOINT:配置备集群地址和端口  
      BACKUP_USERNAME、BACKUP_PASSWORD: 访问备集群的用户信息
    4. 启动网关  
         启动网关并指定刚刚创建的配置,如下:  
          ./gateway-linux-amd64 -config replication_via-disk.yml.yml

      部署 INFINI Console

      为了方便在多个集群之间快速切换,管理网关消费任务、查看队列等。使用 [INFINI Console](https://www.infinilabs.com/docs/latest/console/) 来进行管理。

    5. [下载安装](https://www.infinilabs.com/doc ... stall/)
    6. 启动服务  
         ./console-linux-amd64 -service install  
         ./console-linux-amd64 -service start
    7. 注册资源  
         将 ES 集群、极限网关都注册到 Console 中。
         - [注册 ES 集群](https://www.infinilabs.com/doc ... uster/):方便切换集群,执行命令。除了新旧集群外,将网关也在此注册一次,方便验证网关功能。
         - [注册 Gateway](https://www.infinilabs.com/doc ... teway/):管理网关任务、队列。

      测试 INFINI Gateway

      为了验证网关是否正常工作,我们通过 INFINI Console 来快速验证一下。  
      首先通过走网关的接口来创建一个索引,并写入一个文档,如下:
      ![](https://www.infinilabs.com/img ... /2.png)
      查看 5.4.2 集群的数据情况,如下:
      ![](https://www.infinilabs.com/img ... /3.png)
      查看集群 5.6.16 的数据情况,如下:
      ![](https://www.infinilabs.com/img ... /4.png)
      数据一致,说明网关配置都正常,验证结束。

      调整网关的消费策略

      因为我们需要在全量数据迁移之后,才能进行增量数据的追加,在全量数据迁移完成之前,我们应该暂停增量数据的消费。修改网关配置里面 Pipeline consume-queue_backup-bulk_request_ingestion-to-backup的参数 auto_startfalse,表示不自动启动该任务,具体配置方法如下:
      ![](https://www.infinilabs.com/img ... /5.png)
      修改完配置之后,需要重新启动网关。  
      由于之前已经注册了网关,待全量迁移完成之后,可以通过后台的 Task 管理来进行后续的任务启动、停止,如下:
      ![](https://www.infinilabs.com/img ... /6.png)

      切换流量

      接下来,将业务正常写的流量切换到网关,也就是需要把之前指向 ES 5.4.2 的地址指向网关的地址,如果 5.4.2 集群开启了身份验证,业务端代码同样需要传递身份信息,和 5.4.2 之前的用法保持不变。
      ![](https://www.infinilabs.com/img ... /7.png)
      切换流量到网关之后,用户的请求还是以同步的方式正常访问自建集群,网关记录到的请求会按顺序记录到 MQ 里面,但是消费是暂停状态。
      如果业务端代码使用的 ES 的 SDK 支持 Sniff,并且业务代码开启了 Sniff,那么应该关闭 Sniff,避免业务端通过 Sniff 直接链接到后端的 ES 节点,所有的流量现在应该都只通过网关来进行访问。

      全量数据迁移

      在流量迁移到网关之后,我们开始对自建 Elasticsearch 集群的数据进行全量迁移到 XX 云 Elasticsearch 集群。
      ![](https://www.infinilabs.com/img ... /8.jpg)
      全量迁移已有的数据的方式有很多种:

  • 通过快照的方式进行恢复
  • 使用 INFINI Console 进行[数据迁移](https://www.infinilabs.com/doc ... ation/)

    增量数据迁移

    在全量导入的过程中,可能存在数据的增量修改,不过这部分请求都已经完整记录下来了,我们只需要开启网关的消费任务即可将积压的请求应用到云端的 ES 集群。
    ![](https://www.infinilabs.com/img ... /9.jpg)
    示例操作如下:
    ![](https://www.infinilabs.com/img ... 10.png)
    通过观察队列是否消费完成来判断增量数据是否做完,如下:
    ![](https://www.infinilabs.com/img ... 11.png)

    执行数据比对

    由于集群内部的数据可能比较多,我们需要进行一个完整的比对才能确保数据的完整性,可以通过 INFINI Console 的[数据比对](https://www.infinilabs.com/doc ... rison/) 工具来进行。

    切换集群

    如果验证完之后,两个集群的数据已经完全一致了,可以将程序切换到新集群,或者将网关的配置里面的主备进行互换,仍旧写两个集群,先写云端集群,再写自建集群。
    ![](https://www.infinilabs.com/img ... 12.jpg)
    双集群在线运行一段时间,待业务完全验证之后,再安全下线老集群,如遇到问题,也可以随时回切到老集群。

    小结

    通过使用极限网关,自建 ES 集群可以安全无缝的迁移上云,在迁移的过程中,两套集群通过网关进行了解耦,两套集群的版本也可以不一样,在迁移的过程中还能实现版本的无缝升级。
    工作流程图
    ![](https://www.infinilabs.com/img ... 12.png)

INFINI Labs 产品更新 | 修复 Easysearch 跨集群复制索引同步问题,Gateway 内存异常增长等问题

liaosy 发表了文章 • 0 个评论 • 2144 次浏览 • 2023-12-01 18:45 • 来自相关话题

![release](https://www.infinilabs.com/img ... er.png)

INFINI Labs 产品又更新啦~,本次更新主要对 Easysearch、Gateway、Console、Agent 等产品功能进行优化和相关 Bug 修复,解决了内存异常增长等问题,以下是详细说明。

INFINI Easysearch v1.6.2


INFINI Easysearch 是一个分布式的近实时搜索与分析引擎,核心引擎基于开源的 Apache Lucene。Easysearch 的目标是提供一个轻量级的 Elasticsearch 可替代版本,并继续完善和支持更多的企业级功能。

Easysearch 本次更新如下:

Bug fix


  • 修复跨集群复制(CCR)不能对自动滚动生成的索引进行同步的问题

    Improvements


  • 优化初始化脚本,增加-s/-slient 参数,自动安装。
  • 新增含 jdk/plugins 的 bundle 安装包

    INFINI Gateway v1.20.0


    INFINI Gateway 是一个面向搜索场景的高性能数据网关,所有请求都经过网关处理后再转发到后端的搜索业务集群。基于 INFINI Gateway 可以实现索引级别的限速限流、常见查询的缓存加速、查询请求的审计、查询结果的动态修改等等。

    Gateway 本次更新如下:

    Bug fix


  • 修复由 Framework Bug 造成连接数不释放、内存异常增长的问题

    Improvements


  • 增加配置,允许设置 fasthttp client 相关参数

    INFINI Console v1.12.0


    INFINI Console 是一款非常轻量级的多集群、跨版本的搜索基础设施统一管控平台。通过对流行的搜索引擎基础设施进行跨版本、多集群的集中纳管, 企业可以快速方便的统一管理企业内部的不同版本的多套搜索集群。

    Console 在线体验: <http://demo.infini.cloud>; (用户名/密码:readonly/readonly)。

    Console 本次更新如下:

    Bug fix


  • 修复数据探索 multi fields 字段计算 top values 报错的问题
  • 修复由 Framework Bug 造成连接数不释放、内存异常增长的问题
  • 修复内网模式下静态资源远程加载的问题
  • 修复数据看板数据源配置校验异常的问题

    Improvements


  • 优化数据探索计算 top values,使用先采样后,后取 top values
  • 可通过配置参数 http_client.read_buffer_size 设置读取缓存大小,解决开发工具执行命令时,默认缓存太小的问题

    INFINI Agent v0.7.1


    INFINI Agent 是 INFINI Console 的一个可选探针组件,负责采集和上传集群指标和日志等信息,并可通过 Console 管理。Agent 支持主流操作系统和平台,安装包轻量且无任何外部依赖,可以快速方便地安装。

    Agent 本次更新如下:

    Features


  • 添加 http processor

    Bug fix


  • 修复由 Framework Bug 造成连接数不释放、内存异常增长的问题

    Improvements


  • 进一步优化内存占用,降到 50M 以下

    INFINI Framework


    INFINI Framework 是 INFINI Labs 各产品依赖的内部核心公共代码库。

    Framework 本次更新如下:

  • fix: fix the issue of disk queue was blocked
  • chore: checkout specify branch before pull

    期待反馈


    欢迎下载体验使用,如果您在使用过程中遇到如何疑问或者问题,欢迎前往 INFINI Labs Github(<https://github.com/infinilabs>;) 中的对应项目中提交 Feature Request 或提交 Bug。

  • 下载地址: <https://www.infinilabs.com/download>;

    您还可以通过邮件联系我们:hello@infini.ltd

    或者拨打我们的热线电话:(+86) 400-139-9200

    欢迎加入 Discord 聊天室:<https://discord.gg/4tKTMkkvVX>;

    也欢迎大家微信扫码添加小助手(INFINI-Labs),加入用户群一起讨论交流。

    ![联系我们](https://www.infinilabs.com/img ... ew.jpg)

    关于极限科技(INFINI Labs)


    ![INFINI Labs](https://www.infinilabs.com/img ... bs.png)

    极限科技,全称极限数据(北京)科技有限公司,是一家专注于实时搜索与数据分析的软件公司。旗下品牌极限实验室(INFINI Labs)致力于打造极致易用的数据探索与分析体验。

    极限科技是一支年轻的团队,采用天然分布式的方式来进行远程协作,员工分布在全球各地,希望通过努力成为中国乃至全球企业大数据实时搜索分析产品的首选,为中国技术品牌输出添砖加瓦。

    官网:<https://www.infinilabs.com>;

通过 Canal 将 MySQL 数据实时同步到 Easysearch

yangmf2040 发表了文章 • 0 个评论 • 2190 次浏览 • 2023-11-20 09:55 • 来自相关话题

Canal 是阿里巴巴集团提供的一个开源产品,能够通过解析数据库的增量日志,提供增量数据的订阅和消费功能。使用 Canal 模拟成 MySQL 的 Slave,实时接收 MySQL 的增量数据 binlog,然后通过 RESTful API 将数据写入到 Easysearch 中。

前提条件

  1. 部署 Easysearch 集群。
  2. 部署 MySQL 数据库。
  3. 部署 Gateway,Canal Adapter 不支持使用 HTTPS 协议连接,使用 Gateway 代理 Easysearch 。
  4. 部署 Console,方便查看 Easysearch 数据。
    对于自建 MySQL , 需要先开启 Binlog 写入功能,配置 binlog-format 为 ROW 模式,my.cnf 中配置如下:
    <br /> [mysqld]<br /> log-bin=mysql-bin # 开启 binlog<br /> binlog-format=ROW # 选择 ROW 模式<br /> server_id=1 # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复<br />
    创建 canal 用户,授权 canal 连接 MySQL 具有作为 MySQL slave 的权限。
    <br /> CREATE USER canal IDENTIFIED BY 'canal';<br /> GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';<br /> -- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;<br /> FLUSH PRIVILEGES;<br />

    操作步骤

    在进行数据同步时支持自定义索引 Mapping,但需保证 Mapping 中定义的字段(名称+类型)与 MySQL 中一致。

    1. 准备 MySQL 数据源

    <br /> create database canal;<br /> use canal;<br /> CREATE TABLE `test` (<br />     `id` bigint(32) NOT NULL,<br />     `name` text NOT NULL,<br />     `age` smallint  NOT NULL,<br />     PRIMARY KEY (`id`)<br /> ) ENGINE=InnoDB<br /> DEFAULT CHARACTER SET=utf8;<br />

    2. Easysearch 创建索引

    <br /> PUT test<br /> {<br />     "settings" : {<br />       "index" : {<br />         "number_of_shards" : "1",<br />         "number_of_replicas" : "1"<br />       }<br />     },<br />     "mappings" : {<br />             "properties" : {<br />               "id": {<br />                    "type": "integer"<br />                },<br />                "name": {<br />                     "type" : "text"<br />                 },<br />                 "age" : {<br />                     "type" : "integer"<br />                 }<br />             }<br />     }<br /> }<br />

    3. 安装并启动 Canal-server

    下载:[https://github.com/alibaba/can ... ar.gz](https://github.com/alibaba/can ... tar.gz)  
    修改配置文件
    vi conf/example/instance.properties
    ![](https://www.infinilabs.com/img ... /1.png)
    启动 canal  
    sh bin/startup.sh  
    启动成功日志信息,logs/canal/canal.log
    ![](https://www.infinilabs.com/img ... /2.png)
    关闭 canal  
    sh bin/stop.sh

    4. 安装并启动 Canal-adapter

    下载:[https://github.com/alibaba/can ... ar.gz](https://github.com/alibaba/can ... tar.gz)  
    修改配置文件:application.yml
    <br /> server:<br />   port: 8081<br /> spring:<br />   jackson:<br />     date-format: yyyy-MM-dd HH:mm:ss<br />     time-zone: GMT+8<br />     default-property-inclusion: non_null<br /> canal.conf:<br />   flatMessage: true<br />   syncBatchSize: 1000<br />   retries: -1<br />   timeout:<br />   accessKey:<br />   secretKey:<br />   consumerProperties:<br />     canal.tcp.server.host: 127.0.0.1:11111<br />     canal.tcp.batch.size: 500<br />   srcDataSources:<br />     defaultDS:<br />       url: jdbc:mysql://127.0.0.1:3306/canal?useUnicode=true<br />       username: canal<br />       password: canal<br />   canalAdapters:<br />     groups:<br />     - groupId: g1<br />       outerAdapters:<br />       - name: logger<br />       - name: es7<br />         properties:<br />           security.auth: admin:4ad8f8f792e81cd0a6de<br />           cluster.name: easysearch<br />
    新增 canal-adapter/conf/es7/test.yml,配置索引和表的映射关系。
    <br /> dataSourceKey: defaultDS<br /> destination: example<br /> groupId: g1<br /> esMapping:<br />   _index: test           # es 的索引名称<br />   _id: _id               # es 的_id, 如果不配置该项必须配置下面的pk项_id则会由es自动分配<br />   # sql映射<br />   sql: " select a.id as _id,a.id,a.name,a.age from test a "<br />   etlCondition: "where a.id>={}"<br />   commitBatch: 3000      # 提交批大小<br />
    启动 canal-adapter  
    ./bin/startup.sh
    ![](https://www.infinilabs.com/img ... /3.png)

    5. 验证增量数据同步

    在 MySQL 数据库中,对 test 表插入两条数据。  
    inserttest(id,name,age) values(1,'canal_test1',11);  
    inserttest(id,name,age) values(2,'canal_test2',22);

    6. 在 Console 中,执行以下命令查询数据

    ![](https://www.infinilabs.com/img ... /4.png)

    最后

    Canal 同步的是增量数据,不会同步之前的存量数据。要同步存量数据可参考[《使用 Logstash 同步 MySQL 到 Easysearch》](https://www.infinilabs.com/blo ... stash/)