对于几千万的注册用户,发布的朋友圈的数据是海量的,需要能够搜索,同时也要完成可用性。
对于几千万的注册用户,发布的朋友圈的数据是海量的,需要能够搜索,同时也要完成可用性。第一个要求是大量的朋友圈数据,需要存储到分布式集群中,给出解决方案。另外,在服务器突然宕机的情况,仍然能够保障搜索业务不中断,不少数据。
Elasticsearch的分片是用于水平分割数据的基本单位。当你向Elasticsearch索引文档时,这些文档会被分配到一个或多个分片中。每个分片本质上是一个独立的Lucene索引,它们可以分布在集群的不同节点上。
分片有两种类型:主分片和副本分片。主分片用于存储索引的主要数据,而副本分片则用于提供冗余和容错能力。通过将索引数据分布在多个节点上,Elasticsearch能够实现水平扩展,提高查询性能,并保障数据的可靠性和可用性。
总的来说,分片使得Elasticsearch可以处理大规模的数据并实现分布式存储和查询,从而满足不同规模和需求的应用场景。
Elasticsearch的分片具有以下几个重要作用:
水平扩展性: 通过将数据分散存储在多个分片中,Elasticsearch可以实现水平扩展,从而能够处理大规模的数据和请求。当数据量增长时,可以简单地增加更多节点来扩展集群的能力。
提高性能: 分片允许数据并行处理和查询,从而提高了读取和写入操作的性能。每个分片都可以独立执行搜索请求,这有助于加快查询速度并提升系统的吞吐量。
容错和可靠性: 通过副本分片机制,Elasticsearch可以在集群中的不同节点上保存数据的备份副本。如果某个节点发生故障,系统仍然可以保持可用性,因为副本分片可以被晋升为主分片继续提供服务。
负载均衡: Elasticsearch会自动将新的索引文档分配到集群中的不同分片上,实现负载均衡,避免单个节点负载过重,提高系统的稳定性和性能。
总的来说,分片是Elasticsearch实现分布式存储和处理的关键组成部分,它们为系统提供了扩展性、性能、容错性和负载均衡等重要功能。
在Elasticsearch中,副本是指每个分片的一个或多个备份。副本分片是主分片的复制品,用于提供冗余和高可用性。
副本的作用包括:
容错性: 副本分片可以避免数据丢失。如果主分片所在的节点发生故障,系统可以从副本中选取一个新的主分片,并继续提供服务,而不会丢失数据。
高可用性: 通过副本分片,Elasticsearch可以在多个节点上保存数据的备份。这样,即使某个节点不可用,仍然可以从其他可用的副本分片中获取数据,确保系统的高可用性。
负载均衡: 副本分片可以分摊读取请求的负载。当有多个副本分片时,读取操作可以并行地从不同的副本中获取数据,从而提高读取性能和吞吐量。
扩展性: 副本分片还可以帮助扩展写入操作的能力。当进行索引操作时,数据会首先写入主分片,然后通过复制机制将数据同步到副本分片。这样,多个副本可以同时处理写入操作,提高了写入的并发能力。
需要注意的是,副本分片会占用额外的存储空间和系统资源,并增加了集群的维护成本。因此,在配置副本时需要权衡存储成本、性能需求和可用性要求。
在Spring Boot项目中使用Elasticsearch时,可以通过配置文件或者编程方式来设置Elasticsearch的分片和副本。以下是一种常见的方法:
在Spring Boot的application.properties
或application.yml
配置文件中,可以添加如下配置来指定索引的分片和副本数量:
spring.elasticsearch.rest.indices.shards=3
spring.elasticsearch.rest.indices.replicas=2
这样就设置了每个索引的分片数量为3,副本数量为2。
可以在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);
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的分片和副本数量都可以根据具体需求进行调整,以满足性能、可用性和容错需求。在实际应用中,需要根据数据量、查询负载等因素来合理地配置分片和副本数量。