深入解析ElasticSearch从基础概念到性能优化指南

一.引言

ElasticSearch是一个分布式的搜索和分析引擎,专为处理大规模的结构化和非结构化数据而设计。它建立在Apache Lucene之上,提供了强大的全文搜索能力、高可用性和实时分析的功能。无论是作为日志分析平台,还是作为数据驱动的应用程序的一部分,ElasticSearch都能够以极高的性能和扩展性来满足现代企业的需求。

ElasticSearch的重要性

随着数据的快速增长,如何高效地管理和搜索海量数据成为企业的一大挑战。传统的关系型数据库虽然适合结构化数据的管理,但在处理全文搜索和实时分析时,往往会面临性能瓶颈。而ElasticSearch则提供了一种更加灵活和高效的解决方案:

  • 全文搜索:ElasticSearch能够对文本数据进行高效的全文搜索,支持模糊匹配、前缀搜索等复杂查询需求。
  • 实时分析:ElasticSearch不仅仅是一个搜索引擎,它还能够通过聚合功能对数据进行实时分析,提供类似SQL查询的功能。
  • 分布式架构:ElasticSearch采用分布式架构,能够轻松扩展处理大规模数据,同时提供高可用性和容错能力。
典型应用场景

ElasticSearch在多个领域有着广泛的应用,其常见的使用场景包括:

  • 日志分析:ElasticSearch与Logstash和Kibana结合,可以形成一个强大的日志收集、分析和可视化平台(ELK Stack)。它被广泛应用于运维、监控等领域,用于实时分析应用日志,排查系统问题。
  • 全文搜索:许多网站、应用程序使用ElasticSearch来提升用户的搜索体验,如电子商务平台的商品搜索、文档管理系统的全文检索等。
  • 大数据分析:ElasticSearch能够处理结构化和非结构化数据,结合其强大的聚合功能,可以在大数据环境下进行实时的统计和分析。

二.核心概念

要深入理解ElasticSearch,首先需要掌握它的几个核心概念,这些概念是构建和操作ElasticSearch的基础。

1. 索引(Index)与文档(Document)

在ElasticSearch中,索引 是数据存储的基本单元。每个索引都类似于一个数据库,它包含多个文档。文档是存储在索引中的基本数据单元,它相当于关系数据库中的一行数据。

  • 索引(Index):在ElasticSearch中,一个索引类似于数据库的表,包含某一类数据。每个索引有一个唯一的名称,用来标识和引用它。

  • 文档(Document):文档是存储在索引中的JSON格式的数据,类似于数据库表中的一条记录。每个文档都有一个唯一的标识符(_id),通过该标识符可以对文档进行CRUD(创建、读取、更新、删除)操作。

  • 字段(Field):文档中的数据由多个字段组成。每个字段都可以存储不同类型的数据,比如文本、数字、布尔值等。

  • 类型(Type):在ElasticSearch 6.x及更早版本中,一个索引可以包含多种类型(Type),每种类型定义了文档的不同结构。但从ElasticSearch 7.x开始,类型已被弃用,推荐使用一个索引存储一个数据类型。

2. 分片(Shard)与副本(Replica)

ElasticSearch的分布式架构通过 分片副本 来管理和扩展数据存储。

  • 分片(Shard):为了处理大规模的数据,ElasticSearch将索引分成多个分片,每个分片是一个独立的小索引。通过将数据分片,ElasticSearch能够将数据分散存储到不同的节点上,从而提高数据的可扩展性和处理能力。分片的数量在索引创建时指定,之后不可更改。

  • 副本(Replica):为了提供高可用性,ElasticSearch为每个分片创建副本。副本分片用于数据冗余,确保在主分片(Primary Shard)失效时数据不会丢失。副本分片也可以用来提高读性能,因为查询可以并行执行在多个副本上。默认情况下,每个分片会有一个副本分片,但可以根据需求调整副本的数量。

  • 主分片(Primary Shard):每个文档首先存储在一个主分片中。主分片负责处理写请求(如新增、更新、删除文档),然后将更改同步到副本分片。

  • 副本分片(Replica Shard):副本分片是主分片的拷贝,提供数据冗余和查询分担的功能。

3. 倒排索引(Inverted Index)

倒排索引是ElasticSearch中支持全文搜索的核心数据结构。它将每个文档中的字段内容拆分为单独的词条,然后为每个词条建立索引,以便快速查找包含该词条的文档。

举个例子,如果有一个文档内容是“ElasticSearch 是一个强大的搜索引擎”,倒排索引会将“ElasticSearch”、“强大”、“搜索引擎”等词条分别存储,并记录这些词条在文档中的位置。这样,当用户搜索“搜索引擎”时,ElasticSearch可以迅速查找并返回所有包含该词的文档。

倒排索引的优势在于它极大地提升了全文搜索的速度,尤其适用于非结构化数据的搜索,例如日志分析、文档检索等场景。

4. 映射(Mapping)

在ElasticSearch中, 映射(Mapping) 定义了文档中各个字段的数据类型和分析器(Analyzer)。映射可以看作是数据库中的表结构定义,它决定了文档如何被索引和存储。

  • 数据类型:每个字段都需要指定数据类型,如text(用于全文搜索)、keyword(用于精确匹配)、integerdate等。合理选择字段类型对于索引和查询性能有很大影响。

  • 分析器(Analyzer):对于text字段,ElasticSearch通过分析器来对文本进行分词和处理。例如,默认的标准分析器会将一段文本分解为单独的词条,去除停用词(如“的”、“是”)并进行标准化(如小写化)。

5. 查询语言:DSL(Domain Specific Language)

ElasticSearch提供了一种强大的查询DSL(领域特定语言)来构建复杂的查询语句。通过DSL,用户可以灵活地构建各种查询,包括全文搜索、过滤查询、聚合查询等。

  • Match查询:用于全文搜索,自动处理词条的分词和匹配。

  • Term查询:用于精确匹配,不进行分词处理。

  • Boolean查询:通过mustshouldmust_not等条件组合多个子查询,构建复杂的查询逻辑。

DSL查询语言的灵活性是ElasticSearch的强大功能之一,用户可以通过简单的JSON结构构建复杂的搜索和分析逻辑。
以下是第三部分的详细内容:

三.安装与配置

在使用ElasticSearch之前,首先需要正确安装并配置它的环境。本节将介绍ElasticSearch的安装步骤和基础配置,帮助你快速搭建一个ElasticSearch实例。

1. 安装ElasticSearch

ElasticSearch的安装方式多种多样,支持多平台安装。以下列出常见的几种安装方式。

(1)使用包管理器安装

