Elasticsearch 7.16 强势升级至 8.13.4,引爆数据革命新纪元之详细版_搜索引擎

简介      

      Elasticsearch是一个强大的搜索和分析引擎,随着新版本的发布,升级是保持系统性能和安全性的关键。将Elasticsearch从7.16升级到8.13.4是一个复杂且关键的过程,涉及多方面的准备和实施步骤。

准备工作

  • 备份数据

在进行任何升级操作之前,务必对现有的 Elasticsearch 数据进行全量备份。可以使用 Elasticsearch 的 Snapshot 功能或其他备份工具进行备份。

PUT /_snapshot/my_backup
{
  "type": "fs",
  "settings": {
    "location": "/mount/backups/my_backup"
  }
}
  • 验证插件和依赖项

确保所有使用的插件和依赖项在新版本中仍然兼容和可用。有些插件可能需要升级到与 Elasticsearch 8.x 兼容的版本。

  • 检查系统要求

确保新版本的 Elasticsearch 符合所需的 Java 版本和操作系统要求。

升级步骤

  • 升级到 7.17.5

升级到 7.17.5 是必要的步骤,因为它允许您使用升级助手来识别和解决问题。如果ES的版本的是7.0之前的,就不能采用下面的这种升级方法了,需要重新索引 7.0 之前创建的索引,并进行滚动升级,也就是第二种方案介绍的重建索引。

ES最初版本是7.16.3,所以不用_reindex重新索引,源端索引版本小于 7.0的需要_reindex重新索引此操。

1.禁用分片重新分配

PUT /_cluster/settings
{
  "persistent": {
    "cluster.routing.allocation.enable": "none"
  }
}

2.停止 Elasticsearch 服务 

在升级节点之前,停止 Elasticsearch 服务。

3.备份当前节点的数据 

在升级节点之前,备份当前节点的数据和配置文件,以防万一。

4.逐个节点升级

  • 关闭节点
  • 安装新版本
###分词器 
https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.17.5/elasticsearch-analysis-ik-7.17.5.zip                 
##kibanawget 
wget https://artifacts.elastic.co/downloads/kibana/kibana-7.17.5-linux-x86_64.tar.gz
###ES
wget https://github.com/elastic/elasticsearch/archive/refs/tags/v7.17.5.tar.gz
tar -zxvf elasticsearch-7.17.5-linux-x86_64.tar.gz
cd elasticsearch-7.17.5/
将旧版本的配置文件 (elasticsearch.yml) 中的设置迁移到新的配置文件中。确保所有配置项在新版本中仍然有效。
添加新的参数:(升级助手提示添加)
cluster.routing.allocation.disk.watermark.enable_for_single_data_node: true
kibana配置文件添加下这个参数(升级助手提示添加)
vim kibana.yml
xpack.reporting.roles.enabled: false
  • 启动节点
./bin/elasticsearch
确认节点已加入集群并状态为 green
GET /_cat/nodes?v
检查集群健康状态:
确保集群健康状态为绿色。
GET /_cluster/health
重复以上步骤:
逐个节点进行升级,直到集群中的所有节点都完成升级。

5.重新启用分片重新分配

PUT /_cluster/settings
{
  "persistent": {
    "cluster.routing.allocation.enable": null
  }
}

6.使用升级助手准备升级到 Elasticsearch 8.13.4

# 在 Kibana 中找到升级助手
Management > Elasticsearch > Upgrade Assistant


运行升级助手:
使用 Upgrade Assistant 插件来识别和解决升级前的问题。升级助手将检测到的问题报告为警告或错误,并指导您如何解决它们。


解决问题:
在运行升级之前,确保解决所有的严重问题和警告。

在7.17.5版本的kibana的升级助手中可以看到要升级到8版本需要解决的告警事项。

Elasticsearch 7.16 强势升级至 8.13.4,引爆数据革命新纪元之详细版_elasticsearch_02

