博客园  :: 首页  :: 联系 :: 管理

ES各版本对比及升级路径

Posted on   天戈朱  阅读(870)  评论(0编辑  收藏  举报

一、6.X、7.X 和 8.X 之间存储的差异


注意:这里的比较,将不做任何的配置上的优化,也就是说,在不开启任何场景调优选项的情况下,单纯比较版本间,在相同数据集上的默认存储消耗。

在选择 Elasticsearch 的版本时,我们会选择最广泛使用的版本,而不会涉及所有子版本。

  • 6.x版本:我们将选择6.8作为测试版本;
  • 7.x版本:我们将选择7.10;这主要是因为在7.10版本中,Elastic进行了许可证的更改,使其成为许多云服务提供商支持的 Elasticsearch 版本的分水岭。同时,我们注意到 Opensearch 也是从这个版本中分支出来的。
  • 8.x版本:我们将使用腾讯云提供的最新版本8.8.1

1、日志场景

 1)、数据结构schema 如下:

  • 复制代码
    {
      "settings": {
        "number_of_shards": 5,
        "number_of_replicas": 1,
        "analysis": {
            "analyzer": {
              "oap_log_analyzer": {
                "type": "standard"
              }
            }
          }
      }, 
      "mappings": {
        "_source": {
          "excludes": [
            "tags"
          ]
        },
        "properties": {
          "content": {
            "type": "text",
            "copy_to": [
              "content_match"
            ]
          },
          "content_match": {
            "type": "text",
            "analyzer": "oap_log_analyzer"
          },
          "content_type": {
            "type": "integer",
            "index": false
          },
          "endpoint_id": {
            "type": "keyword"
          },
          "service_id": {
            "type": "keyword"
          },
          "service_instance_id": {
            "type": "keyword"
          },
          "span_id": {
            "type": "integer"
          },
          "tags": {
            "type": "keyword"
          },
          "tags_raw_data": {
            "type": "binary"
          },
          "time_bucket": {
            "type": "long"
          },
          "timestamp": {
            "type": "long"
          },
          "trace_id": {
            "type": "keyword"
          },
          "trace_segment_id": {
            "type": "keyword"
          },
          "unique_id": {
            "type": "keyword"
          }
        }
      }
    }
    View Code
    复制代码

     这个索引有5个分片和0个副本,使用了一个自定义的分析器 oap_log_analyzer

   这个索引有15个字段,大致可以分为以下几类:

  • 文本类型(text):这些字段用来存储需要分词的字符串,比如content。这些字段可以用来进行全文检索、模糊匹配等操作。
  • 关键词类型(keyword):这些字段用来存储不需要分词的字符串,比如endpoint_id、service_id等。这些字段可以用来进行精确匹配、排序、聚合等操作。
  • 数值类型(integer、long等):这些字段用来存储整数或长整数,比如content_type、span_id等。这些字段可以用来进行数值比较、范围查询、聚合等操作。
  • 二进制类型(binary):这些字段用来存储二进制数据,比如tags_raw_data。这些字段不会被索引或搜索,只能用于存储或检索。
  • 复制类型(copy_to):这些字段用来存储其他字段的值的副本,比如content_match。这些字段可以用来进行多字段查询。
  • 分析器类型(analyzer):这些字段用来指定使用哪种分析器来处理文本,比如content_match。这些字段可以用不同的分词规则来影响搜索结果。

 2)、样例数据 如下:

  • 复制代码
          {
            "_index": "sw_log-20231023",
            "_id": "fe620a61abca48b394358015a04a55b8",
            "_score": 1,
            "_source": {
              "trace_id": "9ad5dfed-1def-4ed3-b233-5dce5afa66c8",
              "unique_id": "fe620a61abca48b394358015a04a55b8",
              "span_id": 0,
              "endpoint_id": "c29uZ3M=.1_VW5kZXJ0b3dEaXNwYXRjaA==",
              "service_instance_id": "c29uZ3M=.1_Mzg0ZWZlYWE2NzFjNGFhYjg2ZGFmZjA3OWE4YjljYzZAMTcyLjIyLjAuNg==",
              "content": """2023-10-23 23:59:49.247 [TID:9ad5dfed-1def-4ed3-b233-5dce5afa66c8] [XNIO-1 task-2] INFO  o.a.s.s.s.s.c.SongController -Listing top songs
    """,
              "trace_segment_id": "7e097591b9b74531a14df130f17087a8.54.16981055892474632",
              "content_type": 1,
              "tags_raw_data": "Cg0KBWxldmVsEgRJTkZPClAKBmxvZ2dlchJGb3JnLmFwYWNoZS5za3l3YWxraW5nLnNob3djYXNlLnNlcnZpY2VzLnNvbmcuY29udHJvbGxlci5Tb25nQ29udHJvbGxlcgoXCgZ0aHJlYWQSDVhOSU8tMSB0YXNrLTI=",
              "service_id": "c29uZ3M=.1",
              "time_bucket": 20231023235949,
              "timestamp": 1698105589247
            }
          }
    View Code
    复制代码

 3)、结果:我们分别在6.8,7.10,8.8的集群上写入相同的数据,通过_stats/store,segments接口,我们得到三个版本的索引统计信息的区别:

  •  

    小结:存储大小随着版本的升级而减少,这是因为Elasticsearch对索引结构和压缩算法进行了优化

  • 相对于6.8版本,8.8版本的存储优化百分比为 ≈14.78%
  • 相对于7.10版本,8.8版本的存储优化百分比为 ≈12.64%

     内存占用从6.8到7.10大幅减少,再到到8.8变为0,这是因为Elasticsearch对内存管理进行了改进,即进行了heap-offload,也更改了加载的方式

