绊脚石乃是进身之阶。

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

liaosy 发表了文章 • 0 个评论 • 2517 次浏览 • 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 个评论 • 2594 次浏览 • 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/)

INFINI Labs 产品更新 | 发布 Easysearch Java 客户端,Console 支持 SQL 查询等功能

liaosy 发表了文章 • 0 个评论 • 3167 次浏览 • 2023-11-17 18:56 • 来自相关话题

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

INFINI Labs 产品又更新啦~,本次更新概要如下:发布 Easysearch-client Java 客户端,开发者通过 client 与 Easysearch 集群的交互变得更加简洁和直观;Console 开发工具新增 SQL 特性,支持 SELECT 查询等语法高亮和自动提示等;Gateway 的系统 API 添加了基于基本身份验证的安全功能。

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

INFINI Easysearch-client v1.0.1


正式发布 Easysearch Java 客户端。

这一里程碑式的更新为开发人员带来了前所未有的便利性,使得与 Easysearch 集群的交互变得更加简洁和直观。现在,通过 Easysearch-client 客户端,开发者可以直接使用 Java 方法和数据结构来进行交互,而不再需要依赖于传统的 HTTP 方法和 JSON。这一变化大大简化了操作流程,使得数据管理和索引更加高效。高级客户端的功能范围包括处理数据操作,管理集群,包括查看和维护集群的健康状态,并对 Security 模块全面兼容。它提供了一系列 API,用于管理角色、用户、权限、角色映射和账户。这意味着安全性和访问控制现在可以更加细粒度地管理,确保了数据的安全性和合规性。

