Elasticsearch

一、简介

Elasticsearch是一个基于Lucene的实时分布式的搜索与分析引擎。Elasticsearch为所有类型的数据提供近乎实时的搜索和分析。无论结构化或非结构化文本、数字数据还是地理空间数据,Elasticsearch都可以有效地存储和索引,以支持快速搜索。随着你的数据和查询量的增长,Elasticsearch的分布式特性使部署能够随着它而无缝增长。

二、数据存储

Elasticsearch是一个分布式文档存储。Elasticsearch不是将信息存储为列式数据行,而是存储已序列化为JSON文档的复杂数据结构。当集群中有多个Elasticsearch节点时,存储的文档会分布在整个集群中,并且可以从任何节点立即访问。

存储文档后,它会在近乎实时的情况下被索引并完全可搜索——1秒内。Elasticsearch使用一种称为倒排索引的数据结构,它支持非常快速的全文搜索。倒排索引列出了出现在任何文档中的每个唯一单词,并标识了每个单词出现的所有文档。

索引是文档的优化集合,每个文档都是字段的集合,字段是包含数据的键值对。 默认情况下,Elasticsearch对每个字段中的所有数据进行索引,并且每个索引字段都有一个专用的优化数据结构。

Elasticsearch还具有无预定数据模式(schema-less)的能力,这意味着无需明确指定如何处理文档中可能出现的每个不同字段即可对文档进行索引。启用动态映射后,Elasticsearch会自动检测新字段并将其添加到索引中。只要开始索引文档,Elasticsearch就会检测并将布尔值、浮点和整数值、日期和字符串映射到适当的Elasticsearch数据类型。也可以定义规则来控制动态映射,明确定义映射以完全控制字段的存储和索引方式。

三、查询分析

Elasticsearch提供了一个简单REST API,用于管理集群以及索引和搜索数据。可以直接从命令行、应用程序客户端或通过Kibana中的开发者控制台轻松提交请求。

Elasticsearch REST API支持结构化查询、全文查询和将两者结合的复杂查询。结构化查询类似于在SQL中构造的查询类型。全文查询查找与查询字符串匹配的所有文档,并按与搜索词的匹配程度对它们进行排序。

除了搜索单个术语之外,还可以执行短语搜索、相似性搜索和前缀搜索。可以使用 Elasticsearch全面的JSON样式查询语言 (Query DSL) 访问所有这些搜索功能。 您还可以构建SQL样式的查询以在Elasticsearch内本地搜索和聚合数据。

四、名词概念

  • 集群(cluster)

    一个Elasticsearch集群由一个或多个Elasticsearch节点组成,所有节点共同存储数据。每个集群都应有一个唯一的集群名(ClusterName),同一环境内如果存在同名集群,可能会出现不可知异常。默认集群名为elasticsearch。

  • 节点(node)

    一个节点是集群中的一个服务器,用来存储数据并参与集群的索引和搜索。一个集群可以拥有多个节点,每个节点可以扮演不同的角色:

    • 数据节点:存储索引数据的节点,主要对文档进行增删改查、聚合等操作。

    • 专有主节点:对集群进行操作,例如创建或删除索引,跟踪哪些节点是集群的一部分,并决定哪些分片分配给相关的节点。稳定的主节点对集群的健康非常重要,默认情况下集群中的任一节点都可能被选为主节点。

    • 协调节点:分担数据节点的CPU开销,从而提高处理性能和服务稳定性。

  • 索引(index)

    一个索引是一个拥有一些相似特征的文档的集合,相当于关系型数据库中的一个数据库。一个索引通常使用一个名称(所有字母必须小写)来标识,当针对这个索引的文档执行索引、搜索、更新和删除操作的时候,这个名称被用来指向索引。

  • 类型(type)

    一个类型通常是一个索引的一个逻辑分类或分区,允许在一个索引下存储不同类型的文档,相当于关系型数据库中的一张表。由于6.x以后的Elasticsearch版本已经不支持在一个索引下创建多个类型,因此类型概念在后续版本中不再被提及。Elasticsearch 5.x允许在一个索引下存储不同类型的文档,Elasticsearch 6.x在一个索引下只允许一个类型,Elasticsearch 7.x索引类型命名只允许_doc,详情参见Elasticsearch官方文档

  • 文档(document)

    一个文档是可以被索引的基本信息单元,相当于关系型数据库中的一行数据。文档可以用JSON格式来表示。在一个索引中,您可以存储任意多的文档,且文档必须被索引。

  • 字段(field)

    field是组成文档的最小单位,相当于关系型数据库中的一列数据。

  • 映射(mapping)

    mapping用来定义一个文档以及其所包含的字段如何被存储和索引,相当于关系型数据库中的Schema,例如在mapping中定义字段的名称和类型,以及所使用的分词器。

  • 分片(shards)

    shards代表索引分片,Elasticsearch可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上,构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改。

  • 副本(replicas)

    replicas是索引的备份,Elasticsearch可以设置多个副本。写操作会先在主分片上完成,然后分发到副本分片上。因为索引的主分片和副本分片都可以对外提供查询服务,所以副本能够提升系统的高可用性和搜索时的并发性能。但如果副本太多,也会增加写操作时数据同步的负担。

    Elasticsearch 7.0以下版本默认为一个索引创建5个主分片,并分别为每个主分片创建1个副本分片,7.0及以上版本默认为一个索引创建1个主分片和1个副本分片。两者区别如下:

    分片类型 支持处理的请求 数量是否可修改 其他说明
    主分片 支持处理查询和索引请求。 在创建索引时设定,设定后不可更改。 索引内任意一个文档都存储在一个主分片中,所以主分片的数量决定着索引能够保存的最大数据量。
    副本分片 支持处理查询请求,不支持处理索引请求。 可在任何时候添加或删除副本分片。 副本分片对搜索性能非常重要,能提高系统的容错性能,提高查询效率。
  • gateway

    gateway代表Elasticsearch索引快照的存储方式,Elasticsearch默认优先将索引存放到内存中,当内存满时再将这些索引持久化存储至本地硬盘。gateway对索引快照进行存储,当这个Elasticsearch集群关闭再重新启动时就会从gateway中读取索引备份数据。Elasticsearch支持多种类型的gateway,有本地文件系统(默认)、分布式文件系统、Hadoop的HDFS和阿里云的OSS云存储服务。

五、相关组件

  • X-Pack

    X-Pack是Elasticsearch的一个商业版扩展包,包含安全Security、警告Altering、监控Monitoring、图形Graph和报告Reporting、机器学习MachineLearning等多种高级功能。

  • Beats

    Beats是轻量级的数据采集工具,集合了多种单一用途的数据采集器。它们从成百上千或成千上万台机器和系统向Logstash或Elasticsearch发送数据。

  • Logstash

    Logstash作为服务器端的数据处理管道,通过输入、过滤和输出插件,动态地从多个来源采集数据,并加工和转换任何类型的事件,最终将数据存储到所选择的位置。

  • Kibana

    Kibana是灵活的数据分析和可视化工具,支持多用户登录。在Kibana中,您可以搜索和查看Elasticsearch索引中的数据,并进行交互。

