ElasticSearch集群管理

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: ElasticSearch集群管理

1 集群介绍

  • 集群和分布式:

集群:多个人做一样的事。

分布式:多个人做不一样的事

  • 集群解决的问题:

让系统高可用

分担请求压力

  • 分布式解决的问题:

分担存储和计算的压力,提速

解耦

  • 集群和分布式架构往往是并存的

2 ES集群相关概念

es 集群:

ElasticSearch 天然支持分布式

•ElasticSearch 的设计隐藏了分布式本身的复杂性

ES集群相关概念:

•集群(cluster):一组拥有共同的 cluster name 的 节点。

•节点(node) :集群中的一个 Elasticearch 实例

•索引(index) :es存储数据的地方。相当于关系数据库中的database概念

•分片(shard):索引可以被拆分为不同的部分进行存储,称为分片。在集群环境下,一个索引的不同分片可以拆分到不同的节点中

•主分片(Primary shard):相对于副本分片的定义。

•副本分片(Replica shard)每个主分片可以有一个或者多个副本,数据和主分片一样。

3 集群搭建

参见ElasticSearch 集群-集群搭建.md

4 kibina管理集群

vim  kibana-7.4.0-linux-x86_64-cluster/config/kibana.yml

kibana.yml

#支持中文
i18n.locale: "zh-CN"
#5602避免与之前的冲突
server.port: 5602
server.host: "0.0.0.0"
server.name: "kibana-oldlu-cluster"
elasticsearch.hosts: ["http://localhost:9201","http://localhost:9202","http://localhost:9203"]
elasticsearch.requestTimeout: 99999

5 JavaAPI 访问集群

PUT cluster_test
{
  "mappings": {
    "properties": {
      "name":{
        "type": "text"
      }
    }
  }
}
GET cluster_test
GET cluster_test/_search
POST /cluster_test/_doc/1
{
  "name":"张三"
}

测试类

    @Resource(name="clusterClient")
    RestHighLevelClient clusterClient;
 /**
     * 测试集群
     * @throws IOException
     */
    @Test
    public void testCluster() throws IOException {
        //设置查询的索引、文档
        GetRequest indexRequest=new GetRequest("cluster_test","1");
        GetResponse response = clusterClient.get(indexRequest, RequestOptions.DEFAULT);
        System.out.println(response.getSourceAsString());
    }

ElasticSearchConfig

private String host1;
private int port1;
private String host2;
private int port2;
private String host3;
private int port3;
//get/set ...
@Bean("clusterClient")
    public RestHighLevelClient clusterClient(){
        return new RestHighLevelClient(RestClient.builder(
                new HttpHost(host1,port1,"http"),
                new HttpHost(host2,port2,"http"),
                new HttpHost(host3,port3,"http")
        ));
    }

application.yml

elasticsearch:
   host: 192.168.140.130
   port: 9200
   host1: 192.168.140.130
   port1: 9201
   host2: 192.168.140.130
   port2: 9202
   host3: 192.168.140.130
   port3: 9203

6 分片配置

•在创建索引时,如果不指定分片配置,则默认主分片1,副本分片1。

•在创建索引时,可以通过settings设置分片

分片配置

#分片配置
#"number_of_shards": 3, 主分片数量
#"number_of_replicas": 1  主分片备份数量,每一个主分片有一个备份
# 3个主分片+3个副分片=6个分片
PUT cluster_test1
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1
  }, 
  "mappings": {
    "properties": {
      "name":{
        "type": "text"
      }
    }
  }
}

1.三个节点正常运行(0、1、2分片标号)

2.oldlu-3 挂掉

3.将挂掉节点的分片,自平衡到其他节点

4.oldlu-3 恢复正常后,节点分片将自平衡回去(并不一定是原来的分片)

分片与自平衡

•当节点挂掉后,挂掉的节点分片会自平衡到其他节点中

注意:分片数量一旦确定好,不能修改。

索引分片推荐配置方案:

1.每个分片推荐大小10-30GB

2.分片数量推荐 = 节点数量 * 1~3倍

思考:比如有1000GB数据,应该有多少个分片?多少个节点

1.每个分片20GB 则可以分为40个分片

2.分片数量推荐 = 节点数量 * 1~3倍 --> 40/2=20 即20个节点

7 路由原理

路由原理

•文档存入对应的分片,ES计算分片编号的过程,称为路由。

•Elasticsearch 是怎么知道一个文档应该存放到哪个分片中呢?

•查询时,根据文档id查询文档, Elasticsearch 又该去哪个分片中查询数据呢?


•路由算法 :shard_index = hash(id) % number_of_primary_shards


20210101171142529.png


