ES集群搭建

一、es的集群类型

  • 根据集群针对的目标差异,可分为三种:

    • 高可用群集 (High Availability Cluster):高可用(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间。如果系统每运行100个时间单位,会有1个时间单位无法提供服务,我们说系统的可用性是99%。提高应用系统的可靠性、尽可能地减少中断时间为目标,确保服务的连续性,达到高可用(HA) 的容错效果。HA的工作方式包括双工和主从两种模式,双工即所有节点同时在线;主从则只有主节点在线,但当出现故障时从节点能自动切换为主节点。例如:“故障切换”、“双机热备” 等。

    • 负载均衡群集(Load Balance Cluster):将流量均衡的分布在不同的节点上,每个节点都可以处理一部分负载,并且可以在节点之间动态分配负载,以实现平衡。主要目的提高应用系统的响应能力、尽可能处理更多的访问请求、减少延迟为目标,获得高并发、高负载(LB)的整体性能。

    • 高性能群集(High Performance Computer Cluster):以提高应用系统的CPU运算速度、扩展硬件资源和分析能力为目标,获得相当于大型、超级计算机的高性能运算(HPC)能力。高性能依赖于"分布式运算”、“并行计算” , 通过专用硬件和软件将多个服务器的CPU、内存等资源整合在一起,实现只有大型、超级计算机才具备的计算能力。例如,“云计算”、“网格计算”等

二、es集群的发现机制

  • 共3个作用

    • 1、集群中的节点相互发现组成集群

      2、负责es集群master的选举

      3、Ping

  • Ping :这是一个节点使用发现机制去寻找其他节点的进程。同时支持多播和单播方式的发现(也可以组合使用)

    • 广播

    • 单播

  • 也可以同时使用两者,但默认的是广播,单播需要已知节点列表来完成(在elasticsearch.yml配置文件中配置discovery.zen.ping.unicast.hosts 参数,见下面-单播方式,为空列表即表示为广播方式)

2.1 广播方式

  • 当es实例启动的时候,它发送了广播的ping请求到地址224.2.2.4:54328。而其他的es实例使用同样的集群名称响应了这个请求。

  • 一般这个默认的集群名称就是上面的cluster_name对应的elasticsearch。通常而言,广播是个很好地方式。想象一下,广播发现就像你大吼一声:别说话了,再说话我就发红包了!然后所有听见的纷纷响应你。
    但是,广播也有不好之处,过程不可控。

2.2 单播方式

  • 当节点的ip(想象一下我们的ip地址是不是一直在变)不经常变化的时候,或者es只连接特定的节点。单播发现是个很理想的模式。使用单播时,我们告诉es集群其他节点的ip及(可选的)端口及端口范围。我们在elasticsearch.yml配置文件中设置:
discovery.zen.ping.unicast.hosts: ["10.0.0.1", "10.0.0.3:9300", "10.0.0.6[9300-9400]"]
  • 大家就像交换微信名片一样,相互传传就加群了.....

  • 一般的,我们没必要关闭单播发现,如果你需要广播发现的话,配置文件中的列表保持空白即可。

三、es的集群搭建

  • 注意:ES需要使用非root用户来启动

  • 下面介绍单播方式的集群搭建

    • 单服务器上进行集群搭建(不推荐,在生产环境中,建议每个服务器只运行一个 Elasticsearch 节点)
    • 不同服务器进行集群搭建

3.1 集群搭建要注意的问题

  • 共有3点需要注意的地方
    • 索引分片数量的设置
    • 脑裂问题
    • 跨域问题

3.1.1 索引分片介绍

  • 其实只要把前面一篇文章 Elasticsearch的诞生 读下来,就能很好理解es的分片和集群处理请求时的逻辑,以及集群直接的通信逻辑了

  • 提到分片就不得不说说es的物理设计了。es中,每个索引被默认分为5个主分片,进行数据的存储(需要注意的是es7.0开始,默认主分片设置成1,解决了over-sharding即分片过度的问题),而每个主分片又有一个副本(replica shard,又称复制分片或副本分片)。每个文档数据存储在哪个分片是根据路由运算公式 has(_routing)%number_of_primary_shards 指定,使数据均匀分布在集群当中

  • 主分片和副本分片的联系

    • 主分片Primary shard:用于解决数据水平扩展的问题,通过主分片,可以将数据分布到集群内的所有节点之上,将一份索引数据划分为多小份的能力,允许水平分割和扩展容量。多个分片可以响应请求,提高性能和吞吐量。一个节点(Node)一般会管理多个分片,分片有两种,主分片和副本分片分片
    • 副本分片Replica shard:副本分片只是一个主分片的拷贝。 副本分片作为硬件故障时保护数据不丢失的冗余备份,从而提高整个集群的容错性,并为搜索和返回文档等读操作提供服务,且需要注意的是副本分片不能与主分片在同一个节点。。一般来说,Elasticsearch 会尽量把一个索引的不同分片存储在不同的主机上,分片的副本也尽可能存在不同的主机上,这样可以提高容错率,从而提高高可用性
    • 一个Index数据在物理上被分布在多个主分片中,每个主分片只存放部分数据,每个主分片可以有多个副本
    • 主分片的作用是对索引的扩容,使一个索引的容量可以突破单机的限制。
    • 副本分片是对数据的保护,每个主分片对应一个或多个副本分片,当主分片所在节点宕机时,副本分片会被提升为对应的主分片使用。
    • 一个主分片和它的副本分片,不会分配到同一个节点上
    • 一个分片就是一个Lucene实例,并且它本身就是一个完整的搜索引擎。应用程序不会和它直接通信。
    • 注意:当索引创建完成的时候,主分片的数量就固定了,如果要修改需要重建索引,代价很高,如果要修改则需Reindex(重建索引),但是副本分片的数量可以随时调整

3.1.1.1 索引分片的设置

  • 对于生产环境中分片的设定,需要提前做好容量规划,主分片数是在索引创建的时候预先设定,事后无法修改(注意:除非reindex操作,分片数是不可以修改的。)
    • 分片数设置过小
      • 导致后续无法增加节点实现水平扩展
      • 单个分片的数据量太大,导致数据重新分配耗时
    • 分片数设置过大
      • 影响搜索结果的相关性打分,影响统计结果的准确性
      • 单个节点上过多的分片,会导致资源浪费,同时也会影响性能
  • 综上:
    • 建议每个分片大小不要超过30GB。
    • 单个索引分片数=数据量÷30g
      每个节点建议的单个索引分片数<3:因为分片分布在同一个服务器上。请求开始竞争相同的硬件资源时, 性能便会逐步下降。
      如果该索引分片数过多可以考虑业务需求是否需要分割索引。周表,天表,月表等划分。
    • 副本分片设置:除非你对系统的健壮性有异常高的要求,比如:银行系统。可以考虑2个副本以上。否则,1个副本足够(副本数是可以通过配置随时修改的)

3.1.1.2 reindex操作

  • Reindex是Elasticsearch中一个非常有用的操作,它可以用来复制或者迁移数据从一个索引到另一个索引。在Elasticsearch中,reindex操作可以通过使用_reindex API来完成。
  • 以下是一个使用Python和Elasticsearch客户端执行reindex操作的例子
from datetime import datetime
from elasticsearch import Elasticsearch, helpers
 
# 初始化Elasticsearch客户端
es = Elasticsearch("http://localhost:9200")
 
# 定义源索引和目标索引
source_index = "old_index"
target_index = "new_index"
 
# 使用helpers.reindex方法进行reindex操作
success = helpers.reindex(es, source_index=source_index, target_index=target_index)
 
# 打印结果
print(f"Reindex operation completed: {success['created']} documents created, {success['updated']} documents updated, {success['deleted']} documents deleted, {success['noop']} no-op updates, {success['failures']} failures.")

3.1.2 脑裂问题

3.1.2.1 什么是脑裂

  • 选取主节点:无论是广播发现还是到单播发现,一旦集群中的节点发生变化,它们就会协商谁将成为主节点,elasticsearch认为所有节点都有资格成为主节点。如果集群中只有一个节点,那么该节点首先会等一段时间,如果还是没有发现其他节点,就会任命自己为主节点。

  • 脑裂这个词描述的是这样的一个场景:(通常是在重负荷或网络存在问题时)elasticsearch集群中一个或者多个节点失去和主节点的通信,然后各节点就开始选举新的主节点,继续处理请求。这个时候,可能会同时有多个候选节点都成为了主节点,然后就会有多个不同的集群在同时运行着,这一现象就是脑裂。因为单一集群被分成了多个部分。为了防止这种情况的发生,我们就需要设置集群节点的总数,规则就是有候选资格节点总数整除以2再加一(半数以上)。这样,当一个或者多个节点失去通信,小老弟们就无法选举出新的主节点来形成新的集群。因为这些小老弟们无法满足设置的规则数量

  • 如何避免脑裂

    • 为了防止脑裂,我们必须对该集群设置参数:

    • discovery.zen.minimum_master_nodes: quorum的值
      quorum的算法=集群中master候选节点数量/2+1
      # 这个参数(默认为1),它的作用是:让每个符合主资格的节点都知道为了形成集群必须可见的符合主资格的节点的最小数目
      
      """
      分析原理:
      discovery.zen.minimum_master_node = 1 时:
      假设你有一个由两个主资格节点组成的集群。网络故障会中断这两个节点之间的通信。每个节点都会看到一个主资格节,也就是其本身。当minimum_master_nodes设置为默认值 1 时,这就足以形成集群。每个节点选择自己作为新的主节点(认为另一个符合主节点条件的节点已经死了),结果就是形成两个仅有一个节点的集群,或者说是脑裂(split brain)。只有重新启动一个节点后,这两个节点才会重新连接。已写入重新启动节点的任何数据都将丢失。
      
      discovery.zen.minimum_master_node 正确设置时:
      假设当前有一个5个节点组成的集群,其中有候选主节点资格的节点为5个:
      discovery.zen.minimum_master_node = 3  # 3 = 5 // 2 + 1
      之前原集群的主节点是node1,由于网络和负荷等原因,原集群被分为了两个部分:一部分是node1 、node2,一部分是node3、node4、node5。因为minimum_master_nodes参数是3,所以node3、node4、node5可以组成集群,并且选举出了主节点node3。而node1、node2节点因为不满足minimum_master_nodes条件而无法选举,只能一直寻求加入集群(还记得单播列表吗?),要么网络和负荷恢复正常后加入node3、node4、node5组成的集群中,要么就是一直处于寻找集群状态,这样就防止了集群的脑裂问题
      """
      
  • 那么,主节点是如何知道某个节点还活着呢?这就要说到下面的错误识别

3.1.2.2 错误识别

  • 其实错误识别,就是当主节点被确定后,建立起内部的ping机制来确保每个节点在集群中保持活跃和健康,这就是错误识别。
    主节点ping集群中的其他节点,而且每个节点也会ping主节点来确认主节点还活着,如果没有响应,则宣布该节点失联。想象一下,老大要时不常的看看(循环)小弟们是否还活着,而小老弟们也要时不常的看看老大还在不在,不在了就赶紧再选举一个出来!

  • 但是,怎么看?多久没联系算是失联?这些细节都是可以设置的,不是一拍脑门子,就说某个小老弟挂了!在配置文件中,可以设置:

    • discovery.zen.fd.ping_interval: 8
      discovery.zen.fd.ping_timeout: 30
      discovery_zen.fd.ping_retries: 3
      
      """
      参数分析:
      每个节点每隔 discovery.zen.fd.ping_interval 的时间(默认1秒)发送一个ping请求,等待discovery.zen.fd.ping_timeout 的时间(默认30秒),并尝试最多discovery.zen.fd.ping_retries 次(默认3次),无果的话,宣布节点失联,并且在需要的时候进行新的分片和主节点选举。
      可根据开发环境,适当修改这些值。
      
      es中还有个discovery.zen.ping_timeout 参数,设置ES自动发现节点连接超时的时间,默认3s,如果网络延迟高可以设大些。该参数主要是控制选取master时间,附带控制选主时的ping请求超时时间,将该值设大点,有效解决ping时节点的连接异常(建议8~15s)
      """
      

3.1.3 跨域问题

  • es有安全机制只允许服务器本地访问,所以在安装一些插件或者其他和es协作的软件时,当它们和es不在同一服务器时,需要配置es跨域

  • 配置如下

    • 1. 修改配置文件 elasticsearch.yml
      
      # 是否支持跨域
      http.cors.enabled: true  # 添加配置时, :后必须空格,不然启动闪退
      # *表示支持所有域名
      http.cors.allow-origin: "*"
      
      2. 重启es
      systemctl restart elasticsearch
      

3.2 单服务器上的伪集群搭建

  • 因为ElasticSearch是用Java语言编写的,所以必须安装 JDK 的环境,es7.2要求jdk最低版本为11,不过es7.2开始已内置jdk,不需要我们额外安装11版本的jdk,但es6.x和之前的版本需要安装最低版本8的jdk
  • 首先在服务器上下载相应的es压缩包和安装es的依赖的JDK,可参考文章:ElasticSearch和其插件的安装
  • 下面介绍的是单机上3节点的集群搭建,es版本为7.17.3
  • 注意:ES需要使用非root用户来启动

3.2.1 下载解压安装包

1. 下载安装包
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.3-linux-x86_64.tar.gz

2. 解压安装包
tar -zxvf elasticsearch-7.17.3-linux-x86_64.tar.gz -C /usr/local

3.2.2 修改es配置文件 jvm.options

  • 分配指定大小的内存给es
1. 切换到es的配置目录
cd es目录/config

2. 修改配置文件jvm.options
vi jvm.options

# 修改内存大小 ,内存大小按自己的需求设置。一般设置为物理内存的一半,但是不应超过32G,最大设置为31G即可
-xms:最小内存  
-xmx:最大内存

# 默认值:
-Xms4g
-Xmx4g

# 我设置的值:
-Xms512m
-Xmx512m

3.2.3 预配置node-1

# 配置 elasticsearch.yml 文件

# ---------------------------------- Cluster -----------------------------------
# 集群名称,三台集群,要配置相同的集群名称!!!
cluster.name: my-application
# ------------------------------------ Node ------------------------------------
# 节点名称
node.name: node-1
# 是否有资格被选举为master,ES默认集群中第一台机器为主节点
node.master: true
# 是否存储数据
node.data: true
# 单机允许的最大存储节点数,通常单机启动一个节点建议设置为1,开发环境中,如果单机启动多个节点就设置成节点数即可
node.max_local_storage_nodes: 3
# ----------------------------------- Paths ------------------------------------
# 数据目录
path.data: /usr/local/node-1/data
# log目录
path.logs: /usr/local/node-1/logs
# ---------------------------------- Network -----------------------------------
# 修改 network.host 为 0.0.0.0,表示对外开放,如对特定ip开放则改为指定ip
network.host: 0.0.0.0
# 设置对外服务http端口,默认为9200
http.port: 9200
# 内部节点之间沟通端⼝
transport.tcp.port: 9300
# --------------------------------- Discovery ----------------------------------
# 节点发现,写⼊候选主节点的设备地址,在开启服务后可以被选为主节点
discovery.seed_hosts: ["localhost:9300", "localhost:9301", "localhost:9302"]
# 初始化⼀个新的集群时需要此配置来选举master,写入 node.name参数的值
cluster.initial_master_nodes: ["node-1", "node-2","node-3"]
# 为了避免脑裂,设置discovery.zen.minimum_master_nodes 为集群中master候选节点数量/2+1 
discovery.zen.minimum_master_nodes:2
# 单播方式进行节点发现
discovery.zen.ping.unicast.hosts: ["localhost:9300", "localhost:9301", "localhost:9302"]
# 设置集群中N个节点启动时进行数据恢复,默认为1
gateway.recover_after_nodes: 3 
# 控制错误识别相关参数
discovery.zen.fd.ping_interval: 8
discovery.zen.fd.ping_timeout: 30
discovery_zen.fd.ping_retries: 3
# 设置ES自动发现节点连接超时的时间,默认3s,如果网络延迟高可以设大些
discovery.zen.ping_timeout: 8

# --------------------------------- 跨域 ----------------------------------
# 下面的两个配置在安装elasticsearch-head的时候会用到
# 开启跨域访问支持,默认为false
http.cors.enabled: true
# 跨域访问允许的域名地址,(允许所有域名)以上使用正则
http.cors.allow-origin: "*"

# xpack.security.enabled 是否关闭安全模式(开发环境),8.x及之后得版本默认都是开启
xpack.security.enabled: false

3.2.4 复制当前es安装目录构建其他节点

# 分别拷贝三份文件
cp -r /usr/local/elasticsearch-7.17.3/ /usr/local/node-1
cp -r /usr/local/elasticsearch-7.17.3/ /usr/local/node-2
cp -r /usr/local/elasticsearch-7.17.3/ /usr/local/node-3

# 由于上面配置的就是node-1,所以下面只需要在修改node-2 node-3的配置即可

3.2.5 修改node-2配置

# 配置 elasticsearch.yml 文件

# ---------------------------------- Cluster -----------------------------------
# 集群名称,三台集群,要配置相同的集群名称!!!
cluster.name: my-application
# ------------------------------------ Node ------------------------------------
# 节点名称
node.name: node-2
# 是否有资格被选举为master,ES默认集群中第一台机器为主节点
node.master: true
# 是否存储数据
node.data: true
# 单机允许的最大存储节点数,通常单机启动一个节点建议设置为1,开发环境中,如果单机启动多个节点就设置成节点数即可
node.max_local_storage_nodes: 3
# ----------------------------------- Paths ------------------------------------
# 数据目录
path.data: /usr/local/node-2/data
# log目录
path.logs: /usr/local/node-2/logs
# ---------------------------------- Network -----------------------------------
# 修改 network.host 为 0.0.0.0,表示对外开放,如对特定ip开放则改为指定ip
network.host: 0.0.0.0
# 设置对外服务http端口,默认为9200
http.port: 9201
# 内部节点之间沟通端⼝
transport.tcp.port: 9301
# --------------------------------- Discovery ----------------------------------
# 节点发现,写⼊候选主节点的设备地址,在开启服务后可以被选为主节点
discovery.seed_hosts: ["localhost:9300", "localhost:9301", "localhost:9302"]
# 初始化⼀个新的集群时需要此配置来选举master,写入 node.name参数的值
cluster.initial_master_nodes: ["node-1", "node-2","node-3"]
# 为了避免脑裂,设置discovery.zen.minimum_master_nodes 为集群中master候选节点数量/2+1 
discovery.zen.minimum_master_nodes:2
# 单播方式进行节点发现
discovery.zen.ping.unicast.hosts: ["localhost:9300", "localhost:9301", "localhost:9302"]
# 设置集群中N个节点启动时进行数据恢复,默认为1
gateway.recover_after_nodes: 3 
# 控制错误识别相关参数
discovery.zen.fd.ping_interval: 8
discovery.zen.fd.ping_timeout: 30
discovery_zen.fd.ping_retries: 3
# 设置ES自动发现节点连接超时的时间,默认3s,如果网络延迟高可以设大些
discovery.zen.ping_timeout: 8

# --------------------------------- 跨域 ----------------------------------
# 下面的两个配置在安装elasticsearch-head的时候会用到
# 开启跨域访问支持,默认为false
http.cors.enabled: true
# 跨域访问允许的域名地址,(允许所有域名)以上使用正则
http.cors.allow-origin: "*"

# xpack.security.enabled 是否关闭安全模式(开发环境),8.x及之后得版本默认都是开启
xpack.security.enabled: false

3.2.6 修改node-3配置

# 配置 elasticsearch.yml 文件

# ---------------------------------- Cluster -----------------------------------
# 集群名称,三台集群,要配置相同的集群名称!!!
cluster.name: my-application
# ------------------------------------ Node ------------------------------------
# 节点名称
node.name: node-3
# 是否有资格被选举为master,ES默认集群中第一台机器为主节点
node.master: true
# 是否存储数据
node.data: true
# 单机允许的最大存储节点数,通常单机启动一个节点建议设置为1,开发环境中,如果单机启动多个节点就设置成节点数即可
node.max_local_storage_nodes: 3
# ----------------------------------- Paths ------------------------------------
# 数据目录
path.data: /usr/local/node-3/data
# log目录
path.logs: /usr/local/node-3/logs
# ---------------------------------- Network -----------------------------------
# 修改 network.host 为 0.0.0.0,表示对外开放,如对特定ip开放则改为指定ip
network.host: 0.0.0.0
# 设置对外服务http端口,默认为9200
http.port: 9202
# 内部节点之间沟通端⼝
transport.tcp.port: 9302
# --------------------------------- Discovery ----------------------------------
# 节点发现,写⼊候选主节点的设备地址,在开启服务后可以被选为主节点
discovery.seed_hosts: ["localhost:9300", "localhost:9301", "localhost:9302"]
# 初始化⼀个新的集群时需要此配置来选举master,写入 node.name参数的值
cluster.initial_master_nodes: ["node-1", "node-2","node-3"]
# 为了避免脑裂,设置discovery.zen.minimum_master_nodes 为集群中master候选节点数量/2+1 
discovery.zen.minimum_master_nodes:2
# 单播方式进行节点发现
discovery.zen.ping.unicast.hosts: ["localhost:9300", "localhost:9301", "localhost:9302"]
# 设置集群中N个节点启动时进行数据恢复,默认为1
gateway.recover_after_nodes: 3 
# 控制错误识别相关参数
discovery.zen.fd.ping_interval: 8
discovery.zen.fd.ping_timeout: 30
discovery_zen.fd.ping_retries: 3
# 设置ES自动发现节点连接超时的时间,默认3s,如果网络延迟高可以设大些
discovery.zen.ping_timeout: 8

# --------------------------------- 跨域 ----------------------------------
# 下面的两个配置在安装elasticsearch-head的时候会用到
# 开启跨域访问支持,默认为false
http.cors.enabled: true
# 跨域访问允许的域名地址,(允许所有域名)以上使用正则
http.cors.allow-origin: "*"

# xpack.security.enabled 是否关闭安全模式(开发环境),8.x及之后得版本默认都是开启
xpack.security.enabled: false

3.2.7 创建ES存储数据的data目录和log目录

  • 根据之前每个节点的配置文件内配置path进行创建或修改
mkdir -p /usr/local/node-1/data
mkdir -p /usr/local/node-1/logs

mkdir -p /usr/local/node-2/data
mkdir -p /usr/local/node-2/logs

mkdir -p /usr/local/node-3/data
mkdir -p /usr/local/node-3/logs

3.2.8 创建用户并授权

  • 由于ES需要使用非root用户来启动,所以下面创建一个普通用户,并将es的目录进行授权
  • 若log目录和data目录不在es的安装目录下,记得也要单独对它们进行授权
# 1. 用root用户创建elasticsearch用户组
groupadd elasticsearch

# 2. 创建新用户elasticsearch ,设置用户组为elasticsearch ,密码123456
useradd elasticsearch -g elasticsearch -p 123456

# 3. 给节点文件授权,更改每个文件夹所属用户及用户组为elasticsearch:elasticsearch
chown -R elasticsearch:elasticsearch /usr/local/node-1
chown -R elasticsearch:elasticsearch /usr/local/node-2
chown -R elasticsearch:elasticsearch /usr/local/node-3

3.2.9 启动es集群

# 需切换为elasticsearch用户
su elasticsearch
# 启动服务,谁是老大则是要看谁先启动了!

# 如果开启了防火墙则还需要开放端口
# 9200、9201、9202:对外服务的http 端口
# 9300、9301、9302:节点间通信的tcp端口

cd /usr/local/
./node-1/bin/elasticsearch -d
./node-2/bin/elasticsearch -d
./node-3/bin/elasticsearch -d

关闭es进程:
ps -ef | grep elastic
kill -9 11597

3.2.10 查看集群状态

# 打开浏览器输入:http://的/_cat/health?v ,如果返回的node.total为3,则表示集群搭建成功

3.3 不同服务器上的集群搭建

  • 同单机集群搭建类似,只需要修改discovery.seed_hosts 、discovery.zen.ping.unicast.hosts中的ip地址

四、小结

4.1 故障恢复

  • 主数分离:该非高可用版集群适用于开发和测试环境,3个节点组成集群,节点均为数据节点,均会存储数据。生产环境,master节点和data节点应该分离,使用不同的节点。

  • 自动选举:3个节点中会选举一个master主节点,该master节点宕机后,另外两个节点会选举出一个新的master节点

  • 防止脑裂:yml配置文件中的discovery.zen.minimum_master_nodes,推荐设置为n/2+1,n为集群中设置为master的节点数,故3个master节点时推荐设置为2。如果两个节点宕机,则不满足最小节点限制,不会重新选举。

  • 副本冗余:为保证数据的完整性,es提供了副本机制,合理的设置分片和副本的数量可以一定程度地保证宕机时的数据完整性。

    • 示例:3个数据节点,主分片设置为5,副本设置为1。1个节点宕机后,另外两个节点还拥有完整的数据。2个节点宕机后最后一个节点没有完整的数据,无法正常地提供服务。若需要2个节点宕机仍正常提供服务,则可以设置副片数量为2。

4.2 分片和副本

  • 分片数量越多,对查询速度会有提升,但是当分片数量到一定数量后,对主分片的维护的时间开销变大,反而会降低索引的查询速度。一般来说,主分片数量需要设置少于2倍的节点数。
  • 副本的增加提高了维护分片的成本,也会导致一个索引占用的空间增加,也进一步增加了存储的压力,一般来说,副本数量应尽量设置不超过3个。
  • 索引的主分片设置后就不允许修改,一个索引的大小增加后,分片的大小必然也会随之增加,当分片的大小增加到一定程度后,对该分片的维护成本变高,查询速度也会变慢。官方推荐一个分片的大小最好在20G~50G之间,所以当一个索引的大小到达一定程度后,我们需要将新的数据导入到新的索引中,这时会用到rollover
    • rollover:设置该索引数据量超过一定大小后,es将会新建一个索引,并将数据导入到新的索引中。

4.3 es优化进阶:冷热数据分离

  • es冷热数据分离目的是为了节省成本,冷热数据分离和多级缓存是非常类似的,一句话概括就是把更高频访问的数据,放在性能搞好的硬件上,但区别就是多级缓存是不考虑数据持久化的。

  • 性能越快的硬件往往空间越少,以至于其只能把最高频使用的数据放进去,如CPU的L1、L2、L3三级缓存。性能递减,容量递增。上升到整个计算机层面,CPU到内存再到磁盘,也是速度递减,容量递增。本质上讲,就是把最常用的东西放在最近的位置

  • 详情请查看:https://blog.csdn.net/wlei0618/article/details/125275346

posted @ 2024-04-11 14:23  BigSun丶  阅读(150)  评论(0编辑  收藏  举报