六、安装部署

  • 准备工作,<mark>必须执行</mark>

    <!== 参考文档 ==>

    • 调整系统设置

      vim /etc/security/limits.conf
      * soft nofile 65535
      * hard nofile 65535
      * soft nproc 65535
      * hard nproc 65535
      elastic soft memlock unlimited
      elastic hard memlock unlimited
      
    • 禁用swap交换分区

      swapoff -a
      #永久禁用,去掉/etc/fstab中swap内容行
      
    • 调整虚拟内存

      vim /etc/sysctl.conf
      vm.max_map_count=262144
      
      sysctl-p
      
    • 修改JNA和libffi临时目录路径

      在systemd启动管理中添加环境变量ES_TMPDIR=/data/elasticsearch/tmp

    • 减少tcp重传最大次数

      #此设置适用于所有 TCP 连接,并且也会影响与 Elasticsearch 集群以外的系统通信的可靠性。  如果您的集群通过低质量网络与外部系统通信,那么您可能需要为 net.ipv4.tcp_retries2 选择更高的值。
      vim /etc/sysctl.conf
      net.ipv4.tcp_retries2=5
      
      sysctl -p
      
  • 下载软件包

    <!== 7.*版本推荐使用Java11,用自带的jdk就好不用自己安装 ==>

    $ cd /usr/local/src && wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.15.2-linux-x86_64.tar.gz
    $ tar zxf elasticsearch-7.15.2-linux-x86_64.tar.gz -C /usr/local
    
  • 设置相关配置

    vim /usr/local/elasticsearch-7.15.2/config/elasticsearch.yml
    node.name: node01
    path.data: /data/elasticsearch/data
    path.logs: /data/elasticsearch/logs
    path.repo: /data/backup/elasticsearch
    #启动内存锁定
    bootstrap.memory_lock: true
    network.host: 0.0.0.0
    http.port: 9200
    discovery.seed_hosts: ["10.81.0.101"]
    cluster.initial_master_nodes: ["10.81.0.101"]
    #删除索引时要求明确的名称
    action.destructive_requires_name: true
    
    vim /usr/local/elasticsearch-7.15.2/config/jvm.options
    #根据实际情况进行调整,默认4G
    -Xms8g
    -Xmx8g
    -XX:+HeapDumpOnOutOfMemoryError
    -XX:HeapDumpPath=/data/elasticsearch/logs
    
  • 创建相关目录并授权

    groupadd elastic
    useradd -g elastic -M -s /sbin/nologin elastic
    mkdir -p /data/elasticsearch/{data,logs,tmp}
    mkdir -p /data/backup/elasticsearch
    mkdir -p /var/run/elasticsearch
    chown -R elastic. /var/run/elasticsearch
    chown -R elastic. /data/elasticsearch/
    chown -R elastic. /usr/local/elasticsearch-7.15.2/
    chown -R elastic. /data/backup/elasticsearch
    
  • 设置systemd管理

    cat > /etc/systemd/system/elasticsearch.service <<'EOF'
    [Unit]
    Description=Elasticsearch
    Documentation=https://www.elastic.co
    Wants=network-online.target
    After=network-online.target
    
    [Service]
    Type=simple
    PrivateTmp=true
    Environment=ES_HOME=/usr/local/elasticsearch-7.15.2
    Environment=ES_PATH_CONF=/usr/local/elasticsearch-7.15.2/config
    Environment=PID_DIR=/var/run/elasticsearch
    Environment=ES_TMPDIR=/data/elasticsearch/tmp
    WorkingDirectory=/usr/local/elasticsearch-7.15.2
    User=elastic
    Group=elastic
    ExecStart=/usr/local/elasticsearch-7.15.2/bin/elasticsearch -p ${PID_DIR}/elasticsearch.pid 
    StandardOutput=journal
    StandardError=journal
    LimitMEMLOCK=infinity
    # Specifies the maximum file descriptor number that can be opened by this process
    LimitNOFILE=65535
    # Specifies the maximum number of processes
    LimitNPROC=65535
    # Specifies the maximum size of virtual memory
    LimitAS=infinity
    # Specifies the maximum file size
    LimitFSIZE=infinity
    # Disable timeout logic and wait until process is stopped
    TimeoutStopSec=0
    # SIGTERM signal is used to stop the Java process
    KillSignal=SIGTERM
    # Send the signal only to the JVM rather than its control group
    KillMode=process
    # Java process is never killed
    SendSIGKILL=no
    # When a JVM receives a SIGTERM signal it exits with code 143
    SuccessExitStatus=143
    # Allow a slow startup before the systemd notifier module kicks in to extend the timeout
    TimeoutStartSec=75
    
    [Install]
    WantedBy=multi-user.target
    EOF
    
    systemctl daemon-reload
    systemctl start elasticsearch
    systemctl enable elasticsearch
    

七、配置项详解

  • path.data

    数据目录路径

  • path.logs

    日志目录路径

  • path.repo

    快照存储库目录路径

  • cluster.name

    集群名称,默认elasticsearch

  • node.name

    节点名称,默认主机名

  • network.host

    绑定访问地址

  • http.port

    设置http端口,接受单个值或范围。 如果指定了范围,则节点将绑定到范围中的第一个可用端口。默认为9200-9300。

  • http.max_content_length

    HTTP 请求正文的最大大小。 默认为100mb。

  • http.cors.enabled

    启用或禁用跨域资源共享,默认false。

  • http.cors.allow-origin

    允许哪些来源,默认为不允许来源。通配符 (*) 是一个有效值。

  • transport.port

    为节点之间的通信绑定的端口。 接受单个值或范围。 如果指定了范围,则节点将绑定到范围中的第一个可用端口。 在每个符合主节点的节点上将此设置为单个端口,而不是范围,默认为9300-9400。

  • discovery.seed_hosts

    集群节点相互发现列表。Elasticsearch默认会从本机的9300-9305端口尝试去连接其它节点,这提供了自动集群的体验,该端口默认为9300。

  • discovery.seed_providers

    通过外部文件配置集群节点相互发现列表。Elasticsearch会在这个文件改变的时候重新加载这个文件,这样集群节点列表就可以动态的改变,而不需要重启每个节点。在$ES_PATH_CONF下创建unicast_hosts.txt文件,任何时候unicast_hosts.txt文件改变都会被Elasticsearch接收,并使用新的主机列表。如果discovery.seed_hosts中存在有效的列表,那么Elasticsearch除了使用unicast_hosts.txt中提供的地址外,还使用这些地址。unicast_hosts.txt文件每行包含一个节点条目。 每个节点条目由主机名和端口号组成。

  • discovery.type

    指定Elasticsearch是否应该形成一个多节点集群。默认情况下,Elasticsearch在形成集群时发现其他节点,并允许其他节点随后加入集群。如果discovery.type设置为single-node,Elasticsearch会形成一个单节点集群,并抑制cluster.publish.timeout设置的超时。

  • discovery.probe.connect_timeout

    设置尝试连接到每个地址时的等待时间。默认为30秒。

  • discovery.probe.handshake_timeout

    设置在试图通过握手识别远程节点时要等待多长时间。默认为30秒。

  • cluster.initial_master_nodes

    集群第一次启动时,需要有一个适合作为主节点的节点列表,这个列表就是通过cluster.initial_master_nodes来配置,在配置中需要写出具体的节点名称,对应node.name配置项。

  • indices.breaker.total.use_real_memory

    Elasticsearch 包含多个断路器,用于防止操作导致 OutOfMemoryError。 每个断路器都指定了它可以使用多少内存的限制。 此外,还有一个父级断路器,它指定可以跨所有断路器使用的内存总量。(静态)确定父断路器是否应考虑实际内存使用量(true)或仅考虑子断路器保留的数量(false)。 默认为true。

  • indices.breaker.total.limit

    (动态)整个父级断路器的起始限制。 如果indices.breaker.total.use_real_memory为 false,则默认为堆内存的70%。 如果indices.breaker.total.use_real_memory为 true,则默认为堆内存的95%。

  • indices.fielddata.cache.size

    字段数据缓存的最大大小,默认为无限制,如果设置它,它应该小于字段数据断路器限制。默认缓存大小是无限的,这会导致缓存不断增长,直到达到字段数据断路器设置的限制。如果设置了缓存大小限制,缓存将开始清除缓存中最近最少更新的条目。 此设置可以自动避免断路器限制,但代价是根据需要重建缓存。如果达到断路器限制,增加缓存大小的进一步请求将被阻止。 在这种情况下,您应该手动clear the cache

  • indices.breaker.fielddata.limit

    (动态)字段数据断路器的限制。 默认为堆内存的40%。字段数据断路器估计将字段加载到字段数据缓存中所需的堆内存。 如果加载该字段会导致缓存超出预定义的内存限制,则断路器将停止操作并返回错误。

  • indices.breaker.fielddata.overhead

    (动态)一个常数,所有的字段数据估算值都要与之相乘,以确定最终的估算值。默认为1.03。

  • indices.breaker.request.limit

    (动态)请求中断器的限制,默认为堆内存的60%。请求断路器允许Elasticsearch防止每个请求的数据结构(例如,用于在请求期间计算聚合的内存)超过一定的内存量。

  • indices.breaker.request.overhead

    (动态)一个常数,所有请求的估算值都与之相乘,以确定最终的估算值。默认为1。

  • network.breaker.inflight_requests.limit

    (动态)in flight requests断路器的限制,默认为堆内存的100%。 这意味着它受为 父断路器 配置的限制的约束。in flight requests断路器允许Elasticsearch在传输或HTTP级别上限制所有当前活动的传入请求的内存使用,使其不超过节点上的一定内存量。内存的使用是基于请求本身的内容长度。

  • network.breaker.inflight_requests.overhead

    (动态) 一个常数,所有in flight requests估算值都与之相乘,以确定最终的估算值。默认为2。

  • indices.breaker.accounting.limit

    (动态)accounting断路器的限制,默认为堆内存的100%。这意味着,它受到为 父断路器 配置的限制的约束。accounting断路器允许Elasticsearch限制在内存中保留的东西的内存使用,这些东西在请求完成后不会释放。包括像Lucene段内存这样的东西。

  • indices.breaker.accounting.overhead

    (动态)一个常数,所有的accounting估算值都要与之相乘,以确定最终的估算值。默认为1

  • action.auto_create_index

    (动态)如果一个索引不存在,自动创建索引,并应用任何配置的索引模板。默认为true。

  • action.destructive_requires_name

    (动态)设置为 true 时,您必须指定索引名称才能删除索引。 无法使用 _all 删除所有索引或使用通配符。

  • cluster.indices.close.enable

    (动态)启用在Elasticsearch中关闭打开的索引。 如果为false,则无法关闭打开的索引。 默认为true。关闭的索引仍然会消耗大量的磁盘空间。

  • stack.templates.enabled

    (动态) 如果为true,则启用内置索引和组件模板。Elastic Agent使用这些模板来创建数据流。如果是false,Elasticsearch会禁用这些索引和组件模板。默认为true。

  • indices.recovery.max_bytes_per_sec

    (动态)限制每个节点的入站和出站恢复总流量,适用于对等恢复以及快照恢复,默认为40MB。除非节点是专用的coldfrozen节点,在这种情况下,默认值与节点可用的总内存有关。此限制分别适用于每个节点。 如果集群中的多个节点同时执行恢复,则集群的总恢复流量可能会超过此限制。如果此限制太高,正在进行的恢复可能会消耗过多的带宽和其他资源,这可能会破坏集群的稳定性。

  • logger.org.elasticsearch.discovery

    (动态)修改日志级别。

  • node.roles

    定义节点的角色,具体角色含义参考官网Node

  • indices.requests.cache.size

    分片级请求缓存模块将本地结果缓存在每个分片上。这使得经常使用的搜索请求几乎立即返回结果。请求缓存非常适用于日志的使用情况,在这种情况下,只有最近的索引被主动更新--来自较早索引的结果将直接从缓存中提供。缓存默认最大大小为堆的1%。

  • cluster.routing.allocation.enable

    (动态)为特定类型的分片启用或禁用分配,默认all。

  • cluster.routing.rebalance.enable

    (动态)为特定类型的分片启用或禁用重新平衡,默认all。

  • cluster.routing.allocation.allow_rebalance

    (动态)指定何时允许分片重新平衡,默认indices_all_active。

  • cluster.routing.allocation.cluster_concurrent_rebalance

    (动态)允许控制集群范围内允许多少并发分片重新平衡。 默认为 2。请注意,此设置仅控制由于集群不平衡而导致的并发分片重定位数。 由于分配过滤或强制感知,此设置不会限制分片重定位。

  • cluster.routing.allocation.disk.threshold_enabled

    (动态) 默认为true。设置为false则禁用磁盘分配决定器。

  • cluster.routing.allocation.disk.watermark.low

    (动态) 控制磁盘使用的低水位线。 它默认为85%。

  • cluster.routing.allocation.disk.watermark.high

    (动态)控制磁盘使用的高水位线。 它默认为90%。

  • cluster.routing.allocation.disk.watermark.flood_stage

    (动态)控制磁盘使用的洪水位线,默认为 95%。

  • cluster.blocks.read_only

    (动态)使整个集群只读(索引不接受写操作),元数据不允许被修改(创建或删除索引)。默认false。

  • cluster.blocks.read_only_allow_delete

    (动态)与cluster.blocks.read_only相同,但允许删除索引以释放资源。默认false。

  • cluster.max_shards_per_node

    (动态)限制集群的主分片和复制分片的总数量。cluster.max_shards_per_node * number of non-frozen data nodes。

  • cluster.max_shards_per_node.frozen

    (动态)限制集群的主要和复制的冻结分片的总数。cluster.max_shards_per_node * number of frozen data nodes。