对于Linux(Debian/Ubuntu)用户

  1. 更新软件包列表并安装必要的依赖:

    sudo apt-get update
    sudo apt-get install apt-transport-https
    
  2. 添加ElasticSearch的GPG密钥和存储库:

    wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
    sudo sh -c 'echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" > /etc/apt/sources.list.d/elastic-7.x.list'
    
  3. 安装ElasticSearch:

    sudo apt-get update
    sudo apt-get install elasticsearch
    

对于Linux(CentOS/RHEL)用户

  1. 添加ElasticSearch的存储库:

    sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
    sudo tee /etc/yum.repos.d/elasticsearch.repo <<EOF
    [elasticsearch]
    name=Elasticsearch repository
    baseurl=https://artifacts.elastic.co/packages/7.x/yum
    gpgcheck=1
    gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
    enabled=1
    autorefresh=1
    type=rpm-md
    EOF
    
  2. 安装ElasticSearch:

    sudo yum install elasticsearch
    
(2)使用Docker安装

使用Docker可以方便地在多个平台上部署ElasticSearch。

  1. 下载并运行ElasticSearch镜像:

    docker pull docker.elastic.co/elasticsearch/elasticsearch:7.15.0
    
  2. 运行ElasticSearch容器:

    docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.15.0
    

    通过这种方式,你可以快速启动一个ElasticSearch实例,默认情况下可以通过http://localhost:9200访问它。

(3)手动安装(跨平台)
  1. 前往ElasticSearch的官方下载页面,选择对应操作系统的版本并下载压缩包。

  2. 解压并进入安装目录:

    tar -xzf elasticsearch-7.15.0-linux-x86_64.tar.gz
    cd elasticsearch-7.15.0/
    
  3. 启动ElasticSearch:

    ./bin/elasticsearch
    

    ElasticSearch启动后,你可以通过http://localhost:9200访问实例。

2. 基础配置

ElasticSearch有许多配置项,以下是常用的几项基础配置。

(1)配置文件位置

ElasticSearch的默认配置文件位于安装目录的config/elasticsearch.yml中。通过编辑此文件,你可以修改ElasticSearch的行为。

(2)集群名称和节点名称

ElasticSearch以集群的形式工作,每个实例是集群中的一个节点。通过配置elasticsearch.yml文件,可以修改集群名称和节点名称。

cluster.name: my-cluster
node.name: node-1
(3)网络绑定配置

默认情况下,ElasticSearch只能在本地访问。如果你希望在局域网中访问ElasticSearch,需要修改网络绑定配置:

network.host: 0.0.0.0

这将允许ElasticSearch在所有网络接口上监听。

(4)内存配置

ElasticSearch依赖JVM,因此内存的分配非常重要。可以通过修改jvm.options文件来配置ElasticSearch使用的内存大小。

默认情况下,ElasticSearch会分配堆内存的最大值和最小值为2GB。你可以根据机器的物理内存大小调整:

-Xms4g  # 设置最小堆内存为4GB
-Xmx4g  # 设置最大堆内存为4GB

建议设置为物理内存的50%左右,但不超过32GB。

(5)持久化存储路径

ElasticSearch的数据和日志默认存储在安装目录下的datalogs文件夹中。你可以通过以下配置项修改数据存储路径和日志路径:

path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
3. 基本操作
(1)启动ElasticSearch

通过以下命令启动ElasticSearch:

sudo systemctl start elasticsearch

要设置ElasticSearch开机自启,可以使用:

sudo systemctl enable elasticsearch
(2)验证ElasticSearch是否正常运行

ElasticSearch默认运行在9200端口,启动后你可以通过访问以下地址验证它是否启动成功:

http://localhost:9200

如果启动成功,返回结果会是类似以下的JSON信息:

{"name" : "node-1","cluster_name" : "my-cluster","cluster_uuid" : "fjkdfs...fjksd","version" : {"number" : "7.15.0","build_flavor" : "default","build_type" : "tar","build_hash" : "e5acb...","build_date" : "2021-09-16T03:05:29.143308Z","build_snapshot" : false,"lucene_version" : "8.9.0","minimum_wire_compatibility_version" : "6.8.0","minimum_index_compatibility_version" : "6.0.0-beta1"},"tagline" : "You Know, for Search"
}
(3)创建索引与添加文档

启动ElasticSearch后,可以通过RESTful API与它交互。以下是创建索引和添加文档的简单示例:

  • 创建索引

    curl -X PUT "localhost:9200/my-index"
    
  • 添加文档

    curl -X POST "localhost:9200/my-index/_doc/1" -H 'Content-Type: application/json' -d'
    {"name": "ElasticSearch","description": "A powerful search engine"
    }
    '
    
  • 查询文档

    curl -X GET "localhost:9200/my-index/_doc/1"
    

四.查询与优化

ElasticSearch提供了丰富的查询功能,使其能够快速有效地搜索和分析海量数据。然而,随着数据量的增加,查询性能可能会成为一个问题。本节将介绍ElasticSearch的查询机制和如何优化查询性能。

1. 查询类型

ElasticSearch使用DSL(领域特定语言)来构建查询,它支持多种类型的查询,以下是常用的几种查询类型:

(1)Match查询

match查询用于全文搜索,自动将查询内容分词,并匹配相关的文档。它是最常用的查询类型之一。

示例:

curl -X GET "localhost:9200/my-index/_search" -H 'Content-Type: application/json' -d'
{"query": {"match": {"description": "search engine"}}
}'

此查询会搜索所有文档,并返回description字段中包含“search”和“engine”词条的文档。

(2)Term查询

term查询用于精确匹配,不进行分词操作,适合用来查询未经过分词的keyword字段。

示例:

curl -X GET "localhost:9200/my-index/_search" -H 'Content-Type: application/json' -d'
{"query": {"term": {"name": "ElasticSearch"}}
}'

此查询只返回name字段中完全匹配"ElasticSearch"的文档。

(3)Boolean查询

bool查询用于组合多个子查询,可以通过mustshouldmust_not等条件构建复杂的查询逻辑。

示例:

curl -X GET "localhost:9200/my-index/_search" -H 'Content-Type: application/json' -d'
{"query": {"bool": {"must": [{ "match": { "description": "search" } }],"must_not": [{ "term": { "name": "ElasticSearch" } }]}}
}'

此查询会查找description中包含"search"的文档,但排除name字段为"ElasticSearch"的文档。

(4)Range查询

range查询用于数值或日期范围查询。

示例:

curl -X GET "localhost:9200/my-index/_search" -H 'Content-Type: application/json' -d'
{"query": {"range": {"price": {"gte": 10,"lte": 50}}}
}'

此查询会返回price字段值在10到50之间的文档。

2. 查询优化