2、指标数据对比

 1)、指标数据 schema

  • 复制代码
    {
      "settings": {
        "number_of_replicas": 1,
        "number_of_shards": 1,
        "analysis": {
            "analyzer": {
              "oap_analyzer": {
                "type": "standard"
              }
            }
          }
      }, 
      "mappings": {
        "properties": {
          "address": {
            "type": "keyword"
          },
          "agent_id": {
            "type": "keyword"
          },
          "component_id": {
            "type": "integer",
            "index": false
          },
          "component_ids": {
            "type": "keyword",
            "index": false
          },
          "count": {
            "type": "long",
            "index": false
          },
          "dataset": {
            "type": "text",
            "index": false
          },
          "datatable_count": {
            "type": "text",
            "index": false
          },
          "datatable_summation": {
            "type": "text",
            "index": false
          },
          "datatable_value": {
            "type": "text",
            "index": false
          },
          "denominator": {
            "type": "long"
          },
          "dest_endpoint": {
            "type": "keyword"
          },
          "dest_process_id": {
            "type": "keyword"
          },
          "dest_service_id": {
            "type": "keyword"
          },
          "dest_service_instance_id": {
            "type": "keyword"
          },
          "detect_type": {
            "type": "integer"
          },
          "double_summation": {
            "type": "double",
            "index": false
          },
          "double_value": {
            "type": "double"
          },
          "ebpf_profiling_schedule_id": {
            "type": "keyword"
          },
          "end_time": {
            "type": "long"
          },
          "endpoint": {
            "type": "keyword"
          },
          "endpoint_traffic_name": {
            "type": "keyword",
            "copy_to": [
              "endpoint_traffic_name_match"
            ]
          },
          "endpoint_traffic_name_match": {
            "type": "text",
            "analyzer": "oap_analyzer"
          },
          "entity_id": {
            "type": "keyword"
          },
          "instance_id": {
            "type": "keyword"
          },
          "instance_traffic_name": {
            "type": "keyword",
            "index": false
          },
          "int_value": {
            "type": "integer"
          },
          "label": {
            "type": "keyword"
          },
          "labels_json": {
            "type": "keyword",
            "index": false
          },
          "last_ping": {
            "type": "long"
          },
          "last_update_time_bucket": {
            "type": "long"
          },
          "layer": {
            "type": "integer"
          },
          "match": {
            "type": "long",
            "index": false
          },
          "message": {
            "type": "keyword"
          },
          "metric_table": {
            "type": "keyword"
          },
          "name": {
            "type": "keyword"
          },
          "numerator": {
            "type": "long"
          },
          "parameters": {
            "type": "keyword",
            "index": false
          },
          "percentage": {
            "type": "integer"
          },
          "precision": {
            "type": "integer",
            "index": false
          },
          "process_id": {
            "type": "keyword"
          },
          "profiling_support_status": {
            "type": "integer"
          },
          "properties": {
            "type": "text",
            "index": false
          },
          "remote_service_name": {
            "type": "keyword"
          },
          "represent_service_id": {
            "type": "keyword"
          },
          "represent_service_instance_id": {
            "type": "keyword"
          },
          "s_num": {
            "type": "long",
            "index": false
          },
          "service": {
            "type": "keyword"
          },
          "service_group": {
            "type": "keyword"
          },
          "service_id": {
            "type": "keyword"
          },
          "service_instance": {
            "type": "keyword"
          },
          "service_instance_id": {
            "type": "keyword"
          },
          "service_name": {
            "type": "keyword"
          },
          "service_traffic_name": {
            "type": "keyword",
            "copy_to": [
              "service_traffic_name_match"
            ]
          },
          "service_traffic_name_match": {
            "type": "text",
            "analyzer": "oap_analyzer"
          },
          "short_name": {
            "type": "keyword"
          },
          "source_endpoint": {
            "type": "keyword"
          },
          "source_process_id": {
            "type": "keyword"
          },
          "source_service_id": {
            "type": "keyword"
          },
          "source_service_instance_id": {
            "type": "keyword"
          },
          "span_name": {
            "type": "keyword"
          },
          "start_time": {
            "type": "long"
          },
          "summation": {
            "type": "long",
            "index": false
          },
          "t_num": {
            "type": "long",
            "index": false
          },
          "tag_key": {
            "type": "keyword"
          },
          "tag_type": {
            "type": "keyword"
          },
          "tag_value": {
            "type": "keyword"
          },
          "task_id": {
            "type": "keyword"
          },
          "time_bucket": {
            "type": "long"
          },
          "total": {
            "type": "long",
            "index": false
          },
          "total_num": {
            "type": "long",
            "index": false
          },
          "type": {
            "type": "keyword"
          },
          "uuid": {
            "type": "keyword"
          },
          "value": {
            "type": "long"
          }
        }
      }
    }
    View Code
    复制代码

     这个索引有一个副本和一个分片,使用了一个自定义的分析器 oap_analyzer

    这个索引有很多字段,大致可以分为以下几类:

  • 关键词类型(keyword):这些字段用来存储不需要分词的字符串,比如address、agent_id、dest_endpoint等。这些字段可以用来进行精确匹配、排序、聚合等操作。
  • 文本类型(text):这些字段用来存储需要分词的字符串,比如dataset、datatable_count、datatable_summation等。这些字段可以用来进行全文检索、模糊匹配等操作。
  • 数值类型(integer、long、double等):这些字段用来存储整数或浮点数,比如component_id、count、double_value等。这些字段可以用来进行数值比较、范围查询、聚合等操作。
  • 二进制类型(binary):这些字段用来存储二进制数据,比如uuid。这些字段不会被索引或搜索,只能用于存储或检索。
  • 复制类型(copy_to):这些字段用来存储其他字段的值的副本,比如endpoint_traffic_name_match、service_traffic_name_match等。这些字段可以用来进行多字段查询。
  • 分析器类型(analyzer):这些字段用来指定使用哪种分析器来处理文本,比如endpoint_traffic_name_match、service_traffic_name_match等。这些字段可以用不同的分词规则来影响搜索结果。

 2)、结果 如下

  •  

    小结:

  • 存储大小随着版本的升级而减少,8.8版本的存储大小是157943758字节,比6.8版本的存储大小减少了41.2%,比7.10版本的存储大小减少了8.2%
  • 这说明8.8版本在文档压缩和索引优化方面有很大的改进,特别是当索引中含有比较多的keyword和数值类型字段时。