八、集群

1、集群形成

  • 发现

    发现是集群形成模块寻找其他节点以形成集群的过程。 当启动Elasticsearch节点或当某个节点认为主节点发生故障时,此过程会运行,直到找到主节点或选出新的主节点。该过程分两个阶段进行:首先,每个节点通过连接到每个地址并尝试识别它所连接的节点并验证它是否符合主节点资格来探测种子地址。 其次,如果成功,它将与远程节点共享其所有已知的符合主节点资格的对等节点的列表,并且远程节点依次与它的对等节点进行响应。 然后该节点探测它刚刚发现的所有新节点,请求它们的对等节点。

  • 投票决策

    选举一个主节点和改变集群状态是符合主节点条件的节点必须共同完成的两项基本任务。Elasticsearch允许你在运行的集群中添加和删除符合主控条件的节点。参见Adding and removing nodes

    当节点被添加或移除时,Elasticsearch通过更新集群的投票配置(Voting configurations)来保持最佳的容错水平,投票配置是符合主控条件的节点的集合,在做决定时,如选举一个新的主控或提交一个新的集群状态,其响应会被计算在内。只有在投票配置中超过一半的节点做出反应后,才会做出决定。在一个节点加入或离开集群后,当选的主控必须发布集群状态更新,调整投票配置以匹配。

    为了确保集群保持可用,你不能同时停止投票配置中的一半或更多的节点。只要超过一半的投票节点是可用的,集群仍然可以正常工作。这意味着,如果有三个或四个符合主控条件的节点,集群可以容忍其中一个节点不可用。如果有两个或更少的符合主控条件的节点,它们必须全部保持可用。

  • 引导集群

    首次启动 Elasticsearch 集群需要在集群中的一个或多个符合主节点的节点上明确定义初始的主节点集。 这称为集群引导。最好使用至少三个符合条件的主节点进行引导,每个节点都有一个包含所有三个节点的cluster.initial_master_nodes设置。

  • 发布集群状态

    主节点是集群中唯一可以更改集群状态的节点。 主节点一次处理一批集群状态更新,计算所需的更改并将更新的集群状态发布到集群中的所有其他节点。 每个发布都以主节点向集群中的所有节点广播更新的集群状态开始。 每个节点都以确认响应,但尚未应用新接收到的状态。 一旦master从足够多的master-eligible节点收集到确认,新的集群状态被认为是commited并且master广播另一条消息指示节点应用现在提交的状态。 每个节点接收到此消息,应用更新的状态,然后将第二个确认发送回主节点。

    主节点允许每个集群状态更新在有限的时间内完全发布到所有节点。 它由cluster.publish.timeout设置定义,默认为30秒,从发布开始的时间开始计算。 如果在提交新的集群状态之前达到此时间,则拒绝集群状态更改,并且master认为自己已失败。 它停下来并开始尝试选举一个新的master。

    如果在cluster.publish.timeout过去之前提交了新的集群状态,则主节点认为更改已成功。它一直等到超时结束或收到集群中每个节点已应用更新状态的确认,然后开始处理和发布下一个集群状态更新。 如果没有收到确认,这些节点被认为是滞后的,因为它们的集群状态已经落后于主节点的最新状态。master等待落后节点再追上一段时间,cluster.follower_lag.timeout,默认为90秒。如果节点在这段时间内仍未成功应用集群状态更新,则认为它已失败并从集群中删除。

  • 集群故障检测

    当选master定期检查集群中的每个节点,以确保它们仍然连接和健康。集群中的每个节点也会定期检查当选master的健康状况。Elasticsearch允许这些检查偶尔失败或超时而不采取任何行动。只有在连续多次检查失败后,它才会认为一个节点是有问题的。你可以用cluster.fault_detection.*设置来控制故障检测行为。

    如果当选master检测到一个节点断开了连接,这种情况会被视为立即失败。master会绕过超时和重试设置值,并试图将该节点从集群中移除。同样地,如果一个节点检测到当选master已断开连接,这种情况被视为立即失败。节点绕过超时和重试设置,重新启动其发现阶段,试图找到或选出一个新的master。

    此外,每个节点定期验证其数据路径是否健康,方法是向磁盘写入一个小文件,然后再次删除。如果一个节点发现它的数据路径不健康,那么它将从集群中移除,直到数据路径恢复。可以通过monitor.fs.health设置来控制这种行为。

2、部署流程

建议使用三个主节点三个数据节点集群,这里是演示

环境规划