使用说明参见:[快速开始](https://www.infinilabs.com/doc ... client)

INFINI Console v1.11.0


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

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

Console 本次更新如下:

Features


  • 开发工具 SQL 查询支持
    • 支持 SELECT 查询及语法高亮
    • 支持索引和字段自动提示
    • 支持 FROM 前置语法

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

      Bug fix


  • 修复平台概览集群指标为空的问题

    Improvements


  • LDAP 支持从 DN 中解析 OU 属性
  • 集群动态优化显示,新增节点名称和索引名称的聚合统计过滤

    INFINI Gateway v1.19.0


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

    Gateway 本次更新如下:

    Features


  • 添加 http 处理器
  • 在 API 模块中添加基于基本身份验证的安全性
  • 允许将自身注册到配置管理器
  • 允许在配置错误时触发 panic

    Bug fix


  • 修复 rewrite_to_bulk 在较新版本中缺少 _type 的问题
  • 修复 rewrite_to_bulk,支持无索引文档操作

    Improvements


  • 更新测试,断言解析结果

    期待反馈


    欢迎下载体验使用,如果您在使用过程中遇到如何疑问或者问题,欢迎前往 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>;

使用 Filebeat+Easysearch+Console 打造日志管理平台

yangmf2040 发表了文章 • 0 个评论 • 2855 次浏览 • 2023-11-17 16:51 • 来自相关话题

近年来,日志管理平台越来越流行。使用日志管理平台可以实时地、统一地、方便地管理和查看日志,挖掘日志数据价值,驱动运维、运营,提升服务管理效率。

方案架构


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

  • Beats 是轻量级采集器,包括 Filebeat、Metricbeat 等。
  • Easysearch 是个分布式搜索引擎,提供搜集、分析、存储数据等主要功能。
  • Console 是一个可视化工具,提供可视化查询,制作报表等功能。

    本文将搭建一个统一日志管理平台。使用 Filebeat 采集 OS 中的日志(其他日志大同小异),发送到 Easysearch 中。最后通过 Console 进行日志的可视化查询与分析。

    操作步骤


    1. 准备工作
      • 部署 Easysearch
      • 编辑 easysearch.yml 文件,打开注释 elasticsearch.api_compatibility: true
      • 部署 Console
    2. 安装并配置 Filebeat
      • 下载 Filebeat,版本建议选择 7.10.2。下载地址:[https://www.elastic.co/cn/down ... -10-2](https://www.elastic.co/cn/down ... 7-10-2)
      • 修改配置 filebeat.yml 文件

        <br /> setup.template.name: "filebeat"<br /> setup.template.pattern: "system-log*"<br /> setup.template.fields: "${path.config}/fields.yml"<br /> <br /> output.elasticsearch:<br /> hosts: ["localhost:9200"]<br /> protocol: "https"<br /> ssl.verification_mode: none<br /> username: "admin"<br /> password: "4ad8f8f792e81cd0a6de"<br /> index: "system-log"<br />

    3. 启用 system 模块并导入 pipeline

      ./filebeat modules enable system
      ./filebeat setup --pipelines --modules system

    4. 创建索引模板及初始索引,使用 [ZSTD+SOURCE_REUSE](https://www.infinilabs.com/blo ... ssion/) 技术节省磁盘空间

      <br /> PUT _template/system_log<br /> {<br /> "order": 100,<br /> "index_patterns": [<br /> "system_log*"<br /> ],<br /> "settings": {<br /> "index": {<br /> "format": "7",<br /> "lifecycle": {<br /> "name": "ilm_.infini_metrics-30days-retention",<br /> "rollover_alias": "system_log"<br /> },<br /> "codec": "ZSTD",<br /> "source_reuse": true,<br /> "number_of_shards": "1",<br /> "translog": {<br /> "durability": "async"<br /> }<br /> }<br /> },<br /> "mappings": {<br /> "dynamic_templates": [<br /> {<br /> "strings": {<br /> "mapping": {<br /> "ignore_above": 256,<br /> "type": "keyword"<br /> },<br /> "match_mapping_type": "string"<br /> }<br /> }<br /> ]<br /> }<br /> }<br /> <br /> PUT system-log-00001<br /> {<br /> "aliases":{<br /> "system-log":{<br /> "is_write_index":true<br /> }<br /> }<br /> }<br />

    5. 启动 filebeat

      nohup ./filebeat -c filebeat.yml 2>&1>/dev/null &

    6. 进入 Console 查看、搜索日志
      ![](https://infinilabs.com/img/blo ... /2.png)
    7. 进入 Console 创建 dashboard 进行日志分析
      ![](https://infinilabs.com/img/blo ... /3.png)

Easysearch 容量规划建议

liaosy 发表了文章 • 0 个评论 • 2786 次浏览 • 2023-10-31 10:51 • 来自相关话题

你是否还在纠结怎么规划 Easysearch 集群存储容量,这篇文章将从容量估算、搜索吞吐量估算等场景为你提供详细的规划建议。

基于容量估算


主要问题:


  • 每天将索引多少原始数据(GB)?保留数据多少天?
  • 原始数据膨胀率
  • 您将强制执行多少个副本分片?
  • 您将为每个数据节点分配多少内存?
  • 您的内存:数据比例是多少?

    原则


  • 保留 +15% 以保持在磁盘水位以下。
  • 保留 +5% 用于误差和后台活动的余量。
  • 保留相当于一个数据节点的资源来处理故障。

    公式:


    总数据量 GB = 原始数据 GB/天 * 保留天数 * 膨胀率 * (副本数 + 1)

    总存储 GB = 总数据 GB * 1.15(包括磁盘 watermark threshold 和误差范围)

    总数据节点数 = ROUNDUP(总存储 GB / (每个数据节点的内存 * 内存/数据比例)) + 1(用于故障转移)

    举例:


    假设 需要存储的源数据 50TB 大小

    膨胀率 10% 副本数 1

    每个节点 256G 内存

    计算出:

    总数据量 TB


    = 50TB * (1 + 0.10) * (1 + 1)

    = 110TB

    总存储 TB


    = 110TB * 1.15(考虑磁盘 watermark threshold 和误差范围)

    = 126.5TB

    如果有 256GB 的物理内存,128GB 会用于 JVM 堆,剩下的 128GB 将用于操作系统、文件缓存和其他系统进程。

    按照常见的 1:30 的 RAM 到磁盘比例来计算,那么每个节点能处理的数据存储大约是:

    256GB 内存 * 30 = 7680GB,大约等于 7.68TB

    总数据节点数


    = ROUNDUP(126.5TB / 7.68TB) + 1(用于故障转移)

    = ROUNDUP(16.47) + 1

    = 18

    基于搜索吞吐量估算


    在存储容量层面之外,还要考虑搜索响应时间和搜索吞吐量的目标,这些目标可能需要更多的内存和计算资源。

    搜索响应时间受太多变量的影响,无法预测任何给定容量计划会如何影响它。但通过经验性测试搜索响应时间并估计预期的搜索吞吐量,我们可以估算出满足这些需求所需的集群资源。

    主要问题:


  • 你每秒的最高搜索次数是多少?
  • 你的平均搜索响应时间(毫秒)是多少?
  • 你的数据节点上有多少个核心和每个核心有多少个线程

    经验方法:


    与其确定资源将如何影响搜索速度,不如将搜索速度视为一个常数,通过在计划的硬件上进行测量来处理。然后确定集群需要多少个核心来处理预期的搜索吞吐量峰值。最终目标是防止线程池队列增长速度超过它们被消耗的速度。如果计算资源不足,搜索请求有被丢弃的风险。

    公式:


    峰值线程数 = 向上取整(每秒的峰值搜索次数 * 平均搜索响应时间(毫秒) / 1000 毫秒)

    线程池大小 = 向上取整((每个节点的物理核心数 * 每个核心的线程数 * 3 / 2) + 1)

    总数据节点数 = 向上取整(峰值线程数 / 线程池大小)

    举例:


    假设每秒 2 万搜索请求,平均响应时间 50 毫秒,每个节点有 16 个线程数,计算需要多少节点

    峰值线程数 = 20000 * 50 /1000 = 1000

    线程池大小 = (16 * 1 * 3/2) + 1 = 25

    总数据节点数 = 1000 / 25 = 40

    大概需要 40 个数据节点来处理每秒 2 万的搜索请求,平均响应时间为 50 毫秒,每个节点有 16 个线程。这是一个粗略的估计,实际需求可能会因多种因素而有所不同。建议进行实际测试以确认这些数字。

    Hot, Warm, Frozen


    根据索引使用情况不同,通常分为种存储。
    这是一种经济高效的方法,用于存储大量数据,同时优化了对较新数据的性能。在容量规划期间,每个层次必须独立进行规模确定,然后进行合并。

    | 层面 | 目标 | 示例存储 | 示例内存:存储比 |
    | ------ | -------- | --------------------------- | ---------------- |
    | Hot | 搜索为主 | SSD DAS/SAN (>200Gb/s) | 1:30 |
    | Warm | 存储为主 | HDD DAS/SAN (~100Gb/s) | 1:100 |
    | Frozen | 存档为主 | Cheapest DAS/SAN (<100Gb/s) | 1:500 |

    实际情况要把搜索吞吐量估算和容量估算结合考虑。

    关于 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/download>;

    原文:<https://www.infinilabs.com/blo ... gt%3B

Easysearch Chart 0.2.0 都有哪些变化

liaosy 发表了文章 • 0 个评论 • 2165 次浏览 • 2023-10-20 20:32 • 来自相关话题

Easysearch Chart 包更新了,让我们来看看都有哪些变化:

  • Docker 镜像升级

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

  • Service 名称调整,支持 NodePort 模式部署

    ![](https://infinilabs.com/img/blo ... 02.png)
    ![](https://infinilabs.com/img/blo ... 03.png)
    ![](https://infinilabs.com/img/blo ... 04.png)

    现在让我们用 NodePort 模式部署一下:

    ```bash

    helm search repo infinilabs

    NAME CHART VERSION APP VERSION DESCRIPTION
    infinilabs/console 0.2.0 1.8.0-1259 A Helm chart for Kubernetes
    infinilabs/easysearch 0.2.0 1.6.0-59 A Helm chart for Kubernetes
    infinilabs/gateway 0.1.0 1.18.0-1123 A Helm chart for Kubernetes

    cat es-nodeport.yaml

    service:
    type: NodePort
    http: 9200
    transport: 9300
    httpNodeport: 30920
    transNodeport: 30930

    helm install easysearch infinilabs/easysearch -n infini -f es-nodeport.yaml

    NAME: easysearch
    LAST DEPLOYED: Mon Oct 9 08:38:28 2023
    NAMESPACE: infini
    STATUS: deployed
    REVISION: 1
    TEST SUITE: None
    NOTES:

    1. Get the application URL by running these commands:
      export NODE_PORT=$(kubectl get --namespace infini -o jsonpath="{.spec.ports[0].nodePort}" services easysearch)
      export NODE_IP=$(kubectl get nodes --namespace infini -o jsonpath="{.items[0].status.addresses[0].address}")
      echo http://$NODE_IP:$NODE_PORT

      kubectl get svc -n infini

      NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
      easysearch NodePort 10.43.175.245 9200:30920/TCP,9300:30930/TCP 25s

      kubectl get pod -n infini

      NAME READY STATUS RESTARTS AGE
      easysearch-0 1/1 Running 0 40s

      curl -ku'admin:admin' https://10.0.0.1:30920

      {
      "name" : "easysearch-0",
      "cluster_name" : "infinilabs",
      "cluster_uuid" : "2cPioaONRVWp6BydbGuXDw",
      "version" : {
      "distribution" : "easysearch",
      "number" : "1.6.0",
      "distributor" : "INFINI Labs",
      "build_hash" : "e5d1ff9067b3dd696d52c61fbca1f8daed931fb7",
      "build_date" : "2023-09-22T00:55:32.292580Z",
      "build_snapshot" : false,
      "lucene_version" : "8.11.2",
      "minimum_wire_lucene_version" : "7.7.0",
      "minimum_lucene_index_compatibility_version" : "7.7.0"
      },
      "tagline" : "You Know, For Easy Search!"
      }
      ```

      关于 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/download>;

      原文:<https://www.infinilabs.com/blo ... gt%3B

Easysearch 压缩功能的显著提升:从 8.7GB 到 1.4GB

liaosy 发表了文章 • 0 个评论 • 2145 次浏览 • 2023-10-09 17:11 • 来自相关话题

引言


在海量数据的存储和处理中,索引膨胀率是一个不可忽视的关键指标。它直接影响了存储成本和查询性能。近期,Easysearch 在这方面取得了显著的进展,其压缩功能的效果远超过了之前的版本。本文将详细介绍这一进展。

Easysearch 各版本压缩性能对比


根据之前文章的数据,Easysearch v1.1 在处理相同数据时,其索引大小比 Elasticsearch v6.4.3 降低了 50%。但这还不是全部,最新的测试数据更是令人惊艳。

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

显著的压缩效果:实验数据解析


通过对比不同版本的存储大小,我们更直观地了解到 Easysearch 在压缩方面的优势:

  • Easysearch 的原始版本,未开启压缩:存储大小为 8.7 GB。
  • Easysearch v2 版本:经过第二版压缩后,存储大小显著减少到 2.7 GB。
  • Easysearch v3 版本:第三版压缩后,存储大小进一步减少到 1.4 GB。

    关键观察


    Easysearch 之前提供的压缩版相比原始版本减少了约 69%的存储空间。

    Easysearch v3 版则更为显著,相比原始版本减少了约 84%的存储空间。

    第三版本压缩的秘密武器:数字类型字段的复用


    第三版本压缩能达到如此高的效率,主要是因为在之前第二版对文档原文中 keyword 类型字段复用的基础上,增加了对数字类型字段的复用。这一策略进一步优化了存储结构,显著提高了压缩效率。

    压缩策略:多元化选择


    Easysearch 提供了多种压缩策略,包括 default、best_compression、ZSTD 和 index.source_reuse。其中,ZSTD 和 index.source_reuse 是新引入的压缩策略,能进一步降低索引膨胀率。

    带来的好处


    降低存储成本:显著降低的存储大小意味着在硬件和维护方面的成本将大幅度减少。 提高系统扩展性:更小的数据尺寸意味着在相同的硬件配置下,系统能够处理更多的数据。 数据备份和传输:由于索引文件更小,数据备份和传输的速度也将提升,同时减少带宽需求。

    总结


    Easysearch 在压缩效果上有显著提升,不仅降低了存储成本,还提高了查询性能和系统扩展性。这使得 Easysearch 在大数据环境下成为一种非常具有吸引力的搜索和存储解决方案

    关于 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/download>;

    原文:https://www.infinilabs.com/blo ... .4GB/

Easysearch 压缩模式深度比较:ZSTD + source_reuse 的优势分析

liaosy 发表了文章 • 0 个评论 • 2174 次浏览 • 2023-10-09 17:08 • 来自相关话题

引言


在使用 Easysearch 时,如何在存储和查询性能之间找到平衡是一个常见的挑战。Easysearch 具备多种压缩模式,各有千秋。本文将重点探讨一种特别的压缩模式:zstd + source_reuse,我们最近重新优化了 source_reuse,使得它在吞吐量和存储效率方面都表现出色。

测试概览


测试条件选用了 esrally 工具和 geonames 数据集来进行压力测试。数据集包含了 11396503 条记录,往单个 shard 写入,对以下几种压缩模式进行压测对比:

  • default
  • best_compression
  • zstd
  • zstd + source_reuse

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

    下图是对 CPU 的监控,可以看到各个模式对 CPU 的使用是基本相近的。

  • default
    ![](https://infinilabs.com/img/blo ... e2.png)
  • best_compression
    ![](https://infinilabs.com/img/blo ... e3.png)
  • zstd
    ![](https://infinilabs.com/img/blo ... e4.png)
  • zstd+reuse
    ![](https://infinilabs.com/img/blo ... e5.png)

    关键数据点


    测试结果主要围绕两个指标:

  • 中位吞吐量:单位为“每秒操作数”,数值越大表示性能越好。
  • 存储大小:单位为 “GB”,数值越小表示存储更加高效。

    测试数据如下:
    | 压缩模式 | 中位吞吐量 (docs/s) | 存储大小 (GB) |
    |---|---|---|
    | default | 37834 | 2.7 |
    | best_compression | 37404 | 2.2 |
    | zstd | 38878 | 2.1 |
    | zstd + source_reuse | 38942 | 1.6 |

    zstd + source_reuse:压缩原理


    该模式采用了 source_reuse 压缩算法,该算法通过对 keywordlongintshortboolean 等类型的字段值进行复用,并结合 zstd 压缩算法,大大提高了存储效率。

    压缩效率


    zstd + source_reuse 在存储大小上的表现尤为出色,针对 geonames 数据集只需 1.6 GB 的存储空间,相比于 best_compression 模式的 2.2 GB,压缩效率显著提高


    吞吐量表现


    高压缩率并没有让 zstd + source_reuse 在吞吐量上做出妥协,因为高压缩率使得其需要持久化的数据大大减小,其中位吞吐量为 38942 docs/s,在 4 种模式中表现最好。

    结论


    zstd + source_reuse 压缩模式在存储效率和查询性能之间找到了一种极佳的平衡,强烈推荐各位在使用 Easysearch 时,当存储成本比较敏感时,考虑使用 zstd + source_reuse 压缩模式。无论是在存储成本还是写入性能方面,它都能为你带来显著的优势。

    关于 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/download>;

    原文:https://www.infinilabs.com/blo ... odes/

INFINI Easysearch 在墨天轮搜索型数据库排名中荣登榜首

liaosy 发表了文章 • 0 个评论 • 2043 次浏览 • 2023-09-13 15:30 • 来自相关话题

近日,2023 年 9 月的 [墨天轮中国数据库流行度排行](https://www.modb.pro/dbRank) 火热出炉,本月共有 287 个数据库参与排名,中国数据库行业竞争日益激烈。其中,极限科技旗下软件产品 [INFINI Easysearch](https://www.infinilabs.com/products/easysearch/) 在 搜索型数据库 分类排名中脱颖而出,荣登榜首,获得了第一名的好成绩。

![第一名](https://infinilabs.com/img/blo ... /1.png)

同时在国内整个数据库排行中进入了前 50 的行列。

![前50名](https://infinilabs.com/img/blo ... /2.png)

[INFINI Easysearch](https://www.infinilabs.com/products/easysearch/) 是一个分布式的近实时搜索与分析引擎,同时也是一款具备自主可控的分布式近实时搜索型数据库产品,具备高性能、高可用、弹性伸缩、高安全性等特性,具备支持丰富的个性化搜索及聚合分析能力,可部署在物理机、虚拟机、容器、私有云和公有云,能承载 PB 级别的海量业务数据,为金融核心系统、运营商、制造业和政企业务系统提供安全、稳定、可靠的快速检索和实时数据探索分析能力,可满足不同业务场景的各项复杂需求。

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

[Easysearch](https://www.infinilabs.com/products/easysearch/) 的目标是提供一个轻量级的 Elasticsearch 可替代版本,并继续完善和支持更多的企业级功能。 与 Elasticsearch 相比,Easysearch 更关注在搜索业务场景的优化和继续保持其产品的简洁与易用性。

国内搜索型数据库最近几年发展迅速,关键技术逐渐突破,应用场景和数据规模也逐年上升,已经成为企业必不可少的核心基础设施,产业生态也日益繁荣。极限科技作为国内搜索型数据库产品厂商第一梯队的杰出代表,同时也是行业标准的起草单位之一,此次在墨天轮中国数据库流行度排行搜索型数据库分类中荣登榜首,不仅代表着对 [INFINI Easysearch](https://www.infinilabs.com/products/easysearch/) 搜索型数据库的肯定,更代表着极限科技在“搜索数据库”产品的研究与创新上,取得了新的里程碑。

未来,极限科技将持续专注于打造国产搜索型数据库产品,致力于为用户提供更加优质、稳定、高效、安全的数据搜索服务和分析体验。

关于极限科技(INFINI Labs)


![关于极限科技](https://infinilabs.com/img/blo ... bs.png)

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

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

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

让 Easysearch 运行在 LoongArch(3C5000L) 上

Hardy 发表了文章 • 3 个评论 • 1763 次浏览 • 2023-09-11 12:53 • 来自相关话题

简介


在上一次,我介绍了在国产操作系统 Kylin V10 (Lance)-aarch64 上安装单机版 Easysearch/Console/Agent/Gateway/Loadgen,小伙伴们可[查看原文](https://elasticsearch.cn/article/14908)。今天我重点介绍下在 Loongnix-Server Linux release 8.4.1 (3C5000L)上安装 Easysearch。

系统配置


在安装之前,需要先进行系统参数调整并创建操作用户,以下命令均需要使用 root 用户操作。

```bash

配置nofile和memlock

tee /etc/security/limits.d/21-infini.conf <<-'EOF'

  • soft nofile 1048576
  • hard nofile 1048576
  • soft memlock unlimited
  • hard memlock unlimited
    root soft nofile 1048576
    root hard nofile 1048576
    root soft memlock unlimited
    root hard memlock unlimited
    EOF

    关闭THP

    echo never > /sys/kernel/mm/transparent_hugepage/enabled
    echo never > /sys/kernel/mm/transparent_hugepage/defrag
    grep -i HugePages_Total /proc/meminfo

    grep -wq transparent_hugepage /etc/rc.local || cat <<-'EOF' >> /etc/rc.local

    if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
    echo never > /sys/kernel/mm/transparent_hugepage/enabled
    fi
    if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
    echo never > /sys/kernel/mm/transparent_hugepage/defrag
    fi
    EOF
    chmod 755 /etc/rc.local

    内核调优

    tee /etc/sysctl.d/70-infini.conf <<-'EOF'
    vm.max_map_count = 262145
    net.core.somaxconn = 65535
    net.core.netdev_max_backlog = 65535
    net.ipv4.tcp_max_syn_backlog = 65535
    net.ipv4.tcp_syncookies = 1
    net.ipv4.tcp_tw_reuse = 1
    net.ipv4.tcp_timestamps=1
    net.ipv4.tcp_fin_timeout = 10
    net.ipv4.tcp_keepalive_time = 900
    net.ipv4.tcp_max_tw_buckets = 2000000
    net.ipv4.ip_local_port_range = 1024 65535
    EOF
    sysctl -p /etc/sysctl.d/70-infini.conf
    ```

    用户配置


    ```bash

    创建Easysearch操作用户

    groupadd -g 602 es
    useradd -u 602 -g es -m -d /home/es -c 'easysearch' -s /bin/bash es
    ```

    配置 JDK


    ```bash

    在各个节点上分别操作

    wget -N http://ftp.loongnix.cn/Java/op ... ar.gz -P /usr/src

    mkdir -p /usr/local/jdk
    tar -zxf /usr/src/loongson*.tar.gz -C /usr/local/jdk --strip-components 1

    tee /etc/profile.d/java.sh <<-'EOF'

    set java environment

    JAVA_HOME=/usr/local/jdk
    CLASSPATH=$CLASSPATH:$JAVA_HOME/lib
    PATH=$JAVA_HOME/bin:$PATH
    export PATH JAVA_HOME CLASSPATH
    EOF
    source /etc/profile
    java -version
    ```

    Easysearch 部署


    部署及密码配置


    ```bash

    在线安装

    curl -sSL http://get.infini.sh | bash -s -- -p easysearch -d /data/easysearch

    初始化证书(若不采用默认证书,如需要调整证书可修改证书生成文件)

    cd /data/easysearch

    默认会生成随机密码

    bin/initialize.sh
    ll /data/easysearch/config/{.crt,.key,*.pem}
    ```

    配置文件及 JVM 调整


    ```bash
    cat < /data/easysearch/config/easysearch.yml
    cluster.name: infinilabs
    node.name: node-1
    network.host: 0.0.0.0
    http.port: 9200
    transport.port: 9300
    bootstrap.memory_lock: false
    bootstrap.system_call_filter: false

    cluster.initial_master_nodes: ["node-1"]

    path.home: /data/easysearch
    path.data: /data/easysearch/data
    path.logs: /data/easysearch/logs

    http.compression: true

    security.enabled: true
    security.audit.type: noop
    security.ssl.transport.cert_file: instance.crt
    security.ssl.transport.key_file: instance.key
    security.ssl.transport.ca_file: ca.crt
    security.ssl.transport.skip_domain_verify: true
    security.ssl.http.enabled: true
    security.ssl.http.cert_file: instance.crt
    security.ssl.http.key_file: instance.key
    security.ssl.http.ca_file: ca.crt

    security.allow_default_init_securityindex: true

    security.nodes_dn:

    • 'CN=infini.cloud,OU=UNIT,O=ORG,L=NI,ST=FI,C=IN'

      security.restapi.roles_enabled: [ "superuser", "security_rest_api_access" ]

      security.system_indices.enabled: true
      security.ssl.http.clientauth_mode: OPTIONAL
      security.system_indices.indices: [".infini-*"]

      for admin dn

      specify admin certs to operate against system indices, basic_auth is not required

      curl -k --cert config/admin.crt --key config/admin.key -XDELETE 'https://localhost:9200/.infini-*/'

      security.authcz.admin_dn:

    • 'CN=admin.infini.cloud,OU=UNIT,O=ORG,L=NI,ST=FI,C=IN'
      EOF

      根据实际机器内存的大小进行配置,推荐配置为机器内存一半,且不超过31G

      sed -i "s/1g/4g/g" $ES_HOME/config/jvm.options
      ```

      备份目录及权限调整


      ```bash

      创建备份目录

      mkdir -p /data/easysearch/backup

      更新目录权限

      chown -R es.es /data/easysearch
      ```

      环境变量及启动服务


      ```bash
      su - es
      grep -wq easysearch ~/.bashrc || cat<> ~/.bashrc
      export ES_HOME=/data/easysearch
      EOF
      source ~/.bashrc

      jna替换<龙芯平台有独立的jna实现>

      rm -rvf $ES_HOME/lib/jna*.jar
      wget -N https://release.infinilabs.com ... 1.jar -P $ES_HOME/lib

      以后台方式启动服务

      $ES_HOME/bin/easysearch -d
      ```

      Easysearch 验证


      bash<br /> curl -ku "admin:$pass" <a href="https://127.0.0.1:9200" rel="nofollow" target="_blank">https://127.0.0.1:9200</a><br /> curl -ku "admin:$pass" <a href="https://127.0.0.1:9200/_cluster/health?pretty" rel="nofollow" target="_blank">https://127.0.0.1:9200/_cluster/health?pretty</a><br /> curl -ku "admin:$pass" <a href="https://127.0.0.1:9200/_cat/nodes?v" rel="nofollow" target="_blank">https://127.0.0.1:9200/_cat/nodes?v</a><br />

      ![Easysearch信息](https://infinilabs.com/img/blo ... ch.jpg)

      部署 Console


      ```bash
      curl -sSL http://get.infini.sh | bash -s -- -p console

      安装服务并启动

      cd /opt/console
      ./console-linux-loong64 -service install
      ./console-linux-loong64 -service start

      验证

      systemctl status console
      ```

      部署 Agent


      ```bash
      curl -sSL http://get.infini.sh | bash -s -- -p agent

      修改Agent配置文件

      cd /opt/agent
      sed -i "/ES_ENDPOINT:/ s|(.\: ).|\1$https://localhost:9200|" agent.yml
      sed -i "/ES_USER:/ s|(.\: ).|\1admin|" agent.yml
      sed -i "/ES_PASS:/ s|(.\: ).|\1$pass|" gateway.yml
      sed -i "/API_BINDING:/ s|(.\: ).|\1\"0.0.0.0:8080\"|" agent.yml
      head -n 5 agent.yml

      安装服务并启动

      ./agent-linux-loong64 -service install
      ./agent-linux-loong64 -service start

      验证

      systemctl status agent
      ```

      部署 Gateway


      ```bash
      curl -sSL http://get.infini.sh | bash -s -- -p gateway
      cd /opt/gateway

      修改Gateway配置文件

      sed -i "/ES_PASS:/ s|(.\: ).|\1$pass|" gateway.yml
      head -n 10 gateway.yml

      安装服务并启动

      ./gateway-linux-loong64 -service install
      ./gateway-linux-loong64 -service start

      检查服务

      systemctl status gateway
      curl -u "admin:$pass" http://127.0.0.1:8000
      ```

      部署 Loadgen


      ```bash
      curl -sSL http://get.infini.sh | bash -s -- -p loadgen

      写入数据测试

      cd /opt/loadgen
      mkdir -p mock
      cat < mock/nginx.log
      175.10.75.216 - - [28/Jul/2020:21:20:26 +0800] "GET / HTTP/1.1" 200 8676 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"
      175.10.75.216 - - [28/Jul/2020:21:20:26 +0800] "GET /vendor/bootstrap/css/bootstrap.css HTTP/1.1" 200 17235 "<a href="http://dl-console.elasticsearch.cn/"" rel="nofollow" target="_blank">http://dl-console.elasticsearch.cn/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"
      175.10.75.216 - - [28/Jul/2020:21:20:26 +0800] "GET /vendor/daterangepicker/daterangepicker.css HTTP/1.1" 200 1700 "<a href="http://dl-console.elasticsearch.cn/"" rel="nofollow" target="_blank">http://dl-console.elasticsearch.cn/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"
      175.10.75.216 - - [28/Jul/2020:21:20:26 +0800] "GET /vendor/fork-awesome/css/v5-compat.css HTTP/1.1" 200 2091 "<a href="http://dl-console.elasticsearch.cn/"" rel="nofollow" target="_blank">http://dl-console.elasticsearch.cn/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"
      175.10.75.216 - - [28/Jul/2020:21:20:26 +0800] "GET /assets/font/raleway.css HTTP/1.1" 200 145 "<a href="http://dl-console.elasticsearch.cn/"" rel="nofollow" target="_blank">http://dl-console.elasticsearch.cn/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"
      175.10.75.216 - - [28/Jul/2020:21:20:26 +0800] "GET /vendor/fork-awesome/css/fork-awesome.css HTTP/1.1" 200 8401 "<a href="http://dl-console.elasticsearch.cn/"" rel="nofollow" target="_blank">http://dl-console.elasticsearch.cn/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"
      175.10.75.216 - - [28/Jul/2020:21:20:26 +0800] "GET /assets/css/overrides.css HTTP/1.1" 200 2524 "<a href="http://dl-console.elasticsearch.cn/"" rel="nofollow" target="_blank">http://dl-console.elasticsearch.cn/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"
      175.10.75.216 - - [28/Jul/2020:21:20:26 +0800] "GET /assets/css/theme.css HTTP/1.1" 200 306 "<a href="http://dl-console.elasticsearch.cn/"" rel="nofollow" target="_blank">http://dl-console.elasticsearch.cn/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"
      175.10.75.216 - - [28/Jul/2020:21:20:26 +0800] "GET /vendor/fancytree/css/ui.fancytree.css HTTP/1.1" 200 3456 "<a href="http://dl-console.elasticsearch.cn/"" rel="nofollow" target="_blank">http://dl-console.elasticsearch.cn/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"
      175.10.75.216 - - [28/Jul/2020:21:20:26 +0800] "GET /syncthing/development/logbar.js HTTP/1.1" 200 486 "<a href="http://dl-console.elasticsearch.cn/"" rel="nofollow" target="_blank">http://dl-console.elasticsearch.cn/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"
      EOF

      cat < loadgen.yml
      env:
      ES_USERNAME: admin
      ES_PASSWORD: $pass
      ES_ENDPOINT: http://localhost:8000
      runner:

      total_rounds: 1

      no_warm: false

      Whether to log all requests

      log_requests: false

      Whether to log all requests with the specified response status

      log_status_codes:

    • 0
    • 500
      assert_invalid: false
      assert_error: false
      variables:
    • name: ip
      type: file
      path: dict/ip.txt
    • name: message
      type: file
      path: mock/nginx.log
      replace: # replace special characters in the value
      '"': '\"'
      '\': '\'
    • name: user
      type: file
      path: dict/user.txt
    • name: id
      type: sequence
    • name: uuid
      type: uuid
    • name: now_local
      type: now_local
    • name: now_utc
      type: now_utc
    • name: now_unix
      type: now_unix
    • name: suffix
      type: range
      from: 10
      to: 13
      requests:
    • request:
      method: POST
      runtime_variables:
      batch_no: uuid
      runtime_body_line_variables:
      routing_no: uuid
      basic_auth:
      username: $[[env.ES_USERNAME]]
      password: $[[env.ES_PASSWORD]]
      url: $[[env.ES_ENDPOINT]]/_bulk
      body_repeat_times: 5000
      body: |
      { "index" : { "_index" : "test-$[[suffix]]", "_id" : "$[[uuid]]" } }
      { "id" : "$[[uuid]]","routing_no" : "$[[routing_no]]","batch_number" : "$[[batch_no]]","message" : "$[[message]]","random_no" : "$[[suffix]]","ip" : "$[[ip]]","now_local" : "$[[now_local]]","now_unix" : "$[[now_unix]]" }
      EOF

      执行测试

      ./loadgen-linux-loong64 -c 6 -d 6 --compress

      检查测试索引文档

      curl -u "admin:$pass" http://127.0.0.1:8000/_cat/indices/test*?v
      ```

      至此,完成在 LoongArch(3C5000L)上安装单机版 Easysearch/Console/Agent/Gateway/Loadgen。通过浏览器 http://机器域名:9000/ 即可访问 Console,对 Easysearch 进行配置管理。

      可能遇到的问题


      ![连接被拒绝](https://infinilabs.com/img/blo ... ct.jpg)

      检查下配置文件中监听的地址是否正确,防火墙是否有关闭。

      ![防火墙状态](https://infinilabs.com/img/blo ... ll.jpg)

      关于 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/download>;

Easysearch 跨集群复制实战

yangmf2040 发表了文章 • 1 个评论 • 1689 次浏览 • 2023-08-22 17:28 • 来自相关话题

在之前的文章中,有通过[极限网关实现容灾](http://www.infinilabs.com/blog ... teway/)的案例。今天给大家介绍 Easysearch 的跨集群复制功能。该功能可在集群之间复制数据,应用场景包括但不限于以下举例:

  • 灾备同步:将数据同步到灾备中心,灾备中心可对外提供查询服务。
  • 读写分离:单一集群读写压力都较大时,为了避免读写互相干扰造成性能降级,可将读压力分流到另外的集群。
  • 就近查询:在多地中心之间复制数据,应用只需连接本地 ES 集群读取数据,避免网络延时和干扰。

    跨集群复制使用 active-passive 模型,由目标集群主动拉取数据变化到本地,因此对源集群影响很小。

    先决条件


  • 源集群和目标集群都必须安装 cross-cluster-replication 和 index-management 插件。安装插件参考[这里](https://www.infinilabs.com/doc ... 3%2585)。
  • 如果目标集群的 easysearch.yml 文件中覆盖了 node.roles,确保它也包括 remote_cluster_client 角色,默认已启用。

    演示环境


  • 源集群( leader 集群 ): 192.168.3.45:9200
  • 目标集群( follower 集群 ): 192.168.3.39:9200
  • 两个集群都已启用 security 功能。

    设置集群间证书互信


    将两个集群的证书合并到一个文件,将文件放到 config 目录下。

    yaml<br /> cat ca-A.crt ca-B.crt > trust-chain.pem<br />

    更新 easysearch.yml 文件,变化如下。

    ```yaml

    security.ssl.transport.ca_file: ca.crt

    security.ssl.transport.ca_file: trust-chain.pem
    ```

    设置跨群集连接


    在目标集群建立源集群的连接信息。在 INFINI console 的[开发工具](https://www.infinilabs.com/doc ... tools/)中,选中目标集群,执行以下命令。

    yaml<br /> PUT /_cluster/settings?pretty<br /> {<br /> "persistent": {<br /> "cluster": {<br /> "remote": {<br /> "primary": {<br /> "seeds": ["192.168.3.45:9300"]<br /> }<br /> }<br /> }<br /> }<br /> }<br />

    开始复制


    首先在源集群创建测试索引 test , 并向索引写入数据。如果有测试索引,此步可省略。

    yaml<br /> POST /_bulk?pretty<br /> { "index" : { "_index" : "test", "_id" : "1" } }<br /> { "field1" : "value1" }<br /> { "create" : { "_index" : "test", "_id" : "2" } }<br /> { "field2" : "value2" }<br />

    然后在目标集群,创建一个名为 follower-test 的索引来复制源集群中 test 索引的内容。follower-test 可更换成自己想要的名字。

    yaml<br /> PUT /_replication/follower-test/_start?pretty<br /> {<br /> "leader_alias": "primary",<br /> "leader_index": "test",<br /> "use_roles":{<br /> "leader_cluster_role": "cross_cluster_replication_leader_full_access",<br /> "follower_cluster_role": "cross_cluster_replication_follower_full_access"<br /> }<br /> }<br />

  • leader_alias 指定之前创建的连接名称 primary 。
  • leader_index 指定想要复制的索引名称 test 。
  • use_roles 指定用什么角色访问对应的集群,为了安全使用最小权限,命令中的角色是系统自带的。

    命令执行完后,会在目标集群建立名为 follower-test 的索引,其内容来自源集群的 test 索引。 我们可以看到,其内容就是之前插入的两个文档。
    ![](https://infinilabs.com/img/blo ... /1.png)

    确认复制状态


    可以看到 follow-test 处于同步的状态会实时同步远端的数据。

    yaml<br /> GET /_replication/follower-test/_status?pretty<br />

    ![](https://infinilabs.com/img/blo ... /2.png)
    在源集群再插入数据,看是否会同步。

    yaml<br /> POST /_bulk?pretty<br /> { "index" : { "_index" : "test", "_id" : "3" } }<br /> { "field3" : "value3" }<br /> { "create" : { "_index" : "test", "_id" : "4" } }<br /> { "field4" : "value4" }<br />

    目标集群查询索引,文档 3 和 4 已同步。
    ![](https://infinilabs.com/img/blo ... /3.png)

    暂停和恢复复制


    如果需要停机维护或其他原因想暂停复制功能,可使用暂停和恢复索引复制。

    暂停


    暂停目标集群上的索引复制。源集群索引再有新的变化,不会进行同步。

    yaml<br /> POST /_replication/follower-test/_pause?pretty<br /> {}<br />

    暂停后查看索引复制状态为 PAUSED 。

    yaml<br /> GET /_replication/follower-test/_status?pretty<br />

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

    恢复


    恢复目标集群上的索引复制。

    yaml<br /> POST /_replication/follower-test/_resume?pretty<br /> {}<br />

    停止复制


    为了保证数据的一致性,目标集群上的 follower 索引都是只读的。如果要切换到可读写的状态,需要先停止复制。我们先直接写入数据,会报禁止该操作。
    ![](https://infinilabs.com/img/blo ... /5.png)
    停止复制
    执行停止复制命令,索引变为可读写状态,一个独立状态,不再会从源端复制内容。想要删除索引之前,也要先停止复制。

    yaml<br /> POST /_replication/follower-test/_stop?pretty<br /> {}<br />

    再次写入数据测试,成功。
    ![](https://infinilabs.com/img/blo ... /6.png)

    自动跟随


    前面给大家演示了单个索引的复制操作,对于每天自动创建一个索引的场景(日期后缀),这样的操作不免太麻烦了。跨集群复制的自动跟随功能,可以在目标集群建立一个复制模式,如果源集群新建索引名称匹配该模式,目标集群会自动创建一个索引来复制它。

    创建复制模式
    先在目标集群建立一个复制模式,模式名叫 nginx-index ,会自动复制源集群上 nginx 开头的索引。

    yaml<br /> POST /_replication/_autofollow?pretty<br /> {<br /> "leader_alias" : "primary",<br /> "name": "nginx-index",<br /> "pattern": "nginx*",<br /> "use_roles":{<br /> "leader_cluster_role": "cross_cluster_replication_leader_full_access",<br /> "follower_cluster_role": "cross_cluster_replication_follower_full_access"<br /> }<br /> }<br /> <br />

    源集群创建 nginx 开头的索引。

    yaml<br /> POST /nginx-1/_doc/<br /> {<br /> "test":"test"<br /> }<br /> <br /> POST /nginx-2/_doc/<br /> {<br /> "test":"test2"<br /> }<br />

    目标集群查看复制结果。
    ![](https://infinilabs.com/img/blo ... /7.png)

    停止自动跟随


    如果不想复制新创建 nginx 开头的索引,可以使用停止跟随。停止自动跟随仅仅停止任何新的自动跟随活动,不会停止现存自动跟随启动的复制。

    yaml<br /> DELETE /_replication/_autofollow?pretty<br /> {<br /> "leader_alias" : "primary",<br /> "name": "nginx-index"<br /> }<br /> <br />

    上述命令不会影响目标集群上 nginx-1 和 nginx-2 索引的复制。而且 nginx-1 和 nginx-2 索引是只读的,如果要切换到读写状态,先停止复制。

    yaml<br /> POST /_replication/nginx-1/_stop?pretty<br /> {}<br />

    小结


    这次实战主要演示了跨集群复制的操作过程:

    1. 建立证书互信
    2. 目标集群创建跨集群连接
    3. 开始复制:单索引或自动跟随复制
    4. 管理复制:暂停、查看状态、恢复、停止、删除自动跟随

      好的,这次跨集群复制实战就到这里了,更多的内容大家可参考[官方文档](https://www.infinilabs.com/doc ... r_api/)。如遇到问题,可以通过微信群、[Discord](https://discord.com/channels/1 ... 966313) 联系我们。

      关于 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/download>;

使用 Logstash 同步 MySQL 到 Easysearch

yangmf2040 发表了文章 • 0 个评论 • 1381 次浏览 • 2023-08-17 00:49 • 来自相关话题

从 MySQL 同步数据到 ES 有多种方案,这次我们使用 ELK 技术栈中的 Logstash 来将数据从 MySQL 同步到 Easysearch 。

方案前提


  1. MySQL 表记录必须有主键,比如 id 字段。通过该字段,可将 Easysearch 索引数据与 MySQL 表数据形成一对一映射关系,支持修改。
  2. MySQL 表记录必须有时间字段,以支持增量同步。

    如果上述条件具备,便可使用 logstash 定期同步新写入或修改后的数据到 Easysearch 中。

    方案演示

    版本信息

    MySQL: 5.7
    Logstash: 7.10.2
    Easysearch: 1.5.0

    MySQL 设置

    创建演示用的表。
    yaml<br /> CREATE DATABASE es_db;<br /> USE es_db;<br /> DROP TABLE IF EXISTS es_table;<br /> CREATE TABLE es_table (<br /> id BIGINT(20) UNSIGNED NOT NULL,<br /> PRIMARY KEY (id),<br /> UNIQUE KEY unique_id (id),<br /> client_name VARCHAR(32) NOT NULL,<br /> modification_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,<br /> insertion_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP<br /> );<br />
    说明

    • id 字段: 主键、唯一键,将作为 Easysearch 索引中的 doc id 字段。
    • modification_time 字段: 表记录的插入和修改都会记录在此。
    • client_name: 代表用户数据。
    • insertion_time: 可省略,用来记录数据插入到 MySQL 数据的时间。

      插入数据

      yaml<br /> INSERT INTO es_table (id, client_name) VALUES (1, 'test 1');<br /> INSERT INTO es_table (id, client_name) VALUES (2, 'test 2');<br /> INSERT INTO es_table (id, client_name) VALUES (3, 'test 3');<br />

      Logstash

      配置文件
      yaml<br /> input {<br /> jdbc {<br /> jdbc_driver_library => "./mysql-connector-j-8.1.0/mysql-connector-j-8.1.0.jar"<br /> jdbc_driver_class => "com.mysql.jdbc.Driver"<br /> jdbc_connection_string => "jdbc:mysql://192.168.56.3:3306/es_db"<br /> jdbc_user => "root"<br /> jdbc_password => "password"<br /> jdbc_paging_enabled => true<br /> tracking_column => "unix_ts_in_secs"<br /> use_column_value => true<br /> tracking_column_type => "numeric"<br /> last_run_metadata_path => "./.mysql-es_table-sql_last_value.yml"<br /> schedule => "*/5 * * * * *"<br /> statement => "SELECT *, UNIX_TIMESTAMP(modification_time) AS unix_ts_in_secs FROM es_table WHERE (UNIX_TIMESTAMP(modification_time) > :sql_last_value AND modification_time < NOW()) ORDER BY modification_time ASC"<br /> }<br /> jdbc {<br /> jdbc_driver_library => "./mysql-connector-j-8.1.0/mysql-connector-j-8.1.0.jar"<br /> jdbc_driver_class => "com.mysql.jdbc.Driver"<br /> jdbc_connection_string => "jdbc:mysql://192.168.56.3:3306/es_db"<br /> jdbc_user => "root"<br /> jdbc_password => "password"<br /> schedule => "*/5 * * * * *"<br /> statement => "SELECT count(*) AS count,'es_table' AS table_name from es_table"<br /> }<br /> }<br /> filter {<br /> if ![table_name] {<br /> mutate {<br /> copy => { "id" => "[@metadata][_id]"}<br /> remove_field => ["@version", "unix_ts_in_secs","@timestamp"]<br /> add_field => { "[@metadata][target_index]" => "mysql_es_table" } }<br /> } else {<br /> mutate { <br /> add_field => { "[@metadata][target_index]" => "table_counts" } <br /> remove_field => ["@version"]<br /> }<br /> uuid {<br /> target => "[@metadata][_id]"<br /> overwrite => true<br /> }<br /> }<br /> }<br /> output {<br /> elasticsearch {<br /> hosts => ["<a href="https://localhost:9200"" rel="nofollow" target="_blank">https://localhost:9200"</a>]<br /> user => "admin"<br /> password => "f0c6fc61fe5f7b084c00"<br /> ssl_certificate_verification => "false"<br /> index => "%{[@metadata][target_index]}"<br /> manage_template => "false"<br /> document_id => "%{[@metadata][_id]}"<br /> }<br /> }<br />

    • 每 5 秒钟同步一次 es_table 表的数据到 mysql_sync_idx 索引。
    • 每 5 秒统计一次 es_table 表的记录条数到 table_counts 索引,用于监控。

      启动 logstash

      yaml<br /> ./bin/logstash -f sync_es_table.conf<br />
      查看同步结果, 3 条数据都已同步到索引。
      ![](https://www.infinilabs.com/img ... /1.png)
      Mysql 数据库新增记录
      yaml<br /> INSERT INTO es_table (id, client_name) VALUES (4, 'test 4');<br />
      Easysearch 确认新增
      ![](https://www.infinilabs.com/img ... /2.png)

      Mysql 数据库修改记录
      yaml<br /> UPDATE es_table SET client_name = 'test 0001' WHERE id=1;<br />
      Easysearch 确认修改
      ![](https://www.infinilabs.com/img ... /3.png)

      删除数据

      Logstash 无法直接删除操作到 ES ,有两个方案:

  3. 在表中增加 is_deleted 字段,实现软删除,可达到同步的目的。查询过滤掉 is_deleted : true 的记录,后续通过脚本等方式定期清理 is_deleted : true 的数据。
  4. 执行删除操作的程序,删除完 MySQL 中的记录后,继续删除 Easysearch 中的记录。

    同步监控

    数据已经在 ES 中了,我们可利用 INFINI Console 的数据看板来监控数据是否同步,展示表记录数、索引记录数及其变化。
    ![](https://www.infinilabs.com/img ... /4.png)

Easysearch 跨版本兼容性测试,还原 Elasticsearch 各版本快照数据

liaosy 发表了文章 • 0 个评论 • 3336 次浏览 • 2023-06-17 12:50 • 来自相关话题

本文主要测试验证 Elasticsearch 各版本快照在 [Easysearch](https://www.infinilabs.com/doc ... erview) 中进行数据恢复。

准备测试数据


索引


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

别名


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

模版


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

生命周期策略


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

创建快照


<br /> PUT /_snapshot/my_backup<br /> {<br /> "type": "fs",<br /> "settings": {<br /> "location": "/infini/test/es_backup"<br /> }<br /> }<br /> <br /> PUT /_snapshot/my_backup/snapshot_1<br /> {<br /> "indices": "*",<br /> "ignore_unavailable": false,<br /> "include_global_state": false<br /> }<br /> <br /> GET /_snapshot/my_backup/snapshot_1<br />

  • ignore_unavailable:如果 indices 列表中的索引不存在,则是否忽略该索引而不是使快照失败。默认值为 false 。
  • include_global_state:是否在快照中包含集群状态(包括索引模版、生命周期配置、持久化配置等)。默认值为 true ,建议设为 false。

    恢复快照


    <br /> POST /_snapshot/my_backup/snapshot_1/_restore<br /> {<br /> "indices": "*",<br /> "ignore_unavailable": false,<br /> "include_global_state": false,<br /> "include_aliases": true,<br /> "ignore_index_settings": [<br /> "index.lifecycle.indexing_complete"<br /> ]<br /> }<br />

  • ignore_unavailable:如果 indices 列表中的索引不存在,则是否忽略该索引而不是使还原操作失败。默认值为 false 。
  • include_global_state:是否还原群集状态。默认值为 false 。
  • include_aliases:是否恢复别名及其关联索引。默认值为 true 。
  • index.lifecycle.indexing_complete 配置不支持,忽略掉。

    数据验证


    索引


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

    通过 gateway 进行数据比对

    ```
    path.data: data
    path.logs: log

    show progress bar

    progress_bar.enabled: true


    elasticsearch:

    • name: source
      enabled: true
      endpoints:
    • name: target
      enabled: true
      endpoints:
    • name: index_diff_service
      auto_start: true
      processor:
      • dag:
        mode: wait_all
        parallel:
        • dump_hash: #dump es1's doc
          sort_document_fields: true
          indices: ".infini_activities-000004" ##需要比对的索引名
          scroll_time: "10m"
          elasticsearch: "source"

          query_string: "_id:c8es70pu46lgfdgmja9g-1646117763293610802-2"

          fields: "doc_hash"

          output_queue: "source_docs"
          batch_size: 5000
          slice_size: 1

          hash_func: "xxhash64"

        • dump_hash: #dump es2's doc
          indices: ".infini_activities-000004"
          scroll_time: "10m"

          fields: "doc_hash"

          query_string: "_id:c8es70pu46lgfdgmja9g-1646117763293610802-2"

          batch_size: 5000
          slice_size: 1

          hash_func: "xxhash64"

          elasticsearch: "target"
          output_queue: "target_docs"
          end:

        • index_diff:
          diff_queue: "diff_result"
          buffer_size: 10
          text_report: true #如果要存 es,这个开关关闭,开启 pipeline 的 diff_result_ingest 任务
          source_queue: "source_docs"
          target_queue: "target_docs"

          pipeline:

          - name: diff_result_ingest

          processor:

          - json_indexing:

          index_name: "diff_result"

          elasticsearch: "source"

          input_queue: "diff_result"

          ```

          ./gateway-linux-amd64 -config data_check.yml

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

          别名


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

          模版


          <br /> PUT _template/.infini_activities-rollover<br /> {<br /> "order": 100000,<br /> "index_patterns": [<br /> ".infini_activities*"<br /> ],<br /> "settings": {<br /> "index": {<br /> "format": "7",<br /> "lifecycle": {<br /> "name": "ilm_.infini_metrics-30days-retention",<br /> "rollover_alias": ".infini_activities"<br /> },<br /> "codec": "best_compression",<br /> "number_of_shards": "1",<br /> "translog": {<br /> "durability": "async"<br /> }<br /> }<br /> },<br /> "mappings": {<br /> "dynamic_templates": [<br /> {<br /> "strings": {<br /> "mapping": {<br /> "ignore_above": 256,<br /> "type": "keyword"<br /> },<br /> "match_mapping_type": "string"<br /> }<br /> }<br /> ]<br /> },<br /> "aliases": {}<br /> }<br /> <br /> PUT _template/.infini<br /> {<br /> "order": 0,<br /> "index_patterns": [<br /> ".infini_*"<br /> ],<br /> "settings": {<br /> "index": {<br /> "max_result_window": "10000000",<br /> "mapping": {<br /> "total_fields": {<br /> "limit": "20000"<br /> }<br /> },<br /> "analysis": {<br /> "analyzer": {<br /> "suggest_text_search": {<br /> "filter": [<br /> "word_delimiter"<br /> ],<br /> "tokenizer": "classic"<br /> }<br /> }<br /> },<br /> "number_of_shards": "1"<br /> }<br /> },<br /> "mappings": {<br /> "dynamic_templates": [<br /> {<br /> "strings": {<br /> "mapping": {<br /> "ignore_above": 256,<br /> "type": "keyword"<br /> },<br /> "match_mapping_type": "string"<br /> }<br /> }<br /> ]<br /> },<br /> "aliases": {}<br /> }<br />

          生命周期策略


          <br /> PUT _ilm/policy/ilm_.infini_metrics-30days-retention<br /> {<br /> "policy": {<br /> "phases": {<br /> "hot": {<br /> "min_age": "0ms",<br /> "actions": {<br /> "rollover": {<br /> "max_size": "50gb",<br /> "max_age": "30d"<br /> },<br /> "set_priority": {<br /> "priority": 100<br /> }<br /> }<br /> },<br /> "delete": {<br /> "min_age": "30d",<br /> "actions": {<br /> "delete": {<br /> }<br /> }<br /> }<br /> }<br /> }<br /> }<br />

          注:不支持 "delete_searchable_snapshot": true 配置

          测试结果


          | 源集群(Elasticsearch) | 目标集群(Easysearch) | 测试结果 |
          | ----------------------- | ---------------------- | -------------------------- |
          | 7.10.2 | 1.0.0 | 索引文档一致,别名恢复成功 |
          | 7.10.1 | 1.0.0 | 索引文档一致,别名恢复成功 |
          | 7.10.0 | 1.0.0 | 索引文档一致,别名恢复成功 |
          | 7.9.2 | 1.0.0 | 索引文档一致,别名恢复成功 |
          | 7.9.0 | 1.0.0 | 索引文档一致,别名恢复成功 |
          | 7.8.1 | 1.0.0 | 索引文档一致,别名恢复成功 |
          | 7.5.2 | 1.0.0 | 索引文档一致,别名恢复成功 |
          | 6.8.12 | 1.0.0 | 索引文档一致,别名恢复成功 |
          | 6.5.4 | 1.0.0 | 索引文档一致,别名恢复成功 |


          关于 Easysearch

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

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

          详情参见:[官方文档](https://www.infinilabs.com/doc ... erview)

极限科技旗下软件产品 INFINI Easysearch 通过统信 UOS 认证

liaosy 发表了文章 • 0 个评论 • 2854 次浏览 • 2023-06-16 17:10 • 来自相关话题

近日,极限数据 (北京) 科技有限公司(以下简称:极限科技)旗下的软件 INFINI Easysearch 搜索引擎软件 V1.0 通过统信 UOS 服务器操作系统 V20 认证。

此次兼容适配基于统信 UOS 服务器操作系统 V20,联合国产 CPU:海光 5000、海光 7000、兆芯 KH-30000、兆芯 KH20000、兆芯 ZX-C+ 等系列处理器,经过共同严格测试表明 INFINI Easysearch 搜索引擎软件 V1.0 整体运行稳定,满足功能及兼容性测试要求,并获得通用软硬件适配认证中心联合认证证书。

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

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

统信软件是以“打造中国操作系统创新生态”为使命的中国基础软件公司。基于国产芯片架构的操作系统产品已经和龙芯、飞腾、申威、鲲鹏、兆芯、海光等芯片厂商开展了广泛和深入的合作,与国内各主流整机厂商及软件厂商展开了全方位的兼容性适配工作。

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

极限科技研发的 INFINI Easysearch 是一个分布式的近实时搜索与分析引擎,同时也是一款具备自主可控的分布式近实时搜索型数据库产品,具备高性能、高可用、弹性伸缩、高安全性等特性,具备支持丰富的个性化搜索及聚合分析能力,可部署在物理机、虚拟机、容器、私有云和公有云,能承载 PB 级别的海量业务数据,为金融核心系统、运营商、制造业和政企业务系统提供安全、稳定、可靠的快速检索和实时数据探索分析能力,可满足不同业务场景的各项复杂需求。

此次通过统信 UOS 的兼容适配联合认证,标志着极限科技在支持国产化方面又迈出关键一步。此外,Easysearch 也实现了对麒麟、欧拉等国产操作系统的支持。未来,极限科技将积极参与国产创新技术生态的建设,坚持自主可控安全可靠,深化对国产化软硬件技术栈的支持能力,为用户提供更加优质、稳定、高效、安全的产品与服务。

关于极限科技(INFINI Labs)


![关于极限科技](https://www.infinilabs.com/img ... bs.png)

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

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

详情参见官网:[https://www.infinilabs.com](https://www.infinilabs.com)

让 Easysearch 运行在 Kylin V10 (Lance)-aarch64 上

Hardy 发表了文章 • 0 个评论 • 3141 次浏览 • 2023-06-07 11:08 • 来自相关话题

简介


本文主要介绍在国产操作系统 Kylin V10 (Lance)-aarch64 上安装单机版 Easysearch/Console/Agent/Gateway/Loadgen

系统配置


在安装之前,需要先进行系统参数调整并创建操作用户,以下命令均需要使用 root 用户操作。

```bash

配置nofile和memlock

tee /etc/security/limits.d/21-infini.conf <<-'EOF'

  • soft nofile 1048576
  • hard nofile 1048576
  • soft memlock unlimited
  • hard memlock unlimited
    root soft nofile 1048576
    root hard nofile 1048576
    root soft memlock unlimited
    root hard memlock unlimited
    EOF

    关闭THP

    echo never > /sys/kernel/mm/transparent_hugepage/enabled
    echo never > /sys/kernel/mm/transparent_hugepage/defrag
    grep -i HugePages_Total /proc/meminfo

    grep -wq transparent_hugepage /etc/rc.local || cat <<-'EOF' >> /etc/rc.local

    if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
    echo never > /sys/kernel/mm/transparent_hugepage/enabled
    fi
    if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
    echo never > /sys/kernel/mm/transparent_hugepage/defrag
    fi
    EOF
    chmod 755 /etc/rc.local

    内核调优

    tee /etc/sysctl.d/70-infini.conf <<-'EOF'
    vm.max_map_count = 262145
    net.core.somaxconn = 65535
    net.core.netdev_max_backlog = 65535
    net.ipv4.tcp_max_syn_backlog = 65535
    net.ipv4.tcp_syncookies = 1
    net.ipv4.tcp_tw_reuse = 1
    net.ipv4.tcp_timestamps=1
    net.ipv4.tcp_fin_timeout = 10
    net.ipv4.tcp_keepalive_time = 900
    net.ipv4.tcp_max_tw_buckets = 2000000
    net.ipv4.ip_local_port_range = 1024 65535
    EOF
    sysctl -p /etc/sysctl.d/70-infini.conf
    ```

    用户配置


    ```bash

    创建Easysearch操作用户

    groupadd -g 602 es
    useradd -u 602 -g es -m -d /home/es -c 'easysearch' -s /bin/bash es
    ```

    配置 JDK


    ```bash

    在各个节点上分别操作

    wget -N https://release.infinilabs.com ... ar.gz -P /usr/src

    mkdir -p /usr/local/jdk
    tar -zxf /usr/src/zulu*.tar.gz -C /usr/local/jdk --strip-components 1

    tee /etc/profile.d/java.sh <<-'EOF'

    set java environment

    JAVA_HOME=/usr/local/jdk
    CLASSPATH=$CLASSPATH:$JAVA_HOME/lib
    PATH=$JAVA_HOME/bin:$PATH
    export PATH JAVA_HOME CLASSPATH
    EOF
    source /etc/profile
    java -version
    ```

    Easysearch 部署


    部署及密码配置


    ```bash

    在线安装

    curl -sSL http://get.infini.sh | bash -s -- -p easysearch -d /data/easysearch

    初始化证书(若不采用默认证书,如需要调整证书可修改证书生成文件)

    cd /data/easysearch
    bin/initialize.sh
    ll /data/easysearch/config/{.crt,.key,*.pem}

    调整默认密码及服务配置文件

    export ES_HOME=/data/easysearch
    pass=tr -cd 'a-zA-Z0-9!@#$%' </dev/urandom | head -c20

    记录密码后,删除该文件

    echo $pass > /tmp/pass
    hash=$ES_HOME/bin/hash_password.sh -p $pass
    echo $hash

    更新密码字段

    cat < $ES_HOME/config/security/user.yml
    meta:
    type: "user"
    config_version: 2

    Define your internal users here


    Admin users

    admin:
    hash: "$hash"
    reserved: true
    external_roles:

    • "admin"
      description: "Admin user"
      EOF
      ```

      配置文件及 JVM 调整


      ```bash
      cat < /data/easysearch/config/easysearch.yml
      cluster.name: infinilabs
      node.name: node-1
      network.host: 0.0.0.0
      http.port: 9200
      transport.port: 9300
      bootstrap.memory_lock: false
      bootstrap.system_call_filter: false

      cluster.initial_master_nodes: ["node-1"]

      path.home: /data/easysearch
      path.data: /data/easysearch/data
      path.logs: /data/easysearch/logs

      http.compression: true

      security.enabled: true
      security.audit.type: noop
      security.ssl.transport.cert_file: instance.crt
      security.ssl.transport.key_file: instance.key
      security.ssl.transport.ca_file: ca.crt
      security.ssl.transport.skip_domain_verify: true
      security.ssl.http.enabled: true
      security.ssl.http.cert_file: instance.crt
      security.ssl.http.key_file: instance.key
      security.ssl.http.ca_file: ca.crt

      security.allow_default_init_securityindex: true

      security.nodes_dn:

    • 'CN=infini.cloud,OU=UNIT,O=ORG,L=NI,ST=FI,C=IN'

      security.restapi.roles_enabled: [ "superuser", "security_rest_api_access" ]

      security.system_indices.enabled: true
      security.ssl.http.clientauth_mode: OPTIONAL
      security.system_indices.indices: [".infini-*"]

      for admin dn

      specify admin certs to operate against system indices, basic_auth is not required

      curl -k --cert config/admin.crt --key config/admin.key -XDELETE 'https://localhost:9200/.infini-*/'

      security.authcz.admin_dn:

    • 'CN=admin.infini.cloud,OU=UNIT,O=ORG,L=NI,ST=FI,C=IN'
      EOF

      根据实际机器内存的大小进行配置,推荐配置为机器内存一半,且不超过31G

      sed -i "s/1g/4g/g" $ES_HOME/config/jvm.options
      ```

      备份目录及权限调整


      ```bash

      创建备份目录

      mkdir -p /data/easysearch/backup

      更新目录权限

      chown -R es.es /data/easysearch
      ```

      环境变量及启动服务


      ```bash
      su - es
      grep -wq easysearch ~/.bashrc || cat<> ~/.bashrc
      export ES_HOME=/data/easysearch
      EOF
      source ~/.bashrc

      以后台方式启动服务

      $ES_HOME/bin/easysearch -d
      ```

      Easysearch 验证


      bash<br /> curl -ku "admin:$pass" <a href="https://127.0.0.1:9200" rel="nofollow" target="_blank">https://127.0.0.1:9200</a><br /> curl -ku "admin:$pass" <a href="https://127.0.0.1:9200/_cluster/health?pretty" rel="nofollow" target="_blank">https://127.0.0.1:9200/_cluster/health?pretty</a><br /> curl -ku "admin:$pass" <a href="https://127.0.0.1:9200/_cat/nodes?v" rel="nofollow" target="_blank">https://127.0.0.1:9200/_cat/nodes?v</a><br />

      部署 Console


      ```bash
      curl -sSL http://get.infini.sh | bash -s -- -p console

      安装服务并启动

      cd /opt/console
      ./console-linux-arm64 -service install
      ./console-linux-arm64 -service start

      验证

      systemctl status console
      ```

      部署 Agent


      ```bash
      curl -sSL http://get.infini.sh | bash -s -- -p agent

      修改Agent配置文件

      cd /opt/agent
      sed -i "/ES_ENDPOINT:/ s|(.\: ).|\1$https://localhost:9200|" agent.yml
      sed -i "/ES_USER:/ s|(.\: ).|\1admin|" agent.yml
      sed -i "/ES_PASS:/ s|(.\: ).|\1$pass|" gateway.yml
      sed -i "/API_BINDING:/ s|(.\: ).|\1\"0.0.0.0:8080\"|" agent.yml
      head -n 5 agent.yml

      安装服务并启动

      ./agent-linux-arm64 -service install
      ./agent-linux-arm64 -service start

      验证

      systemctl status agent
      ```

      部署 Gateway


      ```bash
      curl -sSL http://get.infini.sh | bash -s -- -p gateway
      cd /opt/gateway

      修改Gateway配置文件

      sed -i "/ES_PASS:/ s|(.\: ).|\1$pass|" gateway.yml
      head -n 10 gateway.yml

      安装服务并启动

      ./gateway-linux-arm64 -service install
      ./gateway-linux-arm64 -service start

      检查服务

      systemctl status gateway
      curl -u "admin:$pass" http://127.0.0.1:8000
      ```

      部署 Loadgen


      ```bash
      curl -sSL http://get.infini.sh | bash -s -- -p loadgen

      写入数据测试

      cd /opt/loadgen
      mkdir -p mock
      cat < mock/nginx.log
      175.10.75.216 - - [28/Jul/2020:21:20:26 +0800] "GET / HTTP/1.1" 200 8676 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"
      175.10.75.216 - - [28/Jul/2020:21:20:26 +0800] "GET /vendor/bootstrap/css/bootstrap.css HTTP/1.1" 200 17235 "<a href="http://dl-console.elasticsearch.cn/"" rel="nofollow" target="_blank">http://dl-console.elasticsearch.cn/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"
      175.10.75.216 - - [28/Jul/2020:21:20:26 +0800] "GET /vendor/daterangepicker/daterangepicker.css HTTP/1.1" 200 1700 "<a href="http://dl-console.elasticsearch.cn/"" rel="nofollow" target="_blank">http://dl-console.elasticsearch.cn/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"
      175.10.75.216 - - [28/Jul/2020:21:20:26 +0800] "GET /vendor/fork-awesome/css/v5-compat.css HTTP/1.1" 200 2091 "<a href="http://dl-console.elasticsearch.cn/"" rel="nofollow" target="_blank">http://dl-console.elasticsearch.cn/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"
      175.10.75.216 - - [28/Jul/2020:21:20:26 +0800] "GET /assets/font/raleway.css HTTP/1.1" 200 145 "<a href="http://dl-console.elasticsearch.cn/"" rel="nofollow" target="_blank">http://dl-console.elasticsearch.cn/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"
      175.10.75.216 - - [28/Jul/2020:21:20:26 +0800] "GET /vendor/fork-awesome/css/fork-awesome.css HTTP/1.1" 200 8401 "<a href="http://dl-console.elasticsearch.cn/"" rel="nofollow" target="_blank">http://dl-console.elasticsearch.cn/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"
      175.10.75.216 - - [28/Jul/2020:21:20:26 +0800] "GET /assets/css/overrides.css HTTP/1.1" 200 2524 "<a href="http://dl-console.elasticsearch.cn/"" rel="nofollow" target="_blank">http://dl-console.elasticsearch.cn/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"
      175.10.75.216 - - [28/Jul/2020:21:20:26 +0800] "GET /assets/css/theme.css HTTP/1.1" 200 306 "<a href="http://dl-console.elasticsearch.cn/"" rel="nofollow" target="_blank">http://dl-console.elasticsearch.cn/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"
      175.10.75.216 - - [28/Jul/2020:21:20:26 +0800] "GET /vendor/fancytree/css/ui.fancytree.css HTTP/1.1" 200 3456 "<a href="http://dl-console.elasticsearch.cn/"" rel="nofollow" target="_blank">http://dl-console.elasticsearch.cn/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"
      175.10.75.216 - - [28/Jul/2020:21:20:26 +0800] "GET /syncthing/development/logbar.js HTTP/1.1" 200 486 "<a href="http://dl-console.elasticsearch.cn/"" rel="nofollow" target="_blank">http://dl-console.elasticsearch.cn/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"
      EOF

      cat < loadgen.yml
      env:
      ES_USERNAME: admin
      ES_PASSWORD: $pass
      ES_ENDPOINT: http://localhost:8000
      runner:

      total_rounds: 1

      no_warm: false

      Whether to log all requests

      log_requests: false

      Whether to log all requests with the specified response status

      log_status_codes:

    • 0
    • 500
      assert_invalid: false
      assert_error: false
      variables:
    • name: ip
      type: file
      path: dict/ip.txt
    • name: message
      type: file
      path: mock/nginx.log
      replace: # replace special characters in the value
      '"': '\"'
      '\': '\'
    • name: user
      type: file
      path: dict/user.txt
    • name: id
      type: sequence
    • name: uuid
      type: uuid
    • name: now_local
      type: now_local
    • name: now_utc
      type: now_utc
    • name: now_unix
      type: now_unix
    • name: suffix
      type: range
      from: 10
      to: 13
      requests:
    • request:
      method: POST
      runtime_variables:
      batch_no: uuid
      runtime_body_line_variables:
      routing_no: uuid
      basic_auth:
      username: $[[env.ES_USERNAME]]
      password: $[[env.ES_PASSWORD]]
      url: $[[env.ES_ENDPOINT]]/_bulk
      body_repeat_times: 5000
      body: |
      { "index" : { "_index" : "test-$[[suffix]]", "_id" : "$[[uuid]]" } }
      { "id" : "$[[uuid]]","routing_no" : "$[[routing_no]]","batch_number" : "$[[batch_no]]","message" : "$[[message]]","random_no" : "$[[suffix]]","ip" : "$[[ip]]","now_local" : "$[[now_local]]","now_unix" : "$[[now_unix]]" }
      EOF

      执行测试

      ./loadgen-linux-arm64 -c 6 -d 6 --compress

      检查测试索引文档

      curl -u "admin:$pass" http://127.0.0.1:8000/_cat/indices/test*?v
      ```

      至此,完成在 Kylin V10 (Lance)-aarch64 上安装单机版 Easysearch/Console/Agent/Gateway/Loadgen。通过浏览器 http://安装机器 IP:9000/ 即可访问 Console,对 Easysearch 进行配置管理。