二、Elasticsearch 7.x 相较于 5.x 版本的改进和优化


1、类型(Type)被移除

  • 5.x:一个索引可以包含多个类型(types),类型之间共享相同的字段定义。但类型引发了很多问题,特别是映射冲突。
  • 7.x:彻底移除了类型的概念,强调了“每个索引只能包含一个类型”。在 6.x 版本中类型已被弃用,7.x 中完全废除。这简化了映射管理,避免了映射冲突问题。
  • 说明:把 Index  看作关系型数据库实例(Database)的话,Type 相当于数据库中的table概念

2、默认分片数量的调整

  • 5.x:默认每个索引有 5 个主分片。
  • 7.x:默认主分片数量减少到 1 个,用户可以根据需求手动设置分片数量。这减少了小索引的分片管理开销。

3. 集群稳定性

  • 优化的主节点选举机制:7.x 中引入了改进的主节点选举过程,防止分裂脑问题,集群在主节点故障时更稳定。
  • 更好的分片分配:7.x 优化了分片分配策略,提高了分片迁移的效率和稳定性。

4、Java High-Level REST Client

  • 5.x:通常使用 Transport Client 进行集群交互,但它被认为不易维护且在 7.x 之后不再推荐使用。
  • 7.x:引入并推荐使用 Java 高级 REST 客户端,它更易于维护并使用 HTTP 协议与 Elasticsearch 交互,减少了使用低级别 API 的复杂性。

5、压缩和性能改进

  • Faster and Smaller Indexes:7.x 版本对索引的压缩方式进行了优化,通过 Lucene 的改进减少了索引的磁盘占用,提高了查询性能。
  • 写入性能:7.x 在写入路径中通过多线程和内存结构的优化,提高了写入性能。