主机名 IP地址
node01 10.81.0.101
node02 10.81.0.102
node03 10.81.0.103
  • 修改hosts文件

    <!== 所有主机执行 ==>

    vim /etc/hosts
    10.81.0.101 node01
    10.81.0.102 node02
    10.81.0.103 node03
    
  • 按照上文单机安装部署步骤安装elasticsearch,无需启动

    <!== 所有主机执行 ==>

  • 修改配置文件

    <!== node01主机执行 ==>

    vim /usr/local/elasticsearch-7.15.2/config/elasticsearch.yml
    node.name: node01
    node.roles: [data]
    cluster.name: zt-elk
    path.data: /data/elasticsearch/data
    path.logs: /data/elasticsearch/logs
    path.repo: /data/backup/elasticsearch
    bootstrap.memory_lock: true
    network.host: 0.0.0.0
    http.port: 9200
    http.max_content_length: 200mb
    http.cors.enabled: true
    http.cors.allow-origin: "*"
    transport.port: 9300
    discovery.seed_hosts: ["node01", "node02", "node03"]
    discovery.seed_providers: file
    discovery.probe.connect_timeout: 3s
    discovery.probe.handshake_timeout: 1s
    cluster.initial_master_nodes: ["node02"]
    action.auto_create_index: true
    action.destructive_requires_name: true
    indices.requests.cache.size: 2%
    gateway.expected_nodes: -1
    gateway.expected_master_nodes: -1
    gateway.expected_data_nodes: -1
    gateway.recover_after_time: 0ms
    gateway.recover_after_nodes: -1
    gateway.recover_after_master_nodes: 0
    gateway.recover_after_data_nodes: -1
    cluster.routing.allocation.cluster_concurrent_rebalance: 4
    

    <!== node02主机执行 ==>

    vim /usr/local/elasticsearch-7.15.2/config/elasticsearch.yml
    node.name: node02
    node.roles: [master]
    cluster.name: zt-elk
    path.data: /data/elasticsearch/data
    path.logs: /data/elasticsearch/logs
    path.repo: /data/backup/elasticsearch
    bootstrap.memory_lock: true
    network.host: 0.0.0.0
    http.port: 9200
    http.max_content_length: 200mb
    http.cors.enabled: true
    http.cors.allow-origin: "*"
    transport.port: 9300
    discovery.seed_hosts: ["node01", "node02", "node03"]
    discovery.seed_providers: file
    discovery.probe.connect_timeout: 3s
    discovery.probe.handshake_timeout: 1s
    cluster.initial_master_nodes: ["node02"]
    action.auto_create_index: true
    action.destructive_requires_name: true
    indices.requests.cache.size: 2%
    gateway.expected_nodes: -1
    gateway.expected_master_nodes: -1
    gateway.expected_data_nodes: -1
    gateway.recover_after_time: 0ms
    gateway.recover_after_nodes: -1
    gateway.recover_after_master_nodes: 0
    gateway.recover_after_data_nodes: -1
    cluster.routing.allocation.cluster_concurrent_rebalance: 4
    

    <!== node03主机执行 ==>

    vim /usr/local/elasticsearch-7.15.2/config/elasticsearch.yml
    node.name: node03
    node.roles: [data]
    cluster.name: zt-elk
    path.data: /data/elasticsearch/data
    path.logs: /data/elasticsearch/logs
    path.repo: /data/backup/elasticsearch
    bootstrap.memory_lock: true
    network.host: 0.0.0.0
    http.port: 9200
    http.max_content_length: 200mb
    http.cors.enabled: true
    http.cors.allow-origin: "*"
    transport.port: 9300
    discovery.seed_hosts: ["node01", "node02", "node03"]
    discovery.seed_providers: file
    discovery.probe.connect_timeout: 3s
    discovery.probe.handshake_timeout: 1s
    cluster.initial_master_nodes: ["node02"]
    action.auto_create_index: true
    action.destructive_requires_name: true
    indices.requests.cache.size: 2%
    gateway.expected_nodes: -1
    gateway.expected_master_nodes: -1
    gateway.expected_data_nodes: -1
    gateway.recover_after_time: 0ms
    gateway.recover_after_nodes: -1
    gateway.recover_after_master_nodes: 0
    gateway.recover_after_data_nodes: -1
    cluster.routing.allocation.cluster_concurrent_rebalance: 4
    
  • 启动程序

    <!== 所有主机执行 ==>

    systemctl start elasticsearch
    systemctl enable elasticsearch 
    
  • 查看集群状态

    curl 'localhost:9200/_cat/nodes?v=true'
    

3、集群重启流程

  1. 禁用分片分配

    当你关闭一个数据节点时,分配过程会等待index.unassigned.node_left.delayed_timeout(默认为1m),然后才开始将该节点上的分片复制到集群中的其他节点,这会产生大量I/O。 由于节点很快将重新启动, 可以通过在关闭数据节点之前禁用副本分配来避免

    curl -X PUT "localhost:9200/_cluster/settings?pretty" -H 'Content-Type: application/json' -d'
    {
      "persistent": {
        "cluster.routing.allocation.enable": "primaries"
      }
    }
    '
    
  2. 停止索引并执行同步刷新

    执行同步刷新可加快分片恢复。当你执行同步刷新时,检查响应以确保没有失败。由于挂起的索引操作而失败的同步刷新操作会在响应体中列出,尽管请求本身仍然返回200 OK状态。如果有失败,重新发出请求。此功能将在8.0版本中删除。

    curl -X POST "localhost:9200/_flush/synced?pretty"
    
  3. 关闭所有节点

    systemctl stop elasticsearch
    
  4. 启动节点

    如果有专用的主节点,请先启动它们并等待它们形成集群并选择主节点,然后再继续处理数据节点。 可以通过cat nodes API来检查进度。

    systemctl start elasticsearch
    
  5. 重新启用分配

    当一个节点加入集群时,它开始恢复本地存储的任何主分片。 _cat/health API 最初报告的状态为红色,表示并非所有主分片都已分配。
    一旦节点恢复其本地分片,集群状态将切换为黄色,表示所有主分片已恢复,但未分配所有副本分片。 因为尚未重新启用分配。 延迟分配副本直到所有节点都为黄色允许主节点将副本分配给已经具有本地分片副本的节点。

    curl -X PUT "localhost:9200/_cluster/settings?pretty" -H 'Content-Type: application/json' -d'
    {
      "persistent": {
        "cluster.routing.allocation.enable": null
      }
    }
    '
    

九、使用标准SQL操作ES

  • SQL REST API

    curl -X POST "localhost:9200/_sql?format=txt&pretty" -H 'Content-Type: application/json' -d'
    {
      "query": "SELECT * FROM library WHERE release_date < \u00272000-01-01\u0027"
    }
    '
    
  • SQL CLI

    $ ./bin/elasticsearch-sql-cli
    sql> SELECT * FROM library WHERE release_date < '2000-01-01';
    

十、索引

Index modules

Index management

十一、索引生命周期管理 (ILM)

可以通过Kibana Management或ILM API创建和管理索引生命周期策略。当您为Beats或Logstash Elasticsearch输出插件启用索引生命周期管理时,默认策略是自动配置的。

索引生命周期阶段共分为五个阶段:

  • Hot:该索引正在积极更新和查询。

  • Warm:该索引不再被更新,但仍在被查询。

  • Cold:该索引不再被更新,并且不经常被查询。这些信息仍然需要被搜索到,只是查询速度比较慢。

  • Frozen:该索引不再被更新,并且不经常被查询。这些信息仍然需要被搜索到,只是查询速度非常慢。

  • Delete:不再需要该索引,可以安全地删除该索引。

在为日志或指标等时间序列数据编制索引时,不能无限期地写入单个索引。 为了满足索引和搜索性能要求并管理资源使用情况,写入索引直到满足某个阈值,然后创建一个新索引并开始写入它。 使用滚动索引能够达到以下效果:

  • 针对高性能Hot节点上的高摄取率优化活动索引。

  • 优化Warm节点上的搜索性能。

  • 将较旧、访问频率较低的数据转移到成本较低的Cold节点。

  • 通过删除整个索引,根据您的保留策略删除数据。

ILM能够根据索引大小、文档计数或年龄自动滚动到新索引。 当触发Rollover时,会创建一个新索引,写入别名会更新为指向新索引,所有后续更新都会写入新索引。

索引生命周期操作

配置生命周期策略

启动和停止索引生命周期管理

十二、命令工具详解

命令使用均已运行用户执行

1、elasticsearch-keystore

elasticsearch-keystore 命令管理 Elasticsearch 密钥库中的安全设置。

usage: 
  bin/elasticsearch-keystore
  ([add <settings>] [-f] [--stdin] |
  [add-file (<setting> <path>)+] | [create] [-p] |
  [has-passwd] | [list] | [passwd] | [remove <setting>] | [upgrade])
  [-h, --help] ([-s, --silent] | [-v, --verbose])