随着数据量的增加和查询的复杂化,查询性能可能会下降。以下是一些常见的优化方法,帮助你提升ElasticSearch查询的效率。

(1)使用过滤器而非查询

ElasticSearch的查询分为评分查询(即需要计算相关性得分的查询)和过滤查询(即不需要评分的查询)。对于那些不需要相关性得分的查询,例如状态、类别等精确匹配的字段,推荐使用filter而不是query,因为filter可以被缓存并且执行速度更快。

示例:

{"query": {"bool": {"filter": [{ "term": { "status": "active" } }]}}
}

filter的查询结果会被缓存,重复查询时性能会更好。

(2)分页与深度查询优化

默认情况下,ElasticSearch使用fromsize参数来控制分页,但在深度分页时性能会受到影响(特别是超过10,000条记录时)。这是因为ElasticSearch需要在返回结果之前对所有匹配文档进行排序。

对于深度分页,建议使用search_afterscroll API,它们可以有效地处理大数据量的分页请求。

  • search_after:适合排序查询的深度分页,通过上一个结果的排序值来获取下一页数据。

示例:

{"query": {"match": {"description": "search"}},"size": 10,"search_after": [1620150245000, "doc_id_123"]
}

此查询从search_after指定的位置继续获取下一页数据,避免了深度分页的性能瓶颈。

  • scroll:适合大批量的数据导出,scroll查询会保存一个游标(cursor),从而逐步返回整个查询结果。
(3)减少返回字段

默认情况下,ElasticSearch会返回整个文档的所有字段,但在许多情况下,查询可能只需要部分字段。例如,你只需要返回titleprice字段,可以通过_source参数指定返回字段,减少网络开销和数据处理时间。

示例:

{"_source": ["title", "price"],"query": {"match": {"description": "search"}}
}
(4)索引映射优化

索引映射定义了字段的数据类型和处理方式。如果你的查询频繁使用某些字段进行精确匹配(如状态、类别等),可以将这些字段定义为keyword类型,而不是text类型。这样可以避免不必要的分词操作,从而提高查询性能。

"status": {"type": "keyword"
}
(5)查询缓存

ElasticSearch会对常用的过滤器进行缓存,以减少重复查询的执行时间。默认情况下,ElasticSearch会自动缓存filter查询的结果。如果你的查询包含了多个相同的过滤条件,可以通过启用查询缓存来加速查询。

你可以使用_cache参数来强制开启或关闭缓存:

{"query": {"bool": {"filter": [{ "term": { "status": "active" } },{ "term": { "category": "electronics" } }]}}
}
(6)使用Profile API分析查询性能

ElasticSearch提供了profile API,可以帮助你分析查询的执行过程,找出瓶颈。它会返回每个查询的执行时间、分词时间、得分计算时间等详细信息,帮助你针对性地优化查询。

示例:

curl -X GET "localhost:9200/my-index/_search" -H 'Content-Type: application/json' -d'
{"profile": true,"query": {"match": {"description": "search"}}
}'

通过分析profile API的输出,你可以发现哪些查询子句耗时较多,并对其进行优化。

五.性能优化

ElasticSearch虽然默认配置已经能提供良好的性能表现,但在处理大规模数据和高并发查询时,适当的性能优化能够显著提升其运行效率。以下是针对ElasticSearch集群和查询性能的优化技巧,帮助你最大化其性能潜力。

1. 硬件优化

ElasticSearch是一个内存密集型和I/O密集型的应用程序,因此优化硬件配置对提高性能至关重要。

(1)内存(RAM)
  • JVM堆内存(Heap Size):ElasticSearch依赖于JVM,因此堆内存的配置至关重要。建议将JVM堆内存大小设置为物理内存的50%左右,且最大不要超过32GB,以避免触发“压缩类指针”(compressed ordinary object pointers,简称compressedOops)失效,影响JVM性能。

    修改jvm.options文件,设置堆内存大小:

    -Xms16g  # 最小堆内存16GB
    -Xmx16g  # 最大堆内存16GB
    
  • 非堆内存:ElasticSearch同样会利用非堆内存来缓存文件系统和索引,确保剩余50%的内存未被JVM占用,供操作系统用于文件系统缓存。

(2)CPU

ElasticSearch的查询和索引操作高度依赖CPU性能,尤其是对于复杂查询和聚合操作。因此,拥有更高的CPU核心数和频率可以显著提升性能。理想情况下,给每个节点分配4核或更多的CPU。

(3)磁盘
  • SSD优先:ElasticSearch对磁盘I/O的要求较高,尤其在进行索引和段合并时。因此,使用SSD而不是HDD能够显著提升ElasticSearch的性能。
  • 磁盘吞吐量:确保磁盘具有较高的吞吐量和较低的延迟,以便快速处理大量的索引和查询操作。
2. 分片与副本策略优化

ElasticSearch的分片和副本配置直接影响查询性能和集群的可扩展性。

