ELK,萌萌哒

Easysearch 跨集群复制实战

yangmf2040 发表了文章 • 1 个评论 • 1380 次浏览 • 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 个评论 • 1046 次浏览 • 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 个评论 • 3042 次浏览 • 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 个评论 • 2623 次浏览 • 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 个评论 • 2857 次浏览 • 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 进行配置管理。

INFINI Easysearch 完成龙芯架构兼容性认证

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

近日,极限科技旗下软件产品 INFINI Easysearch 搜索引擎软件 V1.0 在龙芯中科的龙芯 3C5000L 平台上完成兼容性测试,功能与稳定性良好,并获得龙架构兼容互认证书。

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

龙芯是中国自主可控计算机处理器的代表品牌之一。龙芯处理器是由中国科学院计算技术研究所自主研发的一款高性能、低功耗、安全可靠的处理器。龙芯 3C5000L 是龙芯中科专门面向服务器领域的通用处理器。基于龙芯 3A5000 处理器,片上集成共 16 个高性能 LA464 处理器核,采用全新的龙芯自主指令系统(LoongArch®),在提高集成度的同时保持系统和软件与龙芯 3A5000 完全兼容。

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

此次通过龙芯架构(LoongArch)的兼容性测试,有效验证了 Easysearch 对于国产化 CPU 的互操作性与可靠性。此外,Easysearch 也实现了对麒麟、统信、欧拉等国产操作系统的支持。未来,极限科技将继续加强与各大厂商的合作,深化对国产化软硬件技术栈的支持能力,为用户提供更加优质、稳定、高效、安全的搜索服务。

关于极限科技(INFINI Labs)


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

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

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

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