parameters:
  add <settings>
    将设置添加到密钥库。可以将多个设置名称指定为add命令的参数。默认情况下,系统会提示您输入设置的值。如果密钥库受密码保护,系统还会提示您输入密码。如果密钥库中已存在设置,则必须确认要覆盖当前值。如果密钥库不存在,您必须确认您要创建密钥库。要避免这两个确认提示,请使用-f参数。
  add-file (<setting> <path>)+
    将文件添加到密钥库。
  create
    创建密钥库。
  -f, --force
    强制不在提示,与add参数一起使用。
  -h, --help
    返回所有命令参数。
  has-passwd
    如果密钥库存在并且受密码保护,则返回成功消息。否则返回错误消息。
  list
    列出密钥库中的设置。如果密钥库受密码保护,系统将提示您输入密码。
  -p
    与create参数一起使用时,该命令会提示您输入密钥库密码。如果未指定-p标志或输入空密码,则密钥库会被混淆但不受密码保护。
  passwd
    更改或设置密钥库密码
  remove <settings>
    从密钥库中删除设置。可以将多个设置名称指定为remove命令的参数。
  -s, --silent
    显示最小输出。
  -x, --stdin
    过标准输入(stdin)传递设置值。使用回车符或换行符分隔多个值。
  upgrade
    升级密钥库的内部格式。

examples:
  创建elasticsearch.keystore密钥库
    bin/elasticsearch-keystore create -p
  将设置添加到密钥库
    bin/elasticsearch-keystore add the.setting.name.to.set
  将文件添加到密钥库
    bin/elasticsearch-keystore add-file the.setting.name.to.set /path/example-file.json
  从密钥库中删除设置
    bin/elasticsearch-keystore remove the.setting.name.to.remove

2、elasticsearch-node

elasticsearch-node命令能够在节点上执行某些不安全的操作,这些操作只能在关闭时执行。 此命令允许您调整节点的角色,不安全地编辑集群设置,并且即使在与磁盘上的数据不兼容的情况下,也可以在灾难后恢复某些数据或启动节点。

usage:
  bin/elasticsearch-node repurpose|unsafe-bootstrap|detach-cluster|override-version
  [--ordinal <Integer>] [-E <KeyValuePair>]
  [-h, --help] ([-s, --silent] | [-v, --verbose])


parameters:
  repurpose
    当节点的角色发生变化时删除多余的数据。
  unsafe-bootstrap
    指定将此节点作为新的单节点集群不安全地引导。
  detach-cluster
    指定不安全地将此节点从其集群中分离,以便它可以加入不同的集群。
  override-version
    覆盖存储在数据路径中的版本号,以便节点可以在与磁盘数据不兼容的情况下启动。
  remove-settings
    从磁盘集群状态中强制删除提供的持久集群设置。
  --ordinal <Integer>
    如果有多个节点共享数据路径,则这指定要定位的节点。默认为0,表示使用数据路径中的第一个节点。
  -E <KeyValuePair>
    配置设置。

examples:
  以前的数据节点被重新用作专用主节点。首先在其elasticsearch.yml配置文件中将节点的设置更新为node.roles: [ "master" ]。然后运行 elasticsearch-node repurpose 命令以查找并删除多余的分片数据
    bin/elasticsearch-node repurpose
  如果节点包含阻止集群形成的持久集群设置,即无法使用集群更新设置API删除,可以运行以下命令来删除一个或多个集群设置
    bin/elasticsearch-node remove-settings ***
  如果磁盘集群状态包含阻止节点启动和加载集群状态的自定义元数据,可以运行以下命令来删除此自定义元数据
    elasticsearch-node remove-customs ***

3、elasticsearch-service-token

创建、列出和删除基于文件的服务账户令牌。当创建第一个服务帐户令牌时,此命令会在 $ES_HOME/config 目录中创建一个 service_tokens 文件。 该文件默认不存在。Elasticsearch监视此文件的更改并动态重新加载它.

usage:
  bin/elasticsearch-service-tokens
  ([create <service_account_principal> <token_name>]) |
  ([list] [<service_account_principal>]) |
  ([delete <service_account_principal> <token_name>])

parameters:
  create
    为指定的服务帐户创建服务帐户令牌。
  list
    列出在 service_tokens 文件中定义的所有服务帐户令牌。如果指定服务帐户主体,则该命令仅列出属于指定服务帐户的令牌。
  delete
    删除指定服务帐户的服务帐户令牌。

examples:
  为 elastic/fleet-server 服务帐户创建一个名为 my-token 的服务帐户令牌。
    bin/elasticsearch-service-tokens create elastic/fleet-server my-token
  以下命令列出了 service_tokens 文件中定义的所有服务帐户令牌。
    bin/elasticsearch-service-tokens list
  删除 elastic/fleet-server 服务帐户的 my-token 服务帐户令牌
    bin/elasticsearch-service-tokens delete elastic/fleet-server my-token

4、elasticsearch-setup-passwords

设置内置用户的密码。此命令仅供在Elasticsearch安全功能的初始配置期间使用。 它使用弹性引导密码来运行用户管理API请求。 如果Elasticsearch密钥库受密码保护,则必须先输入密钥库密码,然后才能为内置用户设置密码。 为弹性用户设置密码后,引导密码不再有效,无法使用该命令。

usage:
  bin/elasticsearch-setup-passwords auto|interactive
  [-b, --batch] [-h, --help] [-E <KeyValuePair>]
  [-s, --silent] [-u, --url "<URL>"] [-v, --verbose]

parameters:
  auto
    将随机生成的密码输出到控制台。
  -b, --batch
    如果启用,则在不提示用户的情况下运行更改密码过程。
  -E <KeyValuePair>
    配置标准 Elasticsearch 或 X-Pack 设置。
  interactive
    提示手动输入密码。
  -u, --url "<URL>"
    指定工具用来提交用户管理API请求的URL。默认值由elasticsearch.yml文件中的设置确定。如果 xpack.security.http.ssl.enabled 设置为 true,则必须指定 HTTPS URL。

examples:
  bin/elasticsearch-setup-passwords auto -u "http://localhost:9201"

5、elasticsearch-shard

在某些情况下,分片副本的Lucene索引或事务日志可能会损坏。 elasticsearch-shard命令能够在无法自动恢复或从备份恢复的分片的良好副本时删除分片的损坏部分。运行elasticsearch-shard时,将丢失损坏的数据。在运行elasticsearch-shard之前停止Elasticsearch。

usage:
  bin/elasticsearch-shard remove-corrupted-data
  ([--index <Index>] [--shard-id <ShardId>] | [--dir <IndexPath>])
  [--truncate-clean-translog]
  [-E <KeyValuePair>]
  [-h, --help] ([-s, --silent] | [-v, --verbose])

parameters:
  --index
    指定索引名称
  --shard-id
    指定分片名称
  --dir
    指定损坏的索引或 translog 文件的完整路径

examples:
  bin/elasticsearch-shard remove-corrupted-data --index my-index-000001 --shard-id 0

6、elasticsearch-users

使用基于文件的用户身份验证,则可以使用elasticsearch-users命令添加和删除用户、分配用户角色和管理密码。

usage:
  bin/elasticsearch-users
  ([useradd <username>] [-p <password>] [-r <roles>]) |
  ([list] <username>) |
  ([passwd <username>] [-p <password>]) |
  ([roles <username>] [-a <roles>] [-r <roles>]) |
  ([userdel <username>])

parameters:
  -a <roles>
    如果与角色参数一起使用,则向用户添加以逗号分隔的角色列表。
  list
    列出在本地节点上注册到文件领域的用户。如果您还指定了用户名,该命令将提供该用户的信息。
  -p <password>
    指定用户的密码。如果不指定此参数,命令将提示您输入密码。
  passwd <username>
    重置用户的密码。
  -r <roles>
    如果与useradd参数一起使用,则定义用户的角色。此选项接受以逗号分隔的角色名称列表以分配给用户。
    如果与roles参数一起使用,则从用户中删除以逗号分隔的角色列表。
  roles
    管理特定用户的角色。可以在同一命令中结合添加和删除角色来更改用户的角色。
  useradd <username>
    将用户添加到您的本地节点。
  userdel <username>
    从本地节点中删除用户。

examples:
  创建用户并授权
    bin/elasticsearch-users useradd jacknich -p theshining -r network,monitoring
  重置用户密码
    bin/elasticsearch-users passwd jachnich
  删除并添加权限
    bin/elasticsearch-users roles jacknich -r network,monitoring -a user
  删除用户
    bin/elasticsearch-users userdel jacknich