Elasticsearch 7.16 强势升级至 8.13.4,引爆数据革命新纪元之详细版_全文检索_03

解决后:

Elasticsearch 7.16 强势升级至 8.13.4,引爆数据革命新纪元之详细版_全文检索_04

kibana剩下的3个警告,主要涉及如下:(配置时报错,所以我这3个警告未解决)

  • ES配置文件修改

关于会话超时的,本人未解决

将设置会话的空闲超时时间为12小时:
xpack.security.session.idleTimeout:12h
设置会话超时为 60 天:
xpack.security.session.lifespan:60d
  • Filebeat 配置

从 Elasticsearch 8.0 开始,Kibana 的日志格式将会发生变化。新的日志格式将采用 ECS 兼容的 JSON 格式,而不再使用旧的日志格式

未做验证,可做参考

filebeat.inputs:
  - type: log
    paths:
      - /var/log/kibana/kibana.log
    json.message_key: message
    json.keys_under_root: true
    processors:
      - decode_json_fields:
          fields: ["message"]
          target: ""
          overwrite_keys: true
    multiline.pattern: '^[[:space:]]'
    multiline.negate: false
    multiline.match: after

下面是8.8.2版本的

filebeat.inputs: - type: log #默认log,从日志文件读取每一行。stdin,从标准输入读取
   paths:
    - /elasticsearch/logs/escluster.log
   multiline.pattern: '^\d{4}\-\d{2}\-\d{2}\s\d{2}:\d{2}:\d{2}' #匹配的正则 不是以2019-09-08 12:23:23 格式开头的将合并到上一行
   multiline.negate: true #多行匹配模式后配置的模式是否取反,默认false
   multiline.match: after #定义多行内容被添加到模式匹配行之后还是之前,默认无,可以被设置为after或者before
setup.template.name: "my-log"
setup.template.pattern: "my-log-*"
setup.template.settings:
  index.number_of_shards: 3
  index.number_of_replicas: 0
output.elasticsearch:
  hosts: ["https://10.206.0.5:9200","https://10.206.0.12:9200","https://10.206.0.14:9200"]
  username: "elastic"
  password: "elasticsearch"
  index: "my-log-%{+yyyy.MM.dd}"
  protocol: "https"
  • 升级到 Elasticsearch 8.13.4

将集群从 7.17.5 升级到 8.x:

###kibaba
wget https://artifacts.elastic.co/downloads/kibana/kibana-8.13.4-linux-x86_64.tar.gz
##分析器
wget https://release.infinilabs.com/analysis-ik/stable/elasticsearch-analysis-ik-8.13.4.zip
##ES
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.13.4-linux-x86_64.tar.gz




ES配置文件删除这个参数(升级助手提示)
cluster.routing.allocation.disk.watermark.enable_for_single_data_node: true
  • 逐个节点进行滚动升级,步骤同上。

替代方案:创建新集群并重新索引

如果滚动升级的停机时间和风险不可接受,可以考虑创建一个新的 Elasticsearch 8.x 集群,然后将数据从旧集群重新索引到新集群。这种方法可以避免对现有集群进行大规模变动。

  • 创建新集群

在新环境中部署一个 8.x 版本的 Elasticsearch 集群。

  • 从远程重新索引

使用 _reindex API 从旧集群中重新索引数据到新集群

语法:
POST /_reindex
{
  "source": {
    "remote": {
      "host": "http://old-cluster:9200"
    },
    "index": "old_index"
  },
  "dest": {
    "index": "new_index"
  }
}
  • 从远程重新索引导入报错