(1)分片数量
  • 适量分片:ElasticSearch中的每个索引都可以分成多个分片,默认情况下每个索引有5个主分片。过多的分片会导致资源浪费,过少的分片会导致负载不均。一个简单的规则是,每个分片的大小应在数GB到几十GB之间,集群中的总分片数量不应超过每个节点的CPU核心数乘以50。

    在索引创建时,可以通过以下命令调整分片数量:

    PUT /my-index
    {"settings": {"index": {"number_of_shards": 3,  # 设置3个主分片"number_of_replicas": 1  # 每个分片有1个副本}}
    }
    
(2)副本配置
  • 副本的数量与读性能:副本分片能够提升读性能,因为查询可以并行执行在多个副本上。对于读请求较多的场景,可以适当增加副本数量。但要注意,副本过多会占用额外的存储空间和资源。
3. 索引优化
(1)refresh_interval设置

ElasticSearch默认每秒刷新一次(refresh_interval),这意味着每秒会将新的数据写入磁盘并对外可见。但在写入密集的场景中,频繁刷新会导致性能下降。可以通过调整refresh_interval来减少刷新频率,提高批量写入性能。

PUT /my-index/_settings
{"index": {"refresh_interval": "30s"  # 设置刷新间隔为30秒}
}

如果不需要实时搜索数据,可以将refresh_interval设置为更大的值,或者在批量写入时暂时关闭刷新操作:

PUT /my-index/_settings
{"index": {"refresh_interval": "-1"  # 禁用自动刷新}
}
(2)段合并优化

ElasticSearch会将多个小段合并成更大的段,这称为段合并。虽然段合并可以提升查询性能,但它会占用大量I/O资源,特别是在写入数据量较大时。你可以通过配置merge.policy来控制段合并的频率和条件。

PUT /my-index/_settings
{"index": {"merge": {"policy": {"max_merge_at_once": 10,"segments_per_tier": 10}}}
}
(3)索引压缩

ElasticSearch支持对字段进行压缩存储,以节省磁盘空间并提升查询性能。可以通过映射配置指定字段是否使用压缩存储。

PUT /my-index
{"mappings": {"properties": {"description": {"type": "text","store": true,  # 启用字段存储"index_options": "docs"  # 限制索引选项以节省空间}}}
}
4. 查询优化
(1)查询缓存

ElasticSearch会自动缓存filter查询的结果,重复查询时可以直接使用缓存,从而提升查询速度。可以通过配置查询缓存的大小来优化缓存命中率。

PUT /_cluster/settings
{"transient": {"indices.queries.cache.size": "10%"  # 查询缓存设置为总内存的10%}
}
(2)减少返回字段

在不需要完整文档的情况下,尽量只返回需要的字段,避免浪费网络带宽和处理资源。通过_source参数指定返回的字段。

GET /my-index/_search
{"_source": ["title", "price"],  # 仅返回title和price字段"query": {"match": {"description": "search"}}
}
(3)优化深度分页

对于大数据量的查询,使用fromsize进行分页可能导致性能下降,特别是在查询深度超过数千条时。为了解决这个问题,建议使用search_afterscroll API来优化深度分页的性能。

  • search_after:适合于排序分页的查询。
  • scroll:适合大量数据的导出。
5. 监控与调优
(1)使用X-Pack监控

ElasticSearch的X-Pack提供了内置的监控功能,能够实时跟踪集群的性能表现,包括节点状态、CPU使用率、内存使用率、磁盘I/O等。可以通过Kibana的监控模块进行可视化。

(2)使用外部监控工具

除了ElasticSearch的内置监控,Prometheus和Grafana也是监控ElasticSearch集群的常用工具。通过ElasticSearch导出的指标,可以设置自定义监控和告警。

(3)垃圾回收(GC)调优

ElasticSearch依赖于JVM,因此垃圾回收(GC)可能影响性能,特别是在大数据集的写入和查询时。可以通过调整GC策略来减少GC停顿带来的影响。

PUT /_cluster/settings
{"persistent": {"indices.store.throttle.type": "merge",  # 优化段合并时的GC压力"indices.store.throttle.max_bytes_per_sec": "200mb"}
}

六.慢查询的诊断与优化

当ElasticSearch集群中存在慢查询时,不仅会影响查询的响应时间,还可能导致系统资源的消耗增加,影响整个集群的性能表现。本节将介绍如何诊断慢查询的原因,并提供多种优化策略来提升查询效率。

1. 慢查询日志

ElasticSearch提供了慢查询日志功能,专门用于记录执行时间较长的查询。启用并分析慢查询日志是诊断慢查询问题的第一步。

(1)启用慢查询日志

慢查询日志默认是关闭的,你可以通过修改elasticsearch.yml文件来启用它。

  • 设置查询日志记录阈值(单位为毫秒),当查询超过此时间时将被记录:

    index.search.slowlog.threshold.query.warn: 10s    # 查询超过10秒记录为warn
    index.search.slowlog.threshold.query.info: 5s     # 查询超过5秒记录为info
    index.search.slowlog.threshold.query.debug: 2s    # 查询超过2秒记录为debug
    index.search.slowlog.threshold.query.trace: 500ms # 查询超过500ms记录为trace
    
  • 设置提取文档日志记录阈值:

    index.search.slowlog.threshold.fetch.warn: 1s
    index.search.slowlog.threshold.fetch.info: 800ms
    index.search.slowlog.threshold.fetch.debug: 500ms
    index.search.slowlog.threshold.fetch.trace: 200ms
    
  • 设置慢查询日志输出的级别:

    index.search.slowlog.level: info
    

慢查询日志默认保存在ElasticSearch的logs目录下,可以根据日志中的内容来分析哪些查询导致了性能问题。

(2)分析慢查询日志

启用慢查询日志后,你可以在日志文件中查看每个慢查询的详细信息,包括查询的执行时间、使用的查询DSL语句、索引名称、分片信息等。通过这些信息,你可以定位到具体的查询,并深入分析其性能瓶颈。

2. 使用Profile API分析查询性能

除了慢查询日志,ElasticSearch还提供了Profile API,帮助你详细了解查询的执行过程。Profile API会返回每个查询子句的执行时间、分词时间、得分计算时间等详细信息。

(1)启用Profile API

通过在查询请求中启用profile参数,你可以查看查询执行的详细分析信息。

示例:

curl -X GET "localhost:9200/my-index/_search" -H 'Content-Type: application/json' -d'
{"profile": true,"query": {"match": {"description": "search engine"}}
}'

返回结果中会包含每个查询子句的详细执行时间,帮助你发现哪些查询子句耗时较多。通过分析这些信息,你可以有针对性地进行优化。

3. 查询重写与简化

通过重写和简化查询,可以有效减少查询执行时间,提升查询性能。以下是一些常见的优化策略:

(1)减少不必要的查询子句

在构建复杂查询时,尽量避免使用过多的嵌套查询子句和不必要的shouldmust条件。过多的查询条件会增加查询的复杂度和执行时间。

(2)使用合适的查询类型
  • term查询:适合精确匹配,避免使用全文搜索的match查询。
  • match查询:适合全文搜索,不适用于精确匹配。对于需要精确匹配的字段(如状态、类别),应使用termkeyword类型的字段进行查询。

示例:将match查询替换为term查询:

{"query": {"term": {"status": "active"}}
}
(3)分页优化

深度分页查询(即从第10000条记录后进行分页查询)可能导致查询性能急剧下降。可以使用以下几种方法来优化分页查询:

  • search_after:通过上一个结果的排序值来获取下一页数据,避免深度分页。
  • scroll API:适合大量数据的批量导出。
(4)预热查询

如果有一些高频率或关键性的查询,你可以通过预热这些查询的方式来避免第一次查询时的性能开销。预热查询通过提前执行重要查询,确保数据被缓存。

示例:

POST /my-index/_search
{"query": {"match": {"description": "search engine"}},"size": 0  # 只进行预热,不需要返回结果
}
4. 优化分片与数据布局

ElasticSearch是一个分布式系统,查询性能受到分片布局和数据分布的影响。

(1)优化分片数量

对于查询频繁的场景,适当增加分片数量可以减少每个分片的数据量,从而提高查询速度。但要避免过多的分片,以免资源浪费。每个分片的数据量建议保持在5GB到50GB之间。

(2)路由优化

通过设置查询的路由,可以将查询请求定向到特定的分片,从而避免查询全索引中的所有分片。例如,某些场景下,可以根据用户ID或其他固定字段进行路由。

示例:

POST /my-index/_search?routing=user_123
{"query": {"term": {"user_id": "user_123"}}
}

这样可以只查询相关的分片,减少查询范围,提升查询效率。

5. 聚合查询优化

ElasticSearch提供了强大的聚合功能,用于统计和分析数据,但聚合查询也容易导致性能瓶颈。

(1)减少聚合粒度

聚合操作会对每个文档进行计算,因此减少聚合的粒度可以显著提升性能。例如,使用更少的桶进行聚合,或减少聚合字段的数量。

示例:将聚合桶数量限制为10:

{"aggs": {"price_ranges": {"terms": {"field": "price","size": 10  # 限制桶数量为10}}}
}
(2)预先计算的数据

对于经常使用的聚合查询,考虑使用离线计算或通过其他手段提前计算好聚合结果,避免每次实时执行聚合操作。这样可以显著减轻查询时的计算压力。

七.ElasticSearch集群监控与调整

ElasticSearch集群的性能优化和稳定运行离不开持续的监控和调整。通过监控集群的健康状况、资源使用和性能瓶颈,能够及时发现问题并进行优化调整。本节将介绍如何通过内置工具和外部工具监控ElasticSearch集群,并提供一些常见的集群调整建议。

1. ElasticSearch内置监控工具

ElasticSearch提供了多种内置的监控功能,允许你实时监控集群状态并检测潜在问题。

(1)集群健康监控

ElasticSearch的集群健康(Cluster Health) API 可以显示集群的整体健康状态,包括每个索引的状态、分片分配情况等。

使用以下命令检查集群健康状况:

GET /_cluster/health

返回结果包括以下几个关键字段:

  • status:集群的整体状态,可能的值为green(正常)、yellow(部分副本分片未分配)、red(部分主分片未分配)。
  • number_of_nodes:集群中的节点数。
  • active_primary_shards:正在活动的主分片数量。
  • active_shards:活动的所有分片数量(主分片和副本分片)。

健康的集群应保持在green状态,如果状态为yellowred,则需要检查分片分配和节点健康状况。

(2)节点监控

通过节点统计API,你可以获取每个节点的资源使用情况,包括CPU、内存、磁盘、网络等。

使用以下命令查看节点的资源使用情况:

GET /_nodes/stats

返回结果包括每个节点的详细统计信息:

  • cpu:CPU使用率。
  • memory:JVM堆内存的使用情况,查看是否存在内存不足的风险。
  • fs:磁盘的使用情况,确保磁盘不会超载。
  • thread_pool:线程池的使用情况,特别是在高并发时,查看是否有线程池任务积压。
(3)索引监控

ElasticSearch允许你监控每个索引的状态和性能,包括文档数量、索引大小、段信息等。通过监控索引的状态,可以评估数据增长情况,并检查是否需要进行分片调整。

使用以下命令查看索引的状态:

GET /_cat/indices?v

返回的信息包括:

  • health:索引的健康状态(green、yellow、red)。
  • docs.count:索引中的文档数量。
  • store.size:索引所占用的存储空间。
  • pri:主分片的数量。
  • rep:副本分片的数量。
2. 使用X-Pack进行监控

ElasticSearch的X-Pack插件提供了更强大的集群监控功能。通过X-Pack,你可以获取更详细的监控数据,并在Kibana中对其进行可视化展示。

(1)安装X-Pack

X-Pack是Elastic提供的一款商业插件,但也提供了一些免费的监控功能。安装X-Pack的步骤如下:

  1. 安装X-Pack插件:

    ./bin/elasticsearch-plugin install x-pack
    
  2. 启动ElasticSearch后,默认会开启X-Pack的基本监控功能。

(2)使用Kibana进行监控

Kibana与X-Pack集成,可以直观地展示集群的各项性能指标。通过Kibana,你可以查看以下内容:

  • 节点状态:节点的CPU、内存、线程池、文件系统使用情况。
  • 索引状态:索引的写入速率、查询速率、段合并情况等。
  • JVM监控:JVM堆内存使用情况、垃圾回收频率和时间。
  • 集群健康:整个集群的状态,包括分片分配情况和节点状态。
(3)告警功能

X-Pack还提供了告警功能,当集群中的某些性能指标超出设定阈值时,可以自动发送通知。例如,如果JVM内存使用率超过80%,你可以配置告警通知系统管理员。

3. 使用外部监控工具

除了ElasticSearch的内置工具,许多企业也使用外部的监控工具来对ElasticSearch集群进行监控。这些工具通常具有高度的可配置性和扩展性,可以集成到现有的监控基础设施中。

(1)Prometheus + Grafana

Prometheus是一款流行的开源监控工具,可以用来监控ElasticSearch的各项指标,并结合Grafana实现可视化展示。

  1. 安装ElasticSearch Exporter:Prometheus需要通过ElasticSearch Exporter收集ElasticSearch的监控数据。

    docker run -d -p 9114:9114 --name es_exporter --network=host quay.io/prometheuscommunity/elasticsearch-exporter
    
  2. 配置Prometheus:在Prometheus的配置文件中添加ElasticSearch Exporter的目标。

    scrape_configs:- job_name: 'elasticsearch'static_configs:- targets: ['localhost:9114']
    
  3. 使用Grafana可视化:Grafana可以从Prometheus中读取数据并进行可视化,展示ElasticSearch集群的性能趋势图,如CPU、内存、磁盘使用情况等。

(2)ElasticHQ

ElasticHQ是一个开源的ElasticSearch管理和监控工具,提供了类似Kibana的图形界面,专门用于监控和管理ElasticSearch集群。它可以帮助你监控分片状态、节点负载、查询性能等。

ElasticHQ可以通过Docker快速部署:

docker run -d -p 5000:5000 elastichq/elasticsearch-hq
4. 常见集群调整建议

通过监控集群的性能数据,你可以及时发现潜在问题,并进行相应的调整。以下是一些常见的集群调整建议:

(1)调整分片数量

如果监控数据显示某些节点的负载过高,可能需要调整索引的分片数量或重新分配分片。你可以通过以下命令在索引创建时调整分片和副本的数量:

PUT /my-index
{"settings": {"number_of_shards": 3,"number_of_replicas": 1}
}
(2)调整JVM堆内存大小

如果JVM内存使用率接近100%,可以考虑增加JVM堆内存大小。建议将堆内存设置为物理内存的50%左右,最大不超过32GB,以保持compressedOops优化。

修改jvm.options文件:

-Xms16g  # 设置最小堆内存为16GB
-Xmx16g  # 设置最大堆内存为16GB
(3)优化线程池配置

ElasticSearch的线程池配置可以根据集群的查询量和写入量进行优化。例如,可以通过调整thread_pool配置来优化批量写入或查询的性能。

5. 垃圾回收(GC)调优

ElasticSearch依赖JVM进行内存管理,因此垃圾回收(GC)可能会影响集群性能。监控JVM的GC频率和停顿时间,必要时可以调整GC策略。

(1)使用G1垃圾收集器

对于大多数生产环境,G1垃圾收集器是推荐的垃圾回收机制,它能够提供更低的GC停顿时间。

jvm.options文件中启用G1垃圾收集器:

-XX:+UseG1GC
(2)调整GC日志级别

启用GC日志可以帮助你监控垃圾回收的频率和持续时间,分析GC对性能的影响。你可以通过以下配置启用GC日志记录:

-Xlog:gc*,gc+age=trace,safepoint:file=/var/log/elasticsearch/gc.log:utctime,pid,tags:filecount=32,filesize=64m

八.实战案例之性能优化与慢查询解决方案

在实际应用中,ElasticSearch经常需要处理大量的日志、搜索、分析等任务。通过具体的优化案例,你可以更好地理解如何提升ElasticSearch集群的性能并解决慢查询问题。本节将介绍两个常见的实际场景,并针对它们提供优化方案和慢查询的解决方法。

案例1:日志分析系统的性能优化
背景

公司部署了一个基于ElasticSearch的日志分析系统,每天产生数十亿条日志数据,系统需要能够实时分析和查询这些日志。随着日志量的增长,查询变得越来越慢,特别是当用户执行复杂的过滤查询和聚合时,查询时间明显增加,系统响应不及时。

问题诊断
  1. 慢查询日志分析:启用了ElasticSearch的慢查询日志,发现许多查询的执行时间都超过了10秒。大部分慢查询都涉及聚合和过滤操作,尤其是时间范围过滤和用户ID过滤。

  2. 分片设计问题:通过监控工具发现部分分片的数据量过大,导致查询过程中需要扫描大量数据,增加了查询时间。分片的配置并没有随着数据量的增加进行调整。

优化方案
(1)调整分片策略

根据ElasticSearch的分布式架构设计,分片的数量对查询性能影响较大。原本系统采用了默认的分片数量(5个主分片),但随着数据量的增长,每个分片中的数据量过大,导致查询延迟增加。解决方法是调整分片数量,使每个分片的数据量保持在10GB到50GB之间。

  • 创建新索引时指定更多的分片

    PUT /logs-index
    {"settings": {"number_of_shards": 10,  # 增加分片数量"number_of_replicas": 1  # 保留1个副本}
    }
    
  • 使用索引生命周期管理(ILM)策略:对每天的日志数据生成新的索引,通过索引滚动策略(index rollover)控制每个索引的数据量,避免过大的分片。

    PUT _ilm/policy/logs_policy
    {"policy": {"phases": {"hot": {"actions": {"rollover": {"max_size": "50GB","max_age": "1d"}}}}}
    }
    
(2)优化查询

通过慢查询日志发现,时间范围过滤和用户ID过滤是查询性能的瓶颈。以下是针对这些问题的优化方案:

  • 时间范围过滤优化:将日志数据按时间索引,确保每次查询时可以减少扫描非必要的时间段数据。

    PUT /logs-index/_settings
    {"index.routing.allocation.include._tier_preference": "data_hot"
    }
    
  • 用户ID过滤优化:通过在查询中使用routing,将用户ID的查询定向到特定分片,避免全局扫描分片。

    POST /logs-index/_search?routing=user_123
    {"query": {"term": {"user_id": "user_123"}}
    }
    
(3)启用查询缓存

日志系统中,某些查询(如特定时间段或特定用户的日志查询)是高频查询。可以通过启用ElasticSearch的查询缓存来加速这些重复查询。

  • 增加查询缓存的大小
    PUT /_cluster/settings
    {"persistent": {"indices.queries.cache.size": "20%"}
    }
    
(4)聚合查询优化

聚合查询会消耗大量CPU和内存,尤其是在处理大规模数据时。通过以下优化,可以提高聚合查询的性能:

  • 减少聚合粒度:减少分桶数量或聚合的字段,降低每次查询所需的计算量。

    POST /logs-index/_search
    {"size": 0,"aggs": {"status_count": {"terms": {"field": "status.keyword","size": 5  # 限制分桶数量}}}
    }
    
  • 预先计算数据:对频繁使用的聚合查询结果进行预计算,避免每次都实时执行聚合操作。

结果

通过这些优化措施,日志查询的平均响应时间从10秒以上减少到了2秒以内,尤其是在聚合查询方面,性能有了显著提升。通过分片调整和缓存的使用,集群的资源利用率也得到了显著改善。


案例2:全文搜索平台的慢查询解决方案
背景

某电商平台使用ElasticSearch进行全文商品搜索,用户可以根据关键词、价格、分类等条件进行筛选。然而,随着商品数量的增长,用户的搜索响应时间逐渐变慢,特别是对于深度分页和复杂的多条件搜索,慢查询问题尤其突出。

问题诊断
  1. 深度分页查询:通过分析慢查询日志,发现当用户分页查询到第100页以上时,响应时间显著增加。这是由于ElasticSearch需要扫描大量文档并跳过前面未被返回的文档。

  2. 多条件过滤查询:用户在进行多条件搜索时(如按关键词、价格范围和分类同时过滤),查询的复杂性增加,导致搜索时间明显变长。

优化方案
(1)分页查询优化

ElasticSearch的fromsize参数用于分页,但深度分页时性能会下降。可以通过search_after来优化分页查询。

  • 使用search_after优化深度分页

    POST /products-index/_search
    {"query": {"match": {"name": "laptop"}},"size": 10,"search_after": [1620150245000, "doc_id_123"]
    }
    

    这种方式利用上一次查询的结果作为起点,而不是跳过之前的文档,提高了深度分页的性能。

  • scroll API导出大量数据:对于需要批量导出或获取大量数据的场景,可以使用scroll API,避免查询时内存溢出问题。

    POST /products-index/_search?scroll=1m
    {"size": 100,"query": {"match_all": {}}
    }
    
(2)过滤查询优化

为了加速多条件过滤查询,以下是几种有效的优化方法:

  • 使用filter代替query:对于不需要相关性评分的查询条件(如价格范围、分类过滤),使用filter而不是query,因为filter不会影响得分,并且其结果可以被缓存。

    POST /products-index/_search
    {"query": {"bool": {"must": {"match": {"name": "laptop"}},"filter": [{ "term": { "category": "electronics" } },{ "range": { "price": { "gte": 1000, "lte": 2000 } } }]}}
    }
    
  • 优化字段映射:确保字段的类型设置正确,特别是对于需要精确匹配的字段,应该使用keyword类型,而不是text类型,以避免不必要的分词操作。

(3)查询缓存与路由优化
  • 启用查询缓存:对于重复执行的搜索请求,启用查询缓存可以显著提高查询速度。
  • 使用路由优化搜索:对于特定用户的个性化搜索,可以通过设置routing参数,将查询定向到存储相关用户数据的分片,减少全局查询的开销。

通过search_after优化分页查询和使用filter进行条件过滤,商品搜索的响应时间显著缩短,用户在深度分页时的体验得到极大改善。平均查询时间从8秒减少至1.5秒,并且在高并发情况下,集群资源的利用率也有所优化。

九.总结与未来展望

在前面的章节中,我们系统地探讨了ElasticSearch的基础知识、查询优化、性能调优以及实战案例,旨在帮助你更好地理解并运用ElasticSearch来构建高效的搜索和分析系统。在本节中,我们将对主要的内容进行回顾,并展望ElasticSearch未来的发展方向及其在现代技术中的作用。

1. 主要内容回顾
(1)ElasticSearch核心概念

我们从ElasticSearch的核心架构入手,详细介绍了索引、文档、分片、副本等概念,帮助你建立对ElasticSearch分布式架构的基础理解。ElasticSearch的设计使其能够处理大规模的结构化和非结构化数据,具有良好的可扩展性和高性能。

(2)查询与优化

在ElasticSearch的查询机制中,我们学习了常见的查询类型,如match查询、term查询、bool查询等,同时也介绍了如何通过查询重写、简化和缓存优化来提升查询性能。在复杂查询场景下,合理使用filter代替query、精确控制分片以及通过Profile API分析查询过程,是提升查询速度的重要手段。

(3)性能调优

ElasticSearch的性能调优涉及多个方面,从硬件配置(内存、CPU、磁盘)到索引和分片策略,再到内存分配(JVM堆内存设置)等。在性能优化部分,我们着重介绍了如何通过调整refresh_intervalmerge策略、查询缓存、查询优化等来提升写入和查询的性能。

(4)慢查询诊断与解决方案

慢查询是影响ElasticSearch集群性能的常见问题之一。通过启用慢查询日志、使用Profile API分析查询性能,并结合实际场景中的优化手段(如search_afterscroll API、查询简化等),我们可以有效地解决慢查询问题,提升集群响应时间。

(5)ElasticSearch集群监控与调整

ElasticSearch提供了丰富的内置监控工具,同时结合X-Pack、Prometheus、Grafana等外部监控工具,可以帮助我们实时掌握集群健康状态、资源使用情况、节点性能等。通过持续监控,可以及时发现集群中潜在的问题,并采取相应的调整措施。

(6)实战案例分析

通过日志分析系统和全文搜索平台的案例,我们展示了如何针对实际场景中的慢查询和性能瓶颈进行优化。优化的核心在于合理设计分片、调整查询策略、启用查询缓存,并通过分布式架构的优势提升集群整体性能。

2. ElasticSearch的未来发展方向

随着大数据和搜索技术的不断发展,ElasticSearch在未来将扮演越来越重要的角色,特别是在以下几个方面:

(1)云原生与弹性扩展

ElasticSearch在云端的使用正在迅速增长。未来,ElasticSearch可能会进一步增强其云原生支持,提供更加灵活和自动化的弹性扩展功能。这将使用户能够更加便捷地在云上部署、扩展和管理ElasticSearch集群,尤其是在处理突发流量和大规模数据时。

(2)机器学习与搜索智能化

ElasticSearch已经集成了许多基础的机器学习功能(如异常检测)。未来,ElasticSearch可能会加强在搜索智能化方面的应用,例如通过机器学习自动调整查询权重、实现更加精准的个性化搜索结果、自动生成优化建议等。

(3)数据分析能力的增强

除了搜索功能,ElasticSearch的实时分析能力也备受关注。未来版本可能会增加更强大的数据分析和可视化功能,尤其是在处理流式数据、大规模日志分析以及实时监控时,ElasticSearch可能会成为一种更加通用的数据平台。

(4)数据安全与隐私保护

随着数据安全和隐私问题的日益突出,ElasticSearch可能会增强在安全方面的功能,提供更加细粒度的访问控制和数据加密机制。未来,我们可以期待ElasticSearch在企业级应用中的数据治理和合规性管理上有更强的支持。

3. 如何持续优化与学习

ElasticSearch的发展迅速,新版本不断推出,带来新的功能和改进。为了能够持续优化和应用ElasticSearch,你可以采取以下措施:

(1)关注官方文档与更新

ElasticSearch的官方文档提供了丰富的学习资源和示例,保持关注官方发布的版本更新和新功能,能帮助你及时获取最新的信息和最佳实践。

(2)参与社区与讨论

ElasticSearch有一个活跃的开发者社区,你可以通过加入论坛、GitHub项目、讨论组等参与社区活动,与其他开发者交流使用经验和优化技巧。

(3)实验与监控

通过实验不断探索ElasticSearch的最佳配置和优化方案,并通过监控系统的性能指标,发现可能存在的问题。在生产环境中,持续监控和定期调整集群配置是保持ElasticSearch高效运行的关键。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/53377.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在已安装的openresty上添加安装upstream模块报错的解决以及使用Consul服务发现时定时变更nginx的upstream的shell脚本

一、在已经安装好的openresty环境上添加安装upstream模块报错&#xff1a; 在已经安装好的openresty环境上添加安装upstream模块报错&#xff1a;http upstream check module can not find any check server, make sure you ve added the check 的问题解决。 服务器上已经安装好…

idea中java及java web项目的常见问题

1、乱码问题&#xff0c;主要有几处地方&#xff0c;需要检查。 ①确保文件编码&#xff0c;其实主要就是在idea启动文件中&#xff0c;增加了 -Dfile.encodingUTF-8的设置 ②编辑器默认编码&#xff0c;都改为UTF-8 ③Tomcat的运行配置&#xff0c;编码也改为UTF-8,同样使用…

SpringBoot3核心特性-核心原理

目录 传送门前言一、事件和监听器1、生命周期监听2、事件触发时机 二、自动配置原理1、入门理解1.1、自动配置流程1.2、SPI机制1.3、功能开关 2、进阶理解2.1、 SpringBootApplication2.2、 完整启动加载流程 三、自定义starter1、业务代码2、基本抽取3、使用EnableXxx机制4、完…

zynq的PS端mac与RTL8211F的连接要点

目录 1 VCCO_MIO12 PS_MIO_VREF3 PS的引脚4 RXDLY TXDLY5 ZYNQ的MAC可以调整延时吗 1 VCCO_MIO1 接1.8V 2 PS_MIO_VREF 接0.9V&#xff0c;可通过电阻分压 可通过电阻分压 3 PS的引脚 4 RXDLY TXDLY RXDLY RXD[0] TXDLY RXD[1] 与XC7Z020的PS端MAC连接&#xff0c;必须…

CVE-2024-2389 未经身份验证的命令注入

什么是 Progress Flowmon? Progress Flowmon 是一种网络监控和分析工具,可提供对网络流量、性能和安全性的全面洞察。Flowmon 将 Nette PHP 框架用于其 Web 应用程序。 未经身份验证的路由 我们开始在“AllowedModulesDecider.php”文件中枚举未经身份验证的端点,这是一个描…

1.pytest基础知识(默认的测试用例的规则以及基础应用)

一、pytest单元测试框架 1&#xff09;什么是单元测试框架 单元测试是指再软件开发当中&#xff0c;针对软件的最小单位&#xff08;函数&#xff0c;方法&#xff09;进行正确性的检查测试。 2&#xff09;单元测试框架 java&#xff1a;junit和testing python&#xff1a;un…

arcgisPro地理配准

1、添加图像 2、在【影像】选项卡中&#xff0c;点击【地理配准】 3、 点击添加控制点 4、选择影像左上角格点&#xff0c;然后右击填入目标点的投影坐标 5、依次输入四个格角点的坐标 6、点击【变换】按钮&#xff0c;选择【一阶多项式&#xff08;仿射&#xff09;】变换 7…

基于SpringBoot+定时任务实现地图上绘制车辆实时运动轨迹图

目录 1. 项目结构 2. Maven依赖配置 (pom.xml) 3. 实现后端服务 4. 配置文件 (application.properties) 5. 启动项目 6. 访问页面 实现基于北斗卫星的车辆定位和轨迹图的Maven工程&#xff08;使用模拟数据&#xff09;&#xff0c;我们将使用以下技术&#xff1a; Spri…

使用c#制作一个小型桌面程序

封装dll 首先使用visual stdio 创建Dll新项目,然后属性管理器导入自己的工程属性表&#xff08;如果没有可以参考visual stdio 如何配置opencv等其他环境&#xff09; 创建完成后 系统会自动生成一些文件&#xff0c;其中 pch.cpp 先不要修改&#xff0c;pch.h中先导入自己需…

蓝牙模块—BLE-CC41-A

1. 蓝牙的特点 蓝牙模块采用的 TI 公司设计的 CC2541芯片&#xff0c;主要面向低功耗蓝牙通信方案&#xff0c;该模块的工作频段为 2.4Ghz&#xff0c;这个频段属于国际通用频段 注意&#xff1a;蓝牙集成了一个状态指示灯&#xff0c;LED灯如果均匀慢速闪烁&#xff0c;就表示…

【渗透测试】-vulnhub源码框架漏洞-Os-hackNos-1

vulnhub源码框架漏洞中的CVE-2018-7600-Drupal 7.57 文章目录  前言 1.靶场搭建&#xff1a; 2.信息搜集&#xff1a; 主机探测&#xff1a; 端口扫描&#xff1a; 目录扫描&#xff1a; 3.分析&#xff1a; 4.步骤&#xff1a; 1.下载CVE-2018-7600的exp 2.执行exp: 3.写入木…

Docker安装rabbitmq并配置延迟队列

下载rabbitmq镜像 docker pull rabbitmq:management 运行rabbitmq镜像 docker run -id --namerabbitmq -p 5671:5671 -p 5672:5672 -p 4369:4369 -p 15671:15671 -p 15672:15672 -p 25672:25672 -e RABBITMQ_DEFAULT_USERtom -e RABBITMQ_DEFAULT_PASStom rabbitmq:management …

idea上传jar包到nexus

注意&#xff1a;确保idea中项目为maven项目&#xff0c;并且在nexus中已经创建了maven私服。 1、配置pom.xml中推送代码配置 <distributionManagement> <repository> <id>releases</id> <url>http://127.0.0.1:8001/repository/myRelease/<…

Mybatis自定义TypeHandler,直接存储枚举类对象

在这篇文章中&#xff0c;我们已经知道如何使用枚举类直接接受前端的数字类型参数&#xff0c;省去了麻烦的转换。如果数据库需要保存枚举类的code&#xff0c;一般做法也是代码中手动转换&#xff0c;那么能不能通过某种机制&#xff0c;省去转换&#xff0c;达到代码中直接保…

【Unity-UGUI组件拓展】| Image 组件拓展,支持FIlled和Slice功能并存

🎬【Unity-UGUI组件拓展】| Image 组件拓展,支持FIlled和Slice功能并存一、组件介绍二、组件拓展方法三、完整代码💯总结🎬 博客主页:https://xiaoy.blog.csdn.net 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN🙉 🎄 学习专栏推荐:Unity系统学习专栏 🌲 游戏…

博睿谷IT认证-订阅试学习

在这个信息爆炸的时代&#xff0c;拥有一张IT认证证书&#xff0c;就像拿到了职场晋升的通行证。博睿谷&#xff0c;作为IT认证培训的佼佼者&#xff0c;帮你轻松拿下华为、Oracle等热门认证。下面&#xff0c;让我们一起看看博睿谷如何助你一臂之力。 学习时间&#xff0c;你说…

将阮一峰老师的《ES6入门教程》的源码拷贝本地运行和发布

你好同学&#xff0c;我是沐爸&#xff0c;欢迎点赞、收藏、评论和关注。 阮一峰老师的《ES6入门教程》应该是很多同学学习 ES6 知识的重要参考吧&#xff0c;应该也有很多同学在看该文档的时候&#xff0c;想知道这个教程的前端源码是怎么实现的&#xff0c;也可能有同学下载…

移动技术开发:ListView水果列表

1 实验名称 ListView水果列表 2 实验目的 掌握自定义ListView控件的实现方法 3 实验源代码 布局文件代码&#xff1a; activity_main.xml: <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.androi…

远程连接MySQL并操作

配置MySQL开发环境 如果你使用的是基于Debian的系统&#xff08;如Ubuntu&#xff09;&#xff0c;可以在终端通过如下步骤安装MySQL开发包。 更新软件包列表 运行以下命令以确保你拥有最新的软件包列表。 sudo apt-get update安装libmysqlclient-dev开发包 执行以下命令以…

【Java注解】

Java注解&#xff08;Annotation&#xff09;让其他程序根据注解信息来决定怎么执行该程序。 是Java 5中引入的一种特殊类型的注释&#xff0c;它可以被用来为代码添加元数据&#xff0c;即关于代码的数据。 注解不会改变程序的逻辑&#xff0c;但它们可以被其他程序使用&…