十三、常用REST API

参考官方文档REST APIs

GET /_cat/aliases?v=true
    检索集群的索引别名,包括过滤器和路由信息。API不返回data stream别名。
GET /_cat/allocation?v=true
    提供分配给每个数据节点的分片数量及其磁盘空间的快照。
GET /_cat/count/my-index-000001?v=true
    提供快速访问数据流、索引或整个集群的文档计数。
GET /_cat/fielddata?v=true
    返回集群中每个数据节点上的字段数据缓存当前使用的堆内存量。
GET /_cat/health?v=true
    返回集群的健康状态
GET /_cat/indices/my-index-*?v=true
    返回有关集群中索引的高级信息,包括数据流的支持索引。
GET /_cat/master?v=true
    返回主节点信息,包括ID、绑定IP地址、名称。
GET /_cat/nodeattrs?v=true
    返回有关自定义节点属性的信息。
GET /_cat/nodes?v=true
    返回有关集群节点的信息。
GET /_cat/pending_tasks?v=true
    返回尚未执行的集群级别更改,类似于挂起的集群任务API。
GET /_cat/plugins?v=true&h=name,component,version,description
    返回在集群的每个节点上运行的插件列表。
GET _cat/recovery?v=true
    返回有关正在进行和已完成的分片恢复的信息,类似于索引恢复API。
GET /_cat/repositories?v=true
    返回集群的快照存储库。
GET /_cat/segments?v=true
    返回有关索引分片中Lucene segments的低级信息,类似于index segments API。
GET /_cat/shards?v=true
    shards命令是哪些节点包含哪些分片的详细视图。它会告诉您它是主节点还是副本节点、文档数、它在磁盘上占用的字节数以及它所在的节点。
GET /_cat/snapshots?v=true
    返回有关存储在一个或多个存储库中的快照的信息。
GET /_cat/tasks?v=true
    返回集群中当前正在执行的任务的信息。
GET /_cat/templates/my-template-*?v=true
    返回有关集群中索引模板的信息。
GET /_cat/thread_pool?v=true
    返回集群中每个节点的线程池统计信息。返回的信息包括所有内置线程池和自定义线程池。

GET /_cluster/allocation/explain
    提供分片当前分配的详情。
GET /_cluster/settings
    返回集群范围设置。
GET /_cluster/health
    返回集群的健康状态。
GET /_cluster/state/<metrics>/<target>
    返回有关集群状态的元数据。
GET /_cluster/stats
    返回集群统计信息。
PUT /_cluster/settings
    配置动态集群设置。
GET /_nodes/<node_id>/usage/<metric>
    返回集群有关功能使用情况的信息。
GET /_nodes/<node_id>/<metric>
    返回集群节点信息。
POST /_nodes/reload_secure_settings
    在集群中的节点上重新加载密钥库。
GET /_nodes/<node_id>/stats/<metric>/<index_metric>
    返回集群节点统计信息。
GET /_remote/info
    返回配置的远程集群信息。
POST /_cluster/voting_config_exclusions?node_names=<node_names>
    从投票配置排除列表中添加符合主节点资格的节点。
DELETE /_cluster/voting_config_exclusions?node_names=<node_names>
    从投票配置排除列表中删除符合主节点资格的节点。

十四、快照备份恢复

快照是从正在运行的Elasticsearch集群中获取的备份。 可以拍摄整个集群的快照,包括其所有数据流和索引。 还可以仅对集群中的特定数据流或索引进行快照。必须先注册快照存储库,然后才能创建快照。

Elasticsearch以增量方式进行快照:快照过程只将数据复制到存储库中,而之前的快照还没有复制到那里,避免了不必要的重复工作或存储空间。这意味着可以安全地以最小的开销频繁地进行快照。这种增量只适用于单个存储库,因为存储库之间没有数据共享。快照在逻辑上也是相互独立的,即使是在一个存储库内:删除一个快照不会影响任何其他快照的完整性。

可以将快照恢复到正在运行的集群中,默认情况下包括快照中的所有数据流和索引。 也可以选择仅从快照恢复集群状态或特定数据流或索引。

可以使用快照生命周期管理来自动拍摄和管理快照。

快照包含构成索引或数据流支持索引的磁盘上数据结构的副本。这意味着快照只能被恢复到可以读取索引的Elasticsearch版本中。版本兼容图如下:

  • 创建快照

    curl -X PUT "localhost:9200/_snapshot/my_backup/snapshot_2?wait_for_completion=true&pretty" -H 'Content-Type: application/json' -d'
    {
      "include_global_state": true
    }
    '
    
  • 快照恢复

    curl -X POST "localhost:9200/_snapshot/my_backup/snapshot_1/_restore?pretty" -H 'Content-Type: application/json' -d'
    {
      "include_global_state": true              
    }
    '
    
  • 删除快照

    curl -X DELETE "localhost:9200/_snapshot/my_backup/snap*?pretty"
    
  • 设置快照生命周期策略

    curl -X PUT "localhost:9200/_slm/policy/nightly-snapshots?pretty" -H 'Content-Type: application/json' -d'
    {
      "nightly-snapshots" : {
        "version": 1,
        "modified_date": "2019-04-23T01:30:00.000Z",
        "modified_date_millis": 1556048137314,
        "policy" : {
          "schedule": "0 30 1 * * ?",
          "name": "<nightly-snap-{now/d}>",
          "repository": "my_repository",
          "config": {
            "indices": ["*"],
          },
          "retention": {
            "expire_after": "30d",
            "min_count": 5,
            "max_count": 50
          }
        },
        "last_success": {                                                    
          "snapshot_name": "nightly-snap-2019.04.24-tmtnyjtrsxkhbrrdcgg18a", 
          "time_string": "2019-04-24T16:43:49.316Z",
          "time": 1556124229316
        } ,
        "last_failure": {                                                    
          "snapshot_name": "nightly-snap-2019.04.02-lohisb5ith2n8hxacaq3mw",
          "time_string": "2019-04-02T01:30:00.000Z",
          "time": 1556042030000,
          "details": "{\"type\":\"index_not_found_exception\",\"reason\":\"no such index [important]\",\"resource.type\":\"index_or_alias\",\"resource.id\":\"important\",\"index_uuid\":\"_na_\",\"index\":\"important\",\"stack_trace\":\"[important] IndexNotFoundException[no such index [important]]\\n\\tat org.elasticsearch.cluster.metadata.IndexNameExpressionResolver$WildcardExpressionResolver.indexNotFoundException(IndexNameExpressionResolver.java:762)\\n\\tat org.elasticsearch.cluster.metadata.IndexNameExpressionResolver$WildcardExpressionResolver.innerResolve(IndexNameExpressionResolver.java:714)\\n\\tat org.elasticsearch.cluster.metadata.IndexNameExpressionResolver$WildcardExpressionResolver.resolve(IndexNameExpressionResolver.java:670)\\n\\tat org.elasticsearch.cluster.metadata.IndexNameExpressionResolver.concreteIndices(IndexNameExpressionResolver.java:163)\\n\\tat org.elasticsearch.cluster.metadata.IndexNameExpressionResolver.concreteIndexNames(IndexNameExpressionResolver.java:142)\\n\\tat org.elasticsearch.cluster.metadata.IndexNameExpressionResolver.concreteIndexNames(IndexNameExpressionResolver.java:102)\\n\\tat org.elasticsearch.snapshots.SnapshotsService$1.execute(SnapshotsService.java:280)\\n\\tat org.elasticsearch.cluster.ClusterStateUpdateTask.execute(ClusterStateUpdateTask.java:47)\\n\\tat org.elasticsearch.cluster.service.MasterService.executeTasks(MasterService.java:687)\\n\\tat org.elasticsearch.cluster.service.MasterService.calculateTaskOutputs(MasterService.java:310)\\n\\tat org.elasticsearch.cluster.service.MasterService.runTasks(MasterService.java:210)\\n\\tat org.elasticsearch.cluster.service.MasterService$Batcher.run(MasterService.java:142)\\n\\tat org.elasticsearch.cluster.service.TaskBatcher.runIfNotProcessed(TaskBatcher.java:150)\\n\\tat org.elasticsearch.cluster.service.TaskBatcher$BatchedTask.run(TaskBatcher.java:188)\\n\\tat org.elasticsearch.common.util.concurrent.ThreadContext$ContextPreservingRunnable.run(ThreadContext.java:688)\\n\\tat org.elasticsearch.common.util.concurrent.PrioritizedEsThreadPoolExecutor$TieBreakingPrioritizedRunnable.runAndClean(PrioritizedEsThreadPoolExecutor.java:252)\\n\\tat org.elasticsearch.common.util.concurrent.PrioritizedEsThreadPoolExecutor$TieBreakingPrioritizedRunnable.run(PrioritizedEsThreadPoolExecutor.java:215)\\n\\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)\\n\\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)\\n\\tat java.base/java.lang.Thread.run(Thread.java:834)\\n\"}"
        } ,
        "next_execution": "2019-04-24T01:30:00.000Z",                        
        "next_execution_millis": 1556048160000
      }
    }
    '
    
  • 测试快照策略

    curl -X POST "localhost:9200/_slm/policy/nightly-snapshots/_execute?pretty"
    
  • SLM权限设置

    curl -X POST "localhost:9200/_security/role/slm-admin?pretty" -H 'Content-Type: application/json' -d'
    {
      "cluster": ["manage_slm", "cluster:admin/snapshot/*"],
      "indices": [
        {
          "names": [".slm-history-*"],
          "privileges": ["all"]
        }
      ]
    }
    ' 
    

