ES集群搭建
1|0一、es的集群类型
-
根据集群针对的目标差异,可分为三种:
-
高可用群集 (High Availability Cluster):高可用(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间。如果系统每运行100个时间单位,会有1个时间单位无法提供服务,我们说系统的可用性是99%。提高应用系统的可靠性、尽可能地减少中断时间为目标,确保服务的连续性,达到高可用(HA) 的容错效果。HA的工作方式包括双工和主从两种模式,双工即所有节点同时在线;主从则只有主节点在线,但当出现故障时从节点能自动切换为主节点。例如:“故障切换”、“双机热备” 等。
-
负载均衡群集(Load Balance Cluster):将流量均衡的分布在不同的节点上,每个节点都可以处理一部分负载,并且可以在节点之间动态分配负载,以实现平衡。主要目的提高应用系统的响应能力、尽可能处理更多的访问请求、减少延迟为目标,获得高并发、高负载(LB)的整体性能。
-
高性能群集(High Performance Computer Cluster):以提高应用系统的CPU运算速度、扩展硬件资源和分析能力为目标,获得相当于大型、超级计算机的高性能运算(HPC)能力。高性能依赖于"分布式运算”、“并行计算” , 通过专用硬件和软件将多个服务器的CPU、内存等资源整合在一起,实现只有大型、超级计算机才具备的计算能力。例如,“云计算”、“网格计算”等
-
2|0二、es集群的发现机制
-
共3个作用
-
1、集群中的节点相互发现组成集群
2、负责es集群master的选举
3、Ping
-
-
Ping
:这是一个节点使用发现机制去寻找其他节点的进程。同时支持多播和单播方式的发现(也可以组合使用)-
广播
-
单播
-
-
也可以同时使用两者,但默认的是广播,单播需要已知节点列表来完成(在
elasticsearch.yml
配置文件中配置discovery.zen.ping.unicast.hosts
参数,见下面-单播方式,为空列表即表示为广播方式)
2|12.1 广播方式
-
当es实例启动的时候,它发送了广播的ping请求到地址
224.2.2.4:54328
。而其他的es实例使用同样的集群名称响应了这个请求。 -
一般这个默认的集群名称就是上面的
cluster_name
对应的elasticsearch
。通常而言,广播是个很好地方式。想象一下,广播发现就像你大吼一声:别说话了,再说话我就发红包了!然后所有听见的纷纷响应你。
但是,广播也有不好之处,过程不可控。
2|22.2 单播方式
- 当节点的ip(想象一下我们的ip地址是不是一直在变)不经常变化的时候,或者es只连接特定的节点。单播发现是个很理想的模式。使用单播时,我们告诉es集群其他节点的ip及(可选的)端口及端口范围。我们在
elasticsearch.yml
配置文件中设置:
-
大家就像交换微信名片一样,相互传传就加群了.....
-
一般的,我们没必要关闭单播发现,如果你需要广播发现的话,配置文件中的列表保持空白即可。
3|0三、es的集群搭建
-
注意:ES需要使用非root用户来启动
-
下面介绍单播方式的集群搭建
- 单服务器上进行集群搭建(不推荐,在生产环境中,建议每个服务器只运行一个 Elasticsearch 节点)
- 不同服务器进行集群搭建
3|13.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操作的例子
3.1.2 脑裂问题
3.1.2.1 什么是脑裂
-
选取主节点:无论是广播发现还是到单播发现,一旦集群中的节点发生变化,它们就会协商谁将成为主节点,elasticsearch认为所有节点都有资格成为主节点。如果集群中只有一个节点,那么该节点首先会等一段时间,如果还是没有发现其他节点,就会任命自己为主节点。
-
脑裂这个词描述的是这样的一个场景:(通常是在重负荷或网络存在问题时)elasticsearch集群中一个或者多个节点失去和主节点的通信,然后各节点就开始选举新的主节点,继续处理请求。这个时候,可能会同时有多个候选节点都成为了主节点,然后就会有多个不同的集群在同时运行着,这一现象就是脑裂。因为单一集群被分成了多个部分。为了防止这种情况的发生,我们就需要设置集群节点的总数,规则就是有候选资格节点总数整除以2再加一(半数以上)。这样,当一个或者多个节点失去通信,小老弟们就无法选举出新的主节点来形成新的集群。因为这些小老弟们无法满足设置的规则数量
-
如何避免脑裂
-
为了防止脑裂,我们必须对该集群设置参数:
-
-
-
那么,主节点是如何知道某个节点还活着呢?这就要说到下面的错误识别了
3.1.2.2 错误识别
-
其实错误识别,就是当主节点被确定后,建立起内部的ping机制来确保每个节点在集群中保持活跃和健康,这就是错误识别。
主节点ping集群中的其他节点,而且每个节点也会ping主节点来确认主节点还活着,如果没有响应,则宣布该节点失联。想象一下,老大要时不常的看看(循环)小弟们是否还活着,而小老弟们也要时不常的看看老大还在不在,不在了就赶紧再选举一个出来! -
但是,怎么看?多久没联系算是失联?这些细节都是可以设置的,不是一拍脑门子,就说某个小老弟挂了!在配置文件中,可以设置:
-
3.1.3 跨域问题
-
es有安全机制只允许服务器本地访问,所以在安装一些插件或者其他和es协作的软件时,当它们和es不在同一服务器时,需要配置es跨域
-
配置如下
-
3|23.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 下载解压安装包
- 首先要下载安装jdk1.8,可参考文章:ElasticSearch和其插件的安装
3.2.2 修改es配置文件 jvm.options
- 分配指定大小的内存给es
3.2.3 预配置node-1
3.2.4 复制当前es安装目录构建其他节点
3.2.5 修改node-2配置
3.2.6 修改node-3配置
3.2.7 创建ES存储数据的data目录和log目录
- 根据之前每个节点的配置文件内配置path进行创建或修改
3.2.8 创建用户并授权
- 由于ES需要使用非root用户来启动,所以下面创建一个普通用户,并将es的目录进行授权
- 若log目录和data目录不在es的安装目录下,记得也要单独对它们进行授权
3.2.9 启动es集群
3.2.10 查看集群状态
3|33.3 不同服务器上的集群搭建
- 同单机集群搭建类似,只需要修改
discovery.seed_hosts 、discovery.zen.ping.unicast.hosts
中的ip地址
4|0四、小结
4|14.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|24.2 分片和副本
- 分片数量越多,对查询速度会有提升,但是当分片数量到一定数量后,对主分片的维护的时间开销变大,反而会降低索引的查询速度。一般来说,主分片数量需要设置少于2倍的节点数。
- 副本的增加提高了维护分片的成本,也会导致一个索引占用的空间增加,也进一步增加了存储的压力,一般来说,副本数量应尽量设置不超过3个。
- 索引的主分片设置后就不允许修改,一个索引的大小增加后,分片的大小必然也会随之增加,当分片的大小增加到一定程度后,对该分片的维护成本变高,查询速度也会变慢。官方推荐一个分片的大小最好在20G~50G之间,所以当一个索引的大小到达一定程度后,我们需要将新的数据导入到新的索引中,这时会用到
rollover
- rollover:设置该索引数据量超过一定大小后,es将会新建一个索引,并将数据导入到新的索引中。
4|34.3 es优化进阶:冷热数据分离
-
es冷热数据分离目的是为了节省成本,冷热数据分离和多级缓存是非常类似的,一句话概括就是把更高频访问的数据,放在性能搞好的硬件上,但区别就是多级缓存是不考虑数据持久化的。
-
性能越快的硬件往往空间越少,以至于其只能把最高频使用的数据放进去,如CPU的L1、L2、L3三级缓存。性能递减,容量递增。上升到整个计算机层面,CPU到内存再到磁盘,也是速度递减,容量递增。本质上讲,就是把最常用的东西放在最近的位置
-
详情请查看:https://blog.csdn.net/wlei0618/article/details/125275346
__EOF__

本文链接:https://www.cnblogs.com/Mcoming/p/18129077.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下