长达两万字的Elasticsearch分布式集群运维方方面面总结(六)

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
日志服务 SLS,月写入数据量 50GB 1个月
简介: 文章目录Elasticsearch分布式大数据搜索集群1.elasticsearch集群介绍2.elasticsearch集群部署2.1.192.168.81.210主节点配置2.1.1.安装elasticsearch2.1.2.配置node-1主节点2.1.3.访问node-1节点2.2.192.168.81.220从节点配置2.2.1.安装elasticsearch2.2.2.配置node-2节点2.2.3.访问node-2节点2.3.查看集群状态3.elasticsearch集群状态码3.1.green状态3.2.yellow状态3.3.red状态

1.elasticsearch集群介绍

elasticsearch可以横向扩展至数百(甚至数千)的服务器节点,同时可以处理PB级别数据

elasticsearch天生就是分布式的,并且在设计时屏蔽了分布式的复杂性

elasticsearch经肯屏蔽了风不是系统的复杂性

elasticsearch集群的特点:

分配文档到不同的容器或分配中,文档可以存储一个或多个节点

按集群节点来负载均衡这些分配,从而对索引和搜索过程进行负载均衡

复制每个分片以支持数据冗余,从而防止硬件故障导致的数据丢失

将集群中任意节点的请求路由到存有相关数据的节点

集群扩容时无缝整合性节点,重新分配分片以便于从群节点中恢复

一个运行中的elasticsearch实例被称为一个节点,而集群是由一个或多个拥有相同cluster.name配置的节点组成,他们共同承担数据和负载的压力

当有节点加入集群或者从集群中移除节点时,集群将会重新平均分布所有的数据

当一个节点被选举称为主节点时,它将负责管理集群范围内所有的变更,例如增加、删除索引或者增加、删除节点等,而主节点并不需要涉及到文档级别的变更和搜索等操作,所以当集群只拥有一个节点的情况下,即使流量增加它也不会成为瓶颈,任何节点都可以成为主节点,我们的实例集群只有一个节点,所以同时也成为了主节点,也就是谁先部署完并启动了第一个节点,谁就是master

作为用户,我们可以将请求发送到集群中的任何节点,包括主节点,每个节点的数据都是一样的,每个节点都知道任意文档所处的位置,并且能够将我们的请求直接转发到存储我们所需文档的节点,无论我们将请求发送到那个节点,它都能负责从各个包含我们所需文档节点进行收集,并将数据结果返回给客户端

文档doc就是索引中的一条数据

es集群搭建完后将不在往elasticsearch.log中写日志,而是在集群名.log中写日志

image.png

2.elasticsearch集群部署

2.1.192.168.81.210主节点配置

集群配置文件含义


cluster.name: es-application #集群名称,要求唯一

node.name: node-1 #节点名称

path.data: /data/elasticsearch #数据存储路径

path.logs: /var/log/elasticsearch #日志路径

network.host: 192.168.81.210,127.0.0.1 #对外暴露的地址

http.port: 9200 #端口号

discovery.zen.ping.unicast.hosts: [“192.168.81.210”, “192.168.81.220”] #主节点要配置上集群各节点ip地址,从节点配置的时候只写上主节点的ip和自己节点的ip即可

discovery.zen.minimum_master_nodes: 1 #允许master的数量

http.cors.enabled: true

http.cors.allow-origin: “*”

2.1.1.安装elasticsearch

所有节点都要安装

1.准备Java环境
yum -y install java
java -version
2.下载elasticsearch rpm包
mkdir soft
cd soft
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.6.0.rpm
3.安装elasticsearch
yum -y localinstall elasticsearch-6.6.0.rpm
4.启动elasticsearch
systemctl daemon-reload 
systemctl start elasticsearch
systemctl enable elasticsearch

2.1.2.配置node-1主节点

1.修改主配置文件
[root@elasticsearch ~]# vim /etc/elasticsearch/elasticsearch.yml 
cluster.name: es-application
node.name: node-1
path.data: /data/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 192.168.81.210,127.0.0.1
http.port: 9200
discovery.zen.ping.unicast.hosts: ["192.168.81.210", "192.168.81.220"]
discovery.zen.minimum_master_nodes: 1
http.cors.enabled: true
http.cors.allow-origin: "*"
2.重启
[root@elaticsearch ~]# systemctl restart elasticsearch

2.1.3.访问node-1节点

访问:http://192.168.81.210:9200