十五、elasticsearch-head插件安装

注意:需要修改配置文件添加允许跨域参数

http.cors.enabled: true 
http.cors.allow-origin: "*"
  1. 编译安装

    cd /opt/
    wget https://nodejs.org/dist/v12.13.0/node-v12.13.0-linux-x64.tar.xz
    tar xf node-v12.13.0-linux-x64.tar.xz
    mv node-v12.13.0-linux-x64 node
    echo 'export PATH=$PATH:/opt/node/bin' >> /etc/profile
    source /etc/profile 
    npm -v
    node -v 
    git clone git://github.com/mobz/elasticsearch-head.git
    unzip elasticsearch-head-master.zip
    cd elasticsearch-head-master
    npm install -g cnpm --registry=https://registry.npm.taobao.org
    cnpm install
    cnpm run start &
    
  2. docker安装

    docker pull alivv/elasticsearch-head
    docker run --name es-head -p 9100:9100 -dit elivv/elasticsearch-head
    
  3. google浏览器插件(推荐)

    https://github.com/mobz/elasticsearch-head
    

十六、kibana图形界面管理

生产环境中使用 Kibana

一篇很好解释ES_NODE角色的文章,配置连接ES节点参考[不懂就问]ES读写连接小疑问 - Elastic 中文社区

  • 安装部署

    • 下载软件

      cd /usr/local/src && wget https://artifacts.elastic.co/downloads/kibana/kibana-7.15.2-linux-x86_64.tar.gz
      tar -xzf kibana-7.15.2-linux-x86_64.tar.gz -C /usr/local
      cd .. && mv kibana-7.15.2-linux-x86_64/ kibana-7.15.2
      
    • 修改配置文件

      #管理端配置
      server.port: 5601
      server.host: "10.81.32.44"
      server.name: "kibana-admin"
      server.publicBaseUrl: "http://kibana-manager.goodcang.com"
      elasticsearch.hosts: ["http://10.81.0.101:9200", "http://10.81.0.103:9200"]
      elasticsearch.requestTimeout: 90000
      i18n.locale: "en"
      
      #普通用户端配置
      server.port: 5601
      server.host: "10.81.32.42"
      server.name: "kibana"
      server.publicBaseUrl: "http://kibana.goodcang.com"
      elasticsearch.hosts: ["http://10.81.0.101:9200", "http://10.81.0.103:9200"]
      elasticsearch.requestTimeout: 90000
      i18n.locale: "en"
      xpack.monitoring.enabled: true
      xpack.monitoring.ui.enabled: false
      xpack.watcher.enabled: false
      xpack.canvas.enabled: false
      xpack.reporting.enabled: false
      xpack.maps.enabled: false
      xpack.security.enabled: false
      xpack.uptime.enabled: false
      xpack.spaces.enabled: false
      xpack.license_management.enabled: false
      xpack.upgrade_assistant.enabled: false
      xpack.index_management.enabled: false
      xpack.apm.enabled: false
      xpack.beats.enabled: false
      xpack.ccr.enabled: false
      xpack.cloud.enabled: false
      xpack.graph.enabled: false
      xpack.grokdebugger.enabled: false
      xpack.ilm.enabled: false
      xpack.infra.enabled: false
      xpack.logstash.enabled: false
      xpack.ml.enabled: false
      xpack.remote_clusters.enabled: false
      xpack.rollup.enabled: false
      xpack.searchprofiler.enabled: false
      xpack.tilemap.enabled: false
      console.enabled: false
      
    • 创建运行用户并授权

      groupadd kibana
      useradd -g kibana -M -s /sbin/nologin kibana
      chown -R kibana. /usr/local/kibana-7.15.2
      
    • 设置systemd管理

      cat > /etc/systemd/system/kibana.service <<'EOF'
      [Unit]
      Description=kibana
      After=network.target
      
      [Service]
      User=kibana
      Group=kibana
      ExecStart=/usr/local/kibana-7.15.2/bin/kibana
      ExecStop=/bin/kill -TERM $MAINPID
      ExecReload=/bin/kill -HUP $MAINPID
      Type=simple
      RemainAfterExit=yes
      PrivateTmp=true
      # file size
      LimitFSIZE=infinity
      # cpu time
      LimitCPU=infinity
      # virtual memory size
      LimitAS=infinity
      # open files
      LimitNOFILE=65535
      # processes/threads
      LimitNPROC=65535
      # locked memory
      LimitMEMLOCK=infinity
      # total threads (user+kernel)
      TasksMax=infinity
      TasksAccounting=false
      
      [Install]
      WantedBy=multi-user.target
      EOF
      
      systemctl daemon-reload
      systemctl start kibana
      systemctl enable kibana
      
    • nginx反代配置

      upstream kibanaservice {
        server 10.81.32.44:5601 max_fails=2 fail_timeout=30s;
      }
      server {
        listen          80;
        server_name    kibana-manager.goodcang.com;
        charset utf-8;
        access_log   /data/logs/nginx/elk-nginx-log/kibana-manager.access.log nginx-json-log;
        error_log   /data/logs/nginx/elk-nginx-log/kibana-manager.error.log; 
        location / {
              proxy_pass http://kibanaservice/;
              proxy_next_upstream http_502 http_504 error  timeout invalid_header;
              proxy_set_header Host $host;
              proxy_set_header X-Real-IP $remote_addr;
              proxy_set_header $http_x_forwarded_for $remote_addr;
                      client_max_body_size    10m;
                      client_body_buffer_size 128k;
                      proxy_connect_timeout  1800;
                      proxy_send_timeout     1800;
                      proxy_read_timeout     1800;
                      proxy_buffer_size      4k;
                      proxy_buffers          4 32k;
                      proxy_busy_buffers_size 64k;
                      proxy_temp_file_write_size 64k;
      } 
       location ^~ /WEB-INF{
                      deny all;
              }
      }
      

十七、Elasticsearch Curator

官网地址

一个用来管理Elasticsearch索引的工具,使用它可以管理需要删除或保留的索引数据。 当Elasticsearch作为ELK、EFK等日志收集方案的日志存储时,删除过期数据以释放存储空间显的格外重要,使用Curator可以删除旧的索引并优化系统。

  • 安装部署

    • 下载软件

      rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
      yum -y install https://packages.elastic.co/curator/5/centos/7/Packages/elasticsearch-curator-5.8.4-1.x86_64.rpm
      
    • 修改配置文件

      mkdir /opt/elasticsearch-curator/.conf
      cd /opt/elasticsearch-curator/.conf
      cat > curator.yml <<'EOF'
      client:
        hosts: ["10.81.0.101", "10.81.0.102", "10.81.0.103"]
        port: 9200
        url_prefix:
        use_ssl: False
        certificate:
        client_cert:
        client_key:
        ssl_no_validate: False
        http_auth:
        timeout: 600
        master_only: False
      
      logging:
        loglevel: INFO
        logfile: /var/log/curator.log
        logformat: default
        blacklist: ['elasticsearch', 'urllib3']
      EOF
      
    • 修改动作文件

      cat > actions.yml <<'EOF'
      actions:
        1:
          action: delete_indices
          description: >-
            业务日志保留30天
            暂时保留20天,待磁盘扩容后进行调整
            Delete indices older than 20 days (based on index name), for logstash-
            prefixed indices. Ignore the error if the filter does not result in an
            actionable list of indices (ignore_empty_list) and exit cleanly.
          options:
            ignore_empty_list: True
            disable_action: False
          filters:
          - filtertype: pattern
            kind: regex
            value: '^business-live-logs|^ods-.*-logs|^zt-monitor-logs|^fip-live-logs|^fip-pre-logs|^test-fip-lbg|^bi-live-logs|netmonitor|^mdm-log|^goten-app-log|^srs-app-log|^cbs-dcbank-log|^ztn-.*-log|^ztn-.*-applogs|^lbu-.*-applogs|^fbg-.*-log|^gc-elasticsearch-slow|^gc-mongodb-slow|^ztn-digital-skywalking'
          - filtertype: age
            source: name
            direction: older
            timestring: '%Y.%m.%d'
            unit: days
            unit_count: 15
        2:
          action: delete_indices
          description: >-
            Delete indices older than 20 days (based on index name), for logstash-
            prefixed indices. Ignore the error if the filter does not result in an
            actionable list of indices (ignore_empty_list) and exit cleanly.
          options:
            ignore_empty_list: True
            disable_action: False
          filters:
          - filtertype: pattern
            kind: regex
            value: '^fbg-.*-applogs'
          - filtertype: age
            source: name
            direction: older
            timestring: '%Y.%m.%d'
            unit: days
            unit_count: 15
        3:
          action: delete_indices
          description: >-
            访问日志保留45天
            Delete indices older than 45 days (based on index name), for logstash-
            prefixed indices. Ignore the error if the filter does not result in an
            actionable list of indices (ignore_empty_list) and exit cleanly.
          options:
            ignore_empty_list: True
            disable_action: False
          filters:
          - filtertype: pattern
            kind: regex
            value: '^nginx-access|gc-tms-hk-proxy|^ztn-lmp-nginxaccess'
          - filtertype: age
            source: name
            direction: older
            timestring: '%Y.%m.%d'
            unit: days
            unit_count: 45
        4:
          action: delete_indices
          description: >-
            慢日志保留60天
            Delete indices older than 60 days (based on index name), for logstash-
            prefixed indices. Ignore the error if the filter does not result in an
            actionable list of indices (ignore_empty_list) and exit cleanly.
          options:
            ignore_empty_list: True
            disable_action: False
          filters:
          - filtertype: pattern
            kind: regex
            value: '^goten-mysqlslow|^gc-mysql-slow-new|mysql-slow-log|gc-mysql-slow-rds|gc-mysql-slow-test|netmonitor|^fbg-gd-openapi-applogs|^kong-access|^lbu-kong-logs|^ztn-digitalkong-logs'
          - filtertype: age
            source: name
            direction: older
            timestring: '%Y.%m.%d'
            unit: days
            unit_count: 60
        5:
          action: delete_indices
          description: >-
            .monitoring-es-7,.monitoring-logstash-7保留7天
            Delete indices older than 7 days (based on index name), for logstash-
            prefixed indices. Ignore the error if the filter does not result in an
            actionable list of indices (ignore_empty_list) and exit cleanly.
          options:
            ignore_empty_list: True
            disable_action: False
          filters:
          - filtertype: pattern
            kind: regex
            value: '^\.monitoring-es-7|^\.monitoring-logstash-7|^ztn-cmslts-applogs|^ztn-cmschannel-applogs|^zt_sw_all_percentile'
          - filtertype: age
            source: name
            direction: older
            timestring: '%Y.%m.%d'
            unit: days
            unit_count: 7
        6:
          action: delete_indices
          description: >-
            .monitoring-kibana-7保留30天
            Delete indices older than 30 days (based on index name), for logstash-
            prefixed indices. Ignore the error if the filter does not result in an
            actionable list of indices (ignore_empty_list) and exit cleanly.
          options:
            ignore_empty_list: True
            disable_action: False
          filters:
          - filtertype: pattern
            kind: regex
            value: '^\.monitoring-kibana-7'
          - filtertype: age
            source: name
            direction: older
            timestring: '%Y.%m.%d'
            unit: days
            unit_count: 30
      
        7:
          action: delete_indices
          description: >-
            线下日志保留7天
            Delete indices older than 7 days (based on index name), for logstash-
            prefixed indices. Ignore the error if the filter does not result in an
            actionable list of indices (ignore_empty_list) and exit cleanly.
          options:
            ignore_empty_list: True
            disable_action: False
          filters:
          - filtertype: pattern
            kind: regex
            value: '^business-dev-logs|^business-test-logs|^business-test1-logs|^business-hp-logs|^business-pt-logs|^business-sbx-logs|^business-pre-logs|^ztn-monitor-applogs|^fbg-test-logs|^fbg-test1-logs|^fbg-uat-logs|^nginx-error|^fbg-test1-applogs|^fbg-test-applogs|^fbg-uat-applogs|^jaeger-span'
          - filtertype: age
            source: name
            direction: older
            timestring: '%Y.%m.%d'
            unit: days
            unit_count: 7
      EOF
      
    • 测试

      curator --config /opt/elasticsearch-curator/.conf/curator.yml --dry-run /opt/elasticsearch-curator/.conf/actions.yml
      
    • 配置定时任务

      crontab -e
      10 3 * * * /usr/bin/curator --config /opt/elasticsearch-curator/.conf/curator.yml /opt/elasticsearch-curator/.conf/actions.yml
      

十八、中文分词器

所有的ES节点都需要安装
所有的ES都需要重启才能生效
中文分词器的版本号要和ES版本号对应

  • 安装中文分词器

    cd /usr/local/elasticsearch-7.15.2
    bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.15.2/elasticsearch-analysis-ik-7.15.2.zip
    
  • 热更新中文分词库

    yum -y install nginx
    cat >>/usr/share/nginx/html/my_dic.txt <<EOF
    北京
    武汉
    深圳
    中国
    EOF
    
    nginx -t
    nginx -s reload
    
    cat >/usr/local/elasticsearch-7.15.2/config/analysis-ik/IKAnalyzer.cfg.xml <<'EOF'
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
    <properties>
            <comment>IK Analyzer 扩展配置</comment>
            <!--用户可以在这里配置自己的扩展字典 -->
            <entry key="ext_dict"></entry>
             <!--用户可以在这里配置自己的扩展停止词字典-->
            <entry key="ext_stopwords"></entry>
            <!--用户可以在这里配置远程扩展字典 -->
            <entry key="remote_ext_dict">http://10.0.0.51/my_dic.txt</entry>
            <!--用户可以在这里配置远程扩展停止词字典-->
            <!-- <entry key="remote_ext_stopwords">words_location</entry> -->
    </properties>
    EOF
    systemctl restart elasticsearch
    

十九、第三方工具elasticdump备份恢复

  • 安装

    cd /usr/local/src && wget https://registry.npmmirror.com/-/binary/node/v12.16.0/node-v12.16.0-linux-x64.tar.gz
    tar zxf node-v12.16.0-linux-x64.tar.gz -C /usr/local/
    cd .. && mv node-v12.16.0-linux-x64/ node
    chown -R root. /usr/local/node
    cat >> /etc/profile <<'EOF'
    export NODE_HOME="/usr/local/node"
    export PATH="$NODE_HOME/bin:$PATH"
    EOF
    source /etc/profile
    npm install elasticdump -g
    
  • 使用

    官方文档

    • 查看需要迁移的索引

      curl http://localhost:9200/_cat/indices?v=true
      
    • 远程迁移命令

      #远程迁移mapping结构
      elasticdump \
        --input=http://production.es.com:9200/my_index \
        --output=http://staging.es.com:9200/my_index \
        --type=mapping
      
      #远程迁移索引数据
      elasticdump \
        --input=http://production.es.com:9200/my_index \
        --output=http://staging.es.com:9200/my_index \
        --type=data
      
      #远程迁移分词
      elasticdump \
        --input=http://production.es.com:9200/my_index \
        --output=http://staging.es.com:9200/my_index \
        --type=analyzer
      
      #远程认证迁移
      elasticdump \
        --input=http://production.es.com:9200/my_index \
        --output=http://staging.es.com:9200/my_index \
        --httpAuthFile pass.ini \
        --type=data
      
      #远程迁移多个索引
      multielasticdump \
        --direction=dump \
        --match='^.*$' \
        --input=http://production.es.com:9200 \
        --output=/tmp/es_backup
      
      multielasticdump \
        --direction=dump \
        --match='^.*-index$'\
        --input=http://production.es.com:9200 \
        --ignoreType='mapping,settings,template' \
        --output=/tmp/es_backup
      
      multielasticdump \
        --direction=load \
        --input=/tmp/es_backup \
        --output=http://127.0.0.1:9200
      
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容