查询id为5的文档:假如hash(5)=17 ,根据算法17%3=2

查询id为5的文档:假如hash(5)=17 ,根据算法17%3=2

8 脑裂

ElasticSearch 集群正常状态:

• 一个正常es集群中只有一个主节点(Master),主节点负责管理整个集群。如创建或删除索引,跟踪哪些节点是群集的一部分,并决定哪些分片分配给相关的节点。

•集群的所有节点都会选择同一个节点作为主节点。

脑裂现象:

•脑裂问题的出现就是因为从节点在选择主节点上出现分歧导致一个集群出现多个主节点从而使集群分裂,使得集群处于异常状态。

脑裂产生的原因:

1.网络原因:网络延迟

•一般es集群会在内网部署,也可能在外网部署,比如阿里云。

•内网一般不会出现此问题,外网的网络出现问题的可能性大些。

2.节点负载

•主节点的角色既为master又为data。数据访问量较大时,可能会导致Master节点停止响应(假死状态)。

  1. JVM内存回收
    •当Master节点设置的JVM内存较小时,引发JVM的大规模内存回收,造成ES进程失去响应。

避免脑裂

1.网络原因:discovery.zen.ping.timeout 超时时间配置大一点。默认是3S

2.节点负载:角色分离策略

•候选主节点配置为

•node.master: true

•node.data: false

•数据节点配置为

•node.master: false

•node.data: true

3.JVM内存回收:修改 config/jvm.options 文件的 -Xms 和 -Xmx 为服务器的内存一半。

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
目录
相关文章
|
安全 Java 索引
Elasticsearch集群管理之1——如何高效的添加、删除节点?
1、问题抛出 1.1 新增节点问题 我的群集具有黄色运行状况,因为它只有一个节点,因此副本保持未分配状态,我想要添加一个节点,该怎么弄?
817 0
Elasticsearch集群管理之1——如何高效的添加、删除节点?
|
存储 缓存 运维
ElasticSearch大集群管理维护的难题与个推GProxy解决方案
用户搜索组件和日志管理平台是个推推送服务的重要组成部分。ElasticSearch(简称ES)作为一个开源的分布式搜索引擎,能较好地满足上述要求。个推在ES的使用上经过了多年迭代,积累了丰富的经验,特别是在数据量不断增大时,如何管理集群、维护集群稳定、优化集群性能,我们进行了许多实践。 本文将从三部分讲述个推ElasticSearch架构的演变过程:大集群的挑战、GProxy如何支持多集群以及当前运行情况。
2103 0
ElasticSearch大集群管理维护的难题与个推GProxy解决方案
|
云计算 索引
Elasticsearch集群管理之1——如何高效的添加、删除节点?
我的群集具有黄色运行状况,因为它只有一个节点,因此副本保持未分配状态,我想要添加一个节点,该怎么弄?如果假设集群中有5个节点,我必须在运行时删除2个节点。 那么如何在不影响指数的情况下完成?我有接近10 Gbp/hour的连续数据流,这些数据正在连续写入并索引化。 重新平衡会对此有所影响吗?
1973 0
|
API 网络架构 索引
|
1月前
|
NoSQL 关系型数据库 Redis
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
mall在linux环境下的部署(基于Docker容器),docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongodb、minio详细教程,拉取镜像、运行容器
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
|
2月前
|
数据可视化 Docker 容器
一文教会你如何通过Docker安装elasticsearch和kibana 【详细过程+图解】
这篇文章提供了通过Docker安装Elasticsearch和Kibana的详细过程和图解,包括下载镜像、创建和启动容器、处理可能遇到的启动失败情况(如权限不足和配置文件错误)、测试Elasticsearch和Kibana的连接,以及解决空间不足的问题。文章还特别指出了配置文件中空格的重要性以及环境变量中字母大小写的问题。
一文教会你如何通过Docker安装elasticsearch和kibana 【详细过程+图解】
|
2月前
|
JSON 自然语言处理 数据库
Elasticsearch从入门到项目部署 安装 分词器 索引库操作
这篇文章详细介绍了Elasticsearch的基本概念、倒排索引原理、安装部署、IK分词器的使用,以及如何在Elasticsearch中进行索引库的CRUD操作,旨在帮助读者从入门到项目部署全面掌握Elasticsearch的使用。
|
2月前
|
Ubuntu Oracle Java
如何在 Ubuntu VPS 上安装 Elasticsearch
如何在 Ubuntu VPS 上安装 Elasticsearch
22 0
|
2月前
|
存储 Ubuntu Oracle
在Ubuntu 14.04上安装和配置Elasticsearch的方法
在Ubuntu 14.04上安装和配置Elasticsearch的方法
30 0
下一篇
无影云桌面