Wed, 10 Jan 2024 10:14:09 GMT | got 1 objects from source elasticsearch (offset: 0)
Wed, 10 Jan 2024 10:14:11 GMT | Error Emitted => {"root_cause":[{"type":"mapper_parsing_exception","reason":"Failed to parse mapping: analyzer [default_search] has not been configured in mappings"}],"type":"mapper_parsing_exception","reason":"Failed to parse mapping: analyzer [default_search] has not been configured in mappings","caused_by":{"type":"illegal_argument_exception","reason":"analyzer [default_search] has not been configured in mappings"}}
Wed, 10 Jan 2024 10:14:11 GMT | Error Emitted => {"root_cause":[{"type":"mapper_parsing_exception","reason":"Failed to parse mapping: analyzer [default_search] has not been configured in mappings"}],"type":"mapper_parsing_exception","reason":"Failed to parse mapping: analyzer [default_search] has not been configured in mappings","caused_by":{"type":"illegal_argument_exception","reason":"analyzer [default_search] has not been configured in mappings"}}
Wed, 10 Jan 2024 10:14:11 GMT | Total Writes: 0
Wed, 10 Jan 2024 10:14:11 GMT | dump ended with error (get phase) => [object Object]

由于是跨大版本重建索引,所以在语法上是存在差异的,报错原因是分词[default_search] type导致,重建索引步骤如下:

1)取源端相关索引信息,剔除掉无用信息

[root@idc-card-es151 ~]# curl -X GET "http://192.168.0.11:9200/boss_company_import/_settings?pretty"
{
  "boss_company_import" : {
    "settings" : {
      "index" : {
        "number_of_shards" : "3",
        "provided_name" : "boss_company_import",
        "creation_date" : "1653483777296",
        "analysis" : {
          "analyzer" : {
            "default_search" : {
              "type" : "ik_smart"
            },
            "default" : {
              "type" : "ik_max_word"
            }
          }
        },
        "number_of_replicas" : "1",
        "uuid" : "iAOFYQgkTpOo8XvvmfDwkg",
        "version" : {
          "created" : "7080099"
        }
      }
    }
  }
}
##修改后配置,在目标端执行分析器配置
PUT /boss_company_import
{
  "settings": {
    "index": {
      "number_of_replicas": 1,
      "number_of_shards" : "3"
    },
    "analysis": {
      "analyzer": {
        "default_search": {
          "type": "ik_smart"
        },
        "default": {
          "type": "ik_max_word"
        }
      }
    }
  }
}


再次执行迁移操作:
elasticdump --input=http://192.168.0.1:9200/boss_company_import --limit=100000 --concurrency=4 --concurrencyInterval=50 --output=http://192.168.0.111:9200/boss_company_import --type=mapping


elasticdump --input=http://192.168.0.1:9200/boss_company_import --limit=100000 --concurrency=4 --concurrencyInterval=50 --output=http://192.168.0.111:9200/boss_company_import --type=data

注意事项

插件和定制脚本:

确保所有使用的插件和自定义脚本在新版本中仍然有效。有些插件可能需要更新到与 Elasticsearch 8.x 兼容的版本,例如Ik、kibana、ES。

Java 版本:

确保安装的 Java 版本符合 Elasticsearch 8.x 的要求。

配置文件变更:

新版本的 Elasticsearch 可能会有一些配置文件的变更,如集群名称、节点设置等。确保更新配置文件以适应新版本的要求。

安全设置:

Elasticsearch 8.x 可能会增强安全功能,如角色、权限管理等。确保在升级后重新配置和设置安全相关的参数。

性能监控:

升级后,密切关注集群的性能和健康状态。确保在升级过程中没有引入性能问题或其他异常情况。

REST API 兼容性:

8.x 版本支持 REST API 的兼容模式,但不保证与 7.x 版本相同的行为。建议尽快将所有请求升级到新版本的语法和功能。

结论

      升级 Elasticsearch 是一个复杂的任务,需要详细的准备工作和逐步执行的升级步骤。通过升级到 7.17,再到 8.13.4,您可以利用升级助手来识别和解决问题,确保顺利完成升级并保持集群的高可用性和稳定性。在升级之前,请务必详细阅读官方文档并进行全面的测试,以确保升级过程安全可靠