2.2.192.168.81.220从节点配置

2.2.1.安装elasticsearch

1.准备Java环境
[root@node-2 ~]# yum -y install java
[root@node-2 ~]# java -version
openjdk version "1.8.0_262"
OpenJDK Runtime Environment (build 1.8.0_262-b10)
OpenJDK 64-Bit Server VM (build 25.262-b10, mixed mode)
2.下载elasticsearch rpm包
[root@node-2 ~]# mkdir soft
[root@node-2 ~]# cd soft
[root@node-2 soft]# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.6.0.rpm
[root@elasticsearch soft]# ll -h
-rw-r--r--. 1 root root 109M 11月 15 08:58 elasticsearch-6.6.0.rpm
3.安装elasticsearch
[root@node-2 soft]# yum -y localinstall elasticsearch-6.6.0.rpm
4.启动elasticsearch
[root@node-2 soft]# systemctl daemon-reload 
[root@node-2 soft]# systemctl start elasticsearch
[root@node-2 soft]# systemctl enable elasticsearch

2.2.2.配置node-2节点

1.修改配置文件
[root@node-2 ~]# vim /etc/elasticsearch/elasticsearch.yml 
cluster.name: es-application
node.name: node-2
path.data: /data/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 192.168.81.220,127.0.0.1 
http.port: 9200
discovery.zen.ping.unicast.hosts: ["192.168.81.210", "192.168.81.220"]
discovery.zen.minimum_master_nodes: 1
http.cors.enabled: true
http.cors.allow-origin: "*"
2.重启
[root@node-2 ~]# systemctl restart elasticsearch

2.2.3.访问node-2节点

访问:http://192.168.81.220:9200

2.3.查看集群状态

在es-head插件中连接任意es节点都能看到数据则表示集群搭建成功

集群状态为绿色的要求:最少一个集群节点,且主分片和副本分片都正常,没有数据丢失

星号表示主节点、圆圈表示副本节点

索引分片全绿表示数据无丢失

3.elasticsearch集群状态码

集群状态最低要求:至少一个副本五个分片

副本的数量是可以控制的,每次创建索引的时候可以指定拥有几个副本分片,如果超出了当前节点数,则会变灰

3.1.green状态

要想达到green状态需要满足的条件:所有索引数据都存在,副本满足条件、所有的数据都完整

一条数据会分布在所有分片中,假如一个数据本来应该是五个分片,但是只在其中三个分片中有数据,则表示数据不完整,集群状态就达不到green状态

由于是是刚搭建好的集群,之前单台节点的时候也做过索引,因此主分片都会在一个节点上,后面创建的所有将会分布在所有节点上,提供冗余,当系统负载小的时候在一定时间内,它也会重新分片

3.2.yellow状态

yellow的状态:所有索引数据完整,但是副本不满足条件,yellow状态常常是刚刚搭建起一个elasticsearch节点,这时没有副本分片,因此会处于yellow状态

我们可以停掉一个node节点查看 效果

停止任意一个node节点的命令systemctl stop elasticsearch

3.3.red状态

red状态:数据不完整,有点所以数据丢失

elasticsearch中会有多个索引,其中一个索引数据有丢失不会影响整个集群其他索引的使用,只是单单某一个有问题,这时集群的状态也会显示为red状态

red状态示意图,其中一个副本的数据有问题

3.4.索引分片处于黄色状态

处于黄色状态表示正在同步数据,当数据同步完会变成绿色

刚起来的node节点它是没有数据的,因此需要从主节点进行同步数据,新增一个node节点都会从主节点去同步数据,最后同步完就变成了绿色

4.elasticsearch集群操作

集群的任意操作命令都可以在任意node节点去执行,因为数据都是同步的

curl命令中的GET一般都是获取某些信息,PUT是提交某些信息

在elasticsearch交互模式中只能使用GET、DELETE、HEAD、PUT

集群操作指令帮助文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-node-info.html

4.1.查看集群状态

[root@elasticsearch ~]# curl -XGET 'http://localhost:9200/_cluster/health?pretty'
{
  "cluster_name" : "es-application",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 2,
  "number_of_data_nodes" : 2,
  "active_primary_shards" : 10,
  "active_shards" : 20,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 0,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 100.0
}

4.2.查看集群所有信息

输出的信息超级多,包含了集群的节点信息、索引信息