6、查询优化

  • Unified Query API:7.x 中进一步简化了查询 DSL(Domain-Specific Language),提高了查询的灵活性和一致性。
  • 优化聚合查询:在 7.x 中,对聚合查询进行了进一步优化,特别是在处理大型数据集时,性能提升显著。

7、热-冷架构支持

  • Index Lifecycle Management (ILM):7.x 引入了索引生命周期管理,可以根据数据的使用模式自动将索引从热节点移至冷节点或冷存储,降低了长期存储的成本。

8、轻量型索引(Data Streams)

  • 7.x 引入了数据流的概念(Data Streams),特别适用于时间序列数据。通过这种机制,Elasticsearch 可以更高效地处理日志和时间序列数据,并能更轻松地管理数据的生命周期。

三、8.X 新特性


 随着时间的推移,ES逐渐增加了更多的功能,如聚合分析、地理位置搜索、实时数据处理等。在版本 7 中,Elasticsearch 引入了一些重要的改进,如更好的性能优化、更强大的安全功能和更丰富的查询语言。

而版本 8 的推出,则是 Elasticsearch 发展历程中的一个重要里程碑,带来了一系列的重大变革和突破。

  • 在性能方面:版本 8 进行了一系列的优化,提高了查询和写入的性能,使得用户能够更快地获取到搜索结果和处理数据。
  • 在安全性方面:版本 8 引入了更强大的安全机制,保护用户的数据安全和隐私。
  • 在功能方面:版本 8 增加了许多新的特性,如机器学习功能的改进、搜索体验的提升等,为用户提供了更多的价值和可能性。

1、安全性增强 -- 新的安全机制

  • 8.X 中引入了更为先进的身份验证和授权机制,为系统的安全性提供了更坚实的保障。内置的用户管理功能使得管理员可以方便地创建、修改和删除用户,同时可以为用户分配不同的角色和权限。
  • 通过角色管理功能,管理员可以定义不同的角色,并为每个角色分配相应的权限,如查询、写入、管理等。这样,用户在进行操作时,系统会根据其所属的角色和权限进行验证,确保只有授权的用户能够进行相应的操作。

2、安全性增强 -- 数据保护机制

  • 为了保护数据的机密性和完整性,版本 8 采用了多种加密技术。
  • 在数据传输过程中,通过使用 SSL/TLS 协议对数据进行加密,确保数据在网络传输过程中的安全。
  • 在数据存储方面,Elasticsearch 支持对数据进行加密存储,只有拥有相应密钥的用户才能解密和访问数据。
  • 此外,通过设置访问策略,管理员可以限制用户对数据的访问范围和操作权限,防止数据泄露和滥用

3、性能优化 -- 查询性能提升

  • 首先,缓存机制得到了改进,使得经常使用的查询结果能够更快地被返回,减少了重复计算的开销。
  • 其次,查询计划的优化使得系统能够根据查询的特点和数据的分布情况,选择最优的查询执行计划,提高查询的效率。
  • 此外,版本 8 还对索引结构进行了优化,进一步提高了查询的性能
  • 为了展示查询性能的显著提升,我们进行了一系列的实际测试。在测试中,我们使用了相同的数据集和查询语句,分别在版本 7 和版本 8 上进行查询操作。测试结果表明,版本 8 的查询性能相比版本 7 有了明显的提升,查询时间缩短了 30%以上

4、性能优化 -- 写入性能提升

  • 批量写入功能的增强使得可以一次性写入大量的数据,减少了与服务器的交互次数,提高了写入效率。
  • 异步写入则允许将数据先写入缓存,然后在后台进行异步处理,提高了系统的并发处理能力
  • 此外,版本 8 还对数据的分段存储和合并策略进行了优化,减少了写入过程中的磁盘 I/O 操作,进一步提高了写入性能。
  • 通过实际测试数据对比版本 7 及之前的版本,我们可以看到版本 8 的写入性能有了显著的改进。在相同的测试环境下,版本 8 的写入速度比版本 7 提高了 20%左右

四、8.X 版本升级指南


  •  To upgrade to 8.0.1 from 7.16 or earlier, you must first upgrade to 7.17. 
  • 早期版更新至7.17的间隔更新版本:5.6、6.8、7.X
  • Elasticsearch 采用了非常保守的升级策略,本质上是让集群的维护者、使用者自己去把控风险,手动升级。这或许也是 Elasticsearch 官方没有提供一键升级的原因。 

  • 因为,中间环节有太多不可控的因素。如果一键升级,每个用户的集群环境千差万别,会出各种问题。 

  • 全部交给用户手动升级,复杂是复杂了点,但这是保留用户体验方面折中的实现方案。

 

参考


努力加载评论中...
点击右上角即可分享
微信分享提示