博主
258
258
258
258
专辑

第十八节 ES聚合查询-es的分片和副本的作用跟理解

亮子 2024-03-05 01:58:02 8765 0 0 0

第10单元-ES聚合查询-04-es的分片和副本的作用跟理解

项目需求:

对于几千万的注册用户,发布的朋友圈的数据是海量的,需要能够搜索,同时也要完成可用性。

需求描述:

对于几千万的注册用户,发布的朋友圈的数据是海量的,需要能够搜索,同时也要完成可用性。第一个要求是大量的朋友圈数据,需要存储到分布式集群中,给出解决方案。另外,在服务器突然宕机的情况,仍然能够保障搜索业务不中断,不少数据。


1、什么是ES的分片

Elasticsearch的分片是用于水平分割数据的基本单位。当你向Elasticsearch索引文档时,这些文档会被分配到一个或多个分片中。每个分片本质上是一个独立的Lucene索引,它们可以分布在集群的不同节点上。

分片有两种类型:主分片和副本分片。主分片用于存储索引的主要数据,而副本分片则用于提供冗余和容错能力。通过将索引数据分布在多个节点上,Elasticsearch能够实现水平扩展,提高查询性能,并保障数据的可靠性和可用性。

总的来说,分片使得Elasticsearch可以处理大规模的数据并实现分布式存储和查询,从而满足不同规模和需求的应用场景。

2、ES的分片有什么作业

Elasticsearch的分片具有以下几个重要作用:

  1. 水平扩展性: 通过将数据分散存储在多个分片中,Elasticsearch可以实现水平扩展,从而能够处理大规模的数据和请求。当数据量增长时,可以简单地增加更多节点来扩展集群的能力。

  2. 提高性能: 分片允许数据并行处理和查询,从而提高了读取和写入操作的性能。每个分片都可以独立执行搜索请求,这有助于加快查询速度并提升系统的吞吐量。

  3. 容错和可靠性: 通过副本分片机制,Elasticsearch可以在集群中的不同节点上保存数据的备份副本。如果某个节点发生故障,系统仍然可以保持可用性,因为副本分片可以被晋升为主分片继续提供服务。

  4. 负载均衡: Elasticsearch会自动将新的索引文档分配到集群中的不同分片上,实现负载均衡,避免单个节点负载过重,提高系统的稳定性和性能。

总的来说,分片是Elasticsearch实现分布式存储和处理的关键组成部分,它们为系统提供了扩展性、性能、容错性和负载均衡等重要功能。

3、什么是ES的副本

在Elasticsearch中,副本是指每个分片的一个或多个备份。副本分片是主分片的复制品,用于提供冗余和高可用性。

副本的作用包括:

  1. 容错性: 副本分片可以避免数据丢失。如果主分片所在的节点发生故障,系统可以从副本中选取一个新的主分片,并继续提供服务,而不会丢失数据。

  2. 高可用性: 通过副本分片,Elasticsearch可以在多个节点上保存数据的备份。这样,即使某个节点不可用,仍然可以从其他可用的副本分片中获取数据,确保系统的高可用性。

  3. 负载均衡: 副本分片可以分摊读取请求的负载。当有多个副本分片时,读取操作可以并行地从不同的副本中获取数据,从而提高读取性能和吞吐量。

  4. 扩展性: 副本分片还可以帮助扩展写入操作的能力。当进行索引操作时,数据会首先写入主分片,然后通过复制机制将数据同步到副本分片。这样,多个副本可以同时处理写入操作,提高了写入的并发能力。

需要注意的是,副本分片会占用额外的存储空间和系统资源,并增加了集群的维护成本。因此,在配置副本时需要权衡存储成本、性能需求和可用性要求。

4、在SpringBoot项目中如何设置ElasticSearch的副本和分片

在Spring Boot项目中使用Elasticsearch时,可以通过配置文件或者编程方式来设置Elasticsearch的分片和副本。以下是一种常见的方法:

  1. 通过配置文件设置:

在Spring Boot的application.propertiesapplication.yml配置文件中,可以添加如下配置来指定索引的分片和副本数量:

spring.elasticsearch.rest.indices.shards=3
spring.elasticsearch.rest.indices.replicas=2

这样就设置了每个索引的分片数量为3,副本数量为2。

  1. 通过编程方式设置:

可以在Elasticsearch的Java客户端代码中通过API来设置索引的分片和副本数量。以下是一个示例代码:

RestHighLevelClient client = new RestHighLevelClient(
    RestClient.builder(new HttpHost("localhost", 9200, "http"))
);

CreateIndexRequest request = new CreateIndexRequest("my_index");
request.settings(Settings.builder()
    .put("index.number_of_shards", 3)
    .put("index.number_of_replicas", 2)
);

client.indices().create(request, RequestOptions.DEFAULT);
  1. 通过SpringData的实体类
package com.bwie.vo;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.DateFormat;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;

import java.io.Serializable;
import java.util.Date;

/**
 * @author 军哥
 * @version 1.0
 * @description: TODO
 * @date 2024/3/7 14:05
 */

@Data
@Document(indexName = "tb_user_info", shards = 3, replicas = 2)
public class TbUserInfoVo implements Serializable {

    @Id
    @Field(type = FieldType.Integer)
    private Integer id;

    @Field(type = FieldType.Text, analyzer = "ik_max_word")
    private String userName;

    @Field(type = FieldType.Keyword)
    private String userRole;

    @Field(type = FieldType.Text, analyzer = "ik_max_word")
    private String nickName;

    // 只存储,不检索
    @Field(type = FieldType.Keyword, index = false)
    private String avatar;

    @Field(type = FieldType.Integer)
    private Integer age;

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;
}

以上代码示例中,创建了一个名为“my_index”的索引,并设置了分片数量为3,副本数量为2。

无论是通过配置文件还是编程方式,设置Elasticsearch的分片和副本数量都可以根据具体需求进行调整,以满足性能、可用性和容错需求。在实际应用中,需要根据数据量、查询负载等因素来合理地配置分片和副本数量。