[root@elasticsearch ~]# curl -XGET 'http://localhost:9200/_cluster/stats?human&pretty'
{
  "_nodes" : {
    "total" : 2,          #node节点的数量
    "successful" : 2,         #成功的几个
    "failed" : 0          #失败的几个
  },
  "cluster_name" : "es-application",
  "cluster_uuid" : "z4wKY7WiQaa6ZkcmW8lTtA",
  "timestamp" : 1609636910311,
  "status" : "green",       #集群的状态码
  "indices" : {
    "count" : 2,
    "shards" : {
      "total" : 20,
      "primaries" : 10,
      "replication" : 1.0,
      "index" : {
        "shards" : {
          "min" : 10,
          "max" : 10,
          "avg" : 10.0
        },
        "primaries" : {
          "min" : 5,
          "max" : 5,
          "avg" : 5.0
        },
        "replication" : {
          "min" : 1.0,
          "max" : 1.0,
          "avg" : 1.0
        }
      }
    },
    "docs" : {
      "count" : 8,            #所有索引的文档总数
      "deleted" : 0
    },
    "store" : {
      "size" : "89.9kb",          #所有索引总大小
      "size_in_bytes" : 92094
    },
    "fielddata" : {
      "memory_size" : "1.3kb",
      "memory_size_in_bytes" : 1396,
      "evictions" : 0
    },
    "query_cache" : {
      "memory_size" : "0b",
      "memory_size_in_bytes" : 0,
      "total_count" : 0,
      "hit_count" : 0,
      "miss_count" : 0,
      "cache_size" : 0,
      "cache_count" : 0,
      "evictions" : 0
    },
    "completion" : {
      "size" : "0b",
      "size_in_bytes" : 0
    },
    "segments" : {
      "count" : 16,
      "memory" : "43.9kb",
      "memory_in_bytes" : 44992,
      "terms_memory" : "32.6kb",
      "terms_memory_in_bytes" : 33424,
      "stored_fields_memory" : "4.8kb",
      "stored_fields_memory_in_bytes" : 4992,
      "term_vectors_memory" : "0b",
      "term_vectors_memory_in_bytes" : 0,
      "norms_memory" : "4kb",
      "norms_memory_in_bytes" : 4096,
      "points_memory" : "32b",
      "points_memory_in_bytes" : 32,
      "doc_values_memory" : "2.3kb",
      "doc_values_memory_in_bytes" : 2448,
      "index_writer_memory" : "0b",
      "index_writer_memory_in_bytes" : 0,
      "version_map_memory" : "0b",
      "version_map_memory_in_bytes" : 0,
      "fixed_bit_set" : "0b",
      "fixed_bit_set_memory_in_bytes" : 0,
      "max_unsafe_auto_id_timestamp" : -1,
      "file_sizes" : { }
    }
  },
  "nodes" : {
    "count" : {
      "total" : 2,
      "data" : 2,
      "coordinating_only" : 0,
      "master" : 2,
      "ingest" : 2
    },
    "versions" : [
      "6.6.0"
    ],
    "os" : {
      "available_processors" : 2,
      "allocated_processors" : 2,
      "names" : [
        {
          "name" : "Linux",
          "count" : 2
        }
      ],
      "pretty_names" : [
        {
          "pretty_name" : "CentOS Linux 7 (Core)",
          "count" : 2
        }
      ],
      "mem" : {
        "total" : "3.5gb",
        "total_in_bytes" : 3815882752,
        "free" : "144.8mb",
        "free_in_bytes" : 151838720,
        "used" : "3.4gb",
        "used_in_bytes" : 3664044032,
        "free_percent" : 4,
        "used_percent" : 96
      }
    },
    "process" : {
      "cpu" : {
        "percent" : 0
      },
      "open_file_descriptors" : {
        "min" : 291,
        "max" : 301,
        "avg" : 296
      }
    },
    "jvm" : {
      "max_uptime" : "2.2h",
      "max_uptime_in_millis" : 7944670,
      "versions" : [
        {
          "version" : "1.8.0_275",
          "vm_name" : "OpenJDK 64-Bit Server VM",
          "vm_version" : "25.275-b01",
          "vm_vendor" : "Red Hat, Inc.",
          "count" : 2
        }
      ],
      "mem" : {
        "heap_used" : "307.9mb",
        "heap_used_in_bytes" : 322941368,
        "heap_max" : "1.4gb",
        "heap_max_in_bytes" : 1593180160
      },
      "threads" : 67
    },
    "fs" : {
      "total" : "93.9gb",
      "total_in_bytes" : 100865679360,
      "free" : "82.7gb",
      "free_in_bytes" : 88830054400,
      "available" : "82.7gb",
      "available_in_bytes" : 88830054400
    },
    "plugins" : [ ],
    "network_types" : {
      "transport_types" : {
        "security4" : 2
      },
      "http_types" : {
        "security4" : 2
      }
    }
  }
}

4.3.查看集群节点信息

[root@elasticsearch ~]# curl -XGET 'http://localhost:9200/_cat/nodes?human&pretty'
192.168.81.210 21 96 0 0.00 0.01 0.05 mdi * node-1
192.168.81.220 15 96 0 0.00 0.01 0.05 mdi - node-2
第一列显示集群节点的ip
倒数第二列显示集群节点的类型,*表示主节点,-表示工作节点,主节点也属于工作节点,只是多了一个调度的作用

4.4.查看集群jvm信息

这个输出信息属实有点长

会输出jvm的版本、内存设置的大小、调优参数

[root@elasticsearch ~]# curl -XGET 'http://localhost:9200/_nodes/_all/info/jvm,process?human&pretty'

4.5.在集群中创建一个索引观察分片

[root@elasticsearch ~]# curl -XPUT 'http://localhost:9200/index1?pretty'
{
  "acknowledged" : true,
  "shards_acknowledged" : true,
  "index" : "index1"
}

创建完后打开head插件,可以看到:集群创建完之后再次创建的索引主分片和副本分片都会分散存放在不同的节点上,不再是主分片在一台机器,副本分片在一台机器

4.6.在集群中创建索引指定分片数量

[root@elasticsearch ~]# curl -XPUT 'http://localhost:9200/index2?pretty' -H 'Content-Type: application/json' -d '
{
"settings": {
  "number_of_shards":3,         #指定分片数量
  "number_of_replicas": 1         #指定副本数量
}
}'
{
  "acknowledged" : true,
  "shards_acknowledged" : true,
  "index" : "index2"
}

主要用到两个参数"number_of_shards"指定分片数量,"number_of_replicas"指定副本数量

创建完成后可以在elasticsearch-head中明显看到刚刚创建的索引只有3个分片,1个副本

4.7.修改索引的副本数

[root@elasticsearch ~]# curl -XPUT 'http://localhost:9200/index2/_settings?pretty' -H 'Content-Type: application/json' -d '
{
 "settings" : {
  "number_of_replicas" : 2
}
}'
{
  "acknowledged" : true
}

调整为副本可以看到有一个副本变灰了,是由于我们没有那么多集群节点导致的,一个副本相当于一个机器,俩副本相当于3个节点,我们没有那么多节点因此就会变灰

可以看到当有一个索引的副本数有问题时,集群的状态就会变黄,但是其他的索引不会影响使用

5.增加一个elasticsearch节点解决副本数问题

现在的环境image.png

5.1.增加一个节点

5.1.1.安装elasticsearch

1.准备Java环境
[root@node-3 ~]# yum -y install java
java -version
2.下载elasticsearch rpm包
[root@node-3 ~]# mkdir soft
[root@node-3 ~]# cd soft
[root@node-3 ~]# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.6.0.rpm
3.安装elasticsearch
[root@node-3 ~]# yum -y localinstall elasticsearch-6.6.0.rpm
4.启动elasticsearch
[root@node-3 ~]# systemctl daemon-reload 
[root@node-3 ~]# systemctl start elasticsearch
[root@node-3 ~]# systemctl enable elasticsearch

5.1.2.修改主节点配置增加node-3节点

主节点要在discovery.zen.ping.unicast.hosts配置node-3节点的ip地址,主节点在这个参数中填写集群中所有node节点的地址,而node节点只需要填写一个主节点ip和自身ip即可

[root@elasticsearch ~]# vim /etc/elasticsearch/elasticsearch.yml 
discovery.zen.ping.unicast.hosts: ["192.168.81.210", "192.168.81.220","192.168.81.70"]

5.1.3.配置node-3节点的elasticsearch

1.修改主配置文件
[root@node-3 ~]# vim /etc/elasticsearch/elasticsearch.yml
cluster.name: es-application
node.name: node-3
path.data: /data/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 192.168.81.70,127.0.0.1
http.port: 9200
discovery.zen.ping.unicast.hosts: ["192.168.81.210", "192.168.81.70"]
discovery.zen.minimum_master_nodes: 1
http.cors.enabled: true
http.cors.allow-origin: "*"
2.增加以下配置防止bootstrap报错
[root@node-3 ~]# mkdir /etc/systemd/system/elasticsearch.service.d
[root@node-3 ~]# vim /etc/systemd/system/elasticsearch.service.d/override.conf
[Service]
LimitMEMLOCK=infinity
3.重启
[root@node-3 ~]# systemctl restart elasticsearch

5.1.4.查看日志

node加入集群后不再使用elasticsearch.log记录日志而是使用集群名.log进行记录日志

node已经成功加入集群

[root@node-3 ~]# tail -f /var/log/elasticsearch/es-application.log 

5.2.head插件查看集群状态

在插件中可以看到index2的索引已经达到我们再4.7中指定的副本数量,集群状态也变成了绿色,当副本数的数量是集群总数减去主节点的数量时,副本分片的分布就是特别整齐的,每个节点上都有分片,看起来不会空

篮框中的索引因为只有一个副本分片,而node节点有3个,副本分片会随机分配在不同的node,因此会看起来比较空缺,默认创建的索引就是1个副本,5个分片

副本也就是相当于备份,副本分片永远都是细框

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
目录
相关文章
|
2月前
|
存储 负载均衡 Java
Elasticsearch集群面试系列文章一
【9月更文挑战第9天】Elasticsearch(简称ES)是一种基于Lucene构建的分布式搜索和分析引擎,广泛用于全文搜索、结构化搜索、分析以及日志实时分析等场景。
105 7
|
2月前
|
存储 JSON 数据库
Elasticsearch 分布式架构解析
【9月更文第2天】Elasticsearch 是一个分布式的搜索和分析引擎,以其高可扩展性和实时性著称。它基于 Lucene 开发,但提供了更高级别的抽象,使得开发者能够轻松地构建复杂的搜索应用。本文将深入探讨 Elasticsearch 的分布式存储和检索机制,解释其背后的原理及其优势。
190 5
|
7天前
|
存储 监控 安全
Elasticsearch 集群
【11月更文挑战第3天】
83 54
|
3天前
|
监控 API 索引
Elasticsearch集群健康检查
【11月更文挑战第4天】
16 3
|
8天前
|
存储 索引
Elasticsearch分布式架构
【11月更文挑战第2天】
15 1
|
20天前
|
存储 分布式计算 负载均衡
分布式计算模型和集群计算模型的区别
【10月更文挑战第18天】分布式计算模型和集群计算模型各有特点和优势,在实际应用中需要根据具体的需求和条件选择合适的计算架构模式,以达到最佳的计算效果和性能。
44 2
|
1月前
|
存储 缓存 监控
深入解析:Elasticsearch集群性能调优策略与最佳实践
【10月更文挑战第8天】Elasticsearch 是一个分布式的、基于 RESTful 风格的搜索和数据分析引擎,它能够快速地存储、搜索和分析大量数据。随着企业对实时数据处理需求的增长,Elasticsearch 被广泛应用于日志分析、全文搜索、安全信息和事件管理(SIEM)等领域。然而,为了确保 Elasticsearch 集群能够高效运行并满足业务需求,需要进行一系列的性能调优工作。
78 3
|
1月前
|
SQL 分布式计算 NoSQL
大数据-170 Elasticsearch 云服务器三节点集群搭建 测试运行
大数据-170 Elasticsearch 云服务器三节点集群搭建 测试运行
41 4
|
2月前
|
自然语言处理 搜索推荐 数据库
高性能分布式搜索引擎Elasticsearch详解
高性能分布式搜索引擎Elasticsearch详解
84 4
高性能分布式搜索引擎Elasticsearch详解
|
16天前
|
存储 监控 大数据
构建高可用性ClickHouse集群:从单节点到分布式
【10月更文挑战第26天】随着业务的不断增长,单一的数据存储解决方案可能无法满足日益增加的数据处理需求。在大数据时代,数据库的性能、可扩展性和稳定性成为企业关注的重点。ClickHouse 是一个用于联机分析处理(OLAP)的列式数据库管理系统(DBMS),以其卓越的查询性能和高吞吐量而闻名。本文将从我的个人角度出发,分享如何将单节点 ClickHouse 扩展为高可用性的分布式集群,以提升系统的稳定性和可靠性。
43 0