暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

跟我学ElasticSearch-集群篇

Java2B 2021-08-26
908

六、ElasticSearch集群

ES集群是-个P2P类型(使用gossip 协议)的分布式系统,除了集群状态管理以外,其他所有的请求都可以发送到 集群内任意-台节点上,这个节点可以自己找到需要转发给哪些节点,并且直接跟这些节点通信.所以,从网络架 构及服务配置上来说,构建集群所需要的配置极其简单。在Elasticsearch20之前,无阻碍的网络下。所有配置了 相同cluster .name的节点都自动归属到一个集群中。2.0 版本之后,基于安全的考虑避免开发环境过于随便造成的 麻烦,从2.0版本开始。默认的自动发现方式改为了单播(unicast)方式。配置里提供几台节点的地址, ES将其视作 gossip router角色,借以完成集群的发现。gossip router角色并不需要单独配置,每个ES节点都可以担任。所以,采用单播方式的集群,各节点都配置相同的几个节点列表作为router即可。

6.1 集群 cluster

一个集群就是一个或多个节点组织在一起,他们共同持有整个库的数据,并在一起提供索引和搜索功能,一个集群由一个唯一的名字表示。所有节点通过这个集群名字,来进入这个集群。

集群中节点数量没有限制。-般大于等于2个节点就可以看做是集群了。一般处于高性能及高可用方面来考虑- -般 集群中的节点数量都是3个及3个以上。

6.2 节点node

一个节点是由集群中的一个服务器,作为集群的一部分,它存储数据,参与集群的索引和搜索功能。和集群类似,一个节点也是由一个名字来标识的,默认情况下,这个名字是一个随机的。

一个节点可以通过配置集群名称的方式来加入一个指定的集群。

6.3 分片和复制 shard & replicas

分片:

一个索引可以存储超过单个节点硬件限制的大量数据,比如说一个索引具有10亿文档,占据1T的磁盘空间,而任意一个节点都没有这样大的一个磁盘空间;或者单个节点处理搜索请求,响应太慢了,为了解决这个问题,ElasticSearch提供了将索引划分为多份的能力,每一份就叫做一个分片。当建立一个索引的时候,可以指定想要分配的分片数量。每个分片本身也是一个功能完善并且独立的“索引”,这个“索引”可以被放置到集群中的任何节点上。分片很重要,主要体现在两方面:a、允许你水平分割/扩展你的内容容量。2) 允许你在分片之上进行分布式并行操作,从而提高性能和吞吐量

至于分片怎么分布,查询结果怎么聚合,完全由elasticsearch管理的。开发者不需要关心。

复制:

在网络环境或者说分布式环境中,通讯发生失败是常有的事,所以当某个分片节点出现故障,故障转移机制是非常有必要的。因此Elasticsearch允许你创建分片的一份或者多份拷贝,这些拷贝叫做复制分片,或者就叫复制。复制的存在提高了节点出现故障时的集群高可用性。因为这个原因,复制分片应注意与主分片不能在同一个节点上。


总结的说,一个索引可以被分为多个分片,可以被复制0~N次,一旦复制了就有了主分片和复制分片之别。分片和复制的数量可以在索引创建的时候指定。在索引创建之后,复制的数量可以改变,但是分片数量不能改变。

6.4 节点的4种类型

主节点:

即 Master 节点。主节点的主要职责是和集群操作相关的内容,如创建或删除索引,跟踪哪些节点是群集的一部分,并决定哪些分片分配给相关的节点。稳定的主节点对集群的健康是非常重要的。默认情况下任何一个集群中的节点都有可能被选为主节点。索引数据和搜索查询等操作会占用大量的cpu,内存,io资源,为了确保一个集群的稳定,分离主节点和数据节点是一个比较好的选择。虽然主节点也可以协调节点,路由搜索和从客户端新增数据到数据节点,但最好不要使用这些专用的主节点。一个重要的原则是,尽可能做尽量少的工作。

数据节点:

即 Data 节点。数据节点主要是存储索引数据的节点,主要对文档进行增删改查操作,聚合操作等。数据节点对 CPU、内存、IO 要求较高,在优化的时候需要监控数据节点的状态,当资源不够的时候,需要在集群中添加新的节点。

预处理节点:

也称作 Ingest 节点,在索引数据之前可以先对数据做预处理操作,所有节点其实默认都是支持 Ingest 操作的,也可以专门将某个节点配置为 Ingest 节点。以上就是节点几种类型,一个节点其实可以对应不同的类型,如一个节点可以同时成为主节点和数据节点和预处理节点,但如果一个节点既不是主节点也不是数据节点,那么它就是负载均衡节点。具体的类型可以通过具体的配置文件来设置。

节点类型默认配置专用节点注意事项
主节点node.master: truenode.master: true node.data: false node.ingest: false cluster.remote.connect: falsediscovery.zen.minimummasternodes: 1(防止脑裂设置)
意思是最少需要多少node.master: true 的节点集群才能工作
建议(mastereligiblenodes 2) + 1
比如能node.master: true节点有6个 (6/2)+1=4
那么如果健康节点少于4集群将不能工作
数据节点node.data: truenode.master: false node.data: true node.ingest: false cluster.remote.connect: false建议使用SSD硬盘缓解I/O压力
预处理节点node.ingestnode.master: false node.data: false node.ingest: true cluster.remote.connect: false节点负载将会很高,建议使用专用节点作为Ingest node 分片交互

6.5 分片交互

我们能够发送请求给集群中任意一个节点。每个节点都有能力处理任意请求。每个节点都知道任意文档所在的节点,所以也可以将请求转发到需要的节点。下面的例子中,我们将发送所有请求给 Node1
,这个节点我们将会称之为请求节点(requesting node) 。当我们发送请求,最好的做法是循环通过所有节点请求,这样可以平衡负载,或者借助nginx、apache等反向代理服务器进行负载。

6.5.1 新建、删除索引和删除文档时

新建、索引和删除请求都是写(write)操作,它们必须在主分片上成功完成才能复制到相关的复制分片上。

6.5.2 单条检索文档集群交互流程

6.5.3 批量查询文档

请求拆成每个分片的请求,然后转发每个参与的节点。

6.6 集群搭建配置信息

对于一个新建的节点需要保证 安装目录的data 目录为空

修改 elasticsearch.yml 配置文件

注意冒号后面的空格。

  1. #集群名称

  2. cluster.name: my-elasticsearch

  3. #节点名称,不同的节点名称必须不一样

  4. node.name: node-1

  5. # 是否可以成为master节点

  6. node.master: true

  7. #必须为本机的ip地址

  8. network.host: 127.0.0.1

  9. #服务端口,在同一机器下必须不一样

  10. http.port: 9201

  11. #集群间通讯端口号,在同一机器必须不一样

  12. transport.tcp.port: 9301

  13. #集群节点

  14. discovery.seed_hosts:

  15. - 127.0.0.1:9301

  16. - 127.0.0.1:9302

  17. - 127.0.0.1:9303

  18. #集群中的主节点

  19. cluster.initial_master_nodes:

  20. - 127.0.0.1:9301

不同节点注意修改节点名称、服务端口、通讯端口、以及是否可以成为主节点属性。

修改完毕后依次启动不同节点服务。

6.7 集群节点重启问题

ElasticSearch集群的高可用和自平衡方案会在节点挂掉(重启)后自动在别的结点上复制该结点的分片,这将导致了大量的IO和网络开销。

如果离开的节点重新加入集群,elasticsearch为了对数据分片(shard)进行再平衡,会为重新加入的节点再次分配数据分片(Shard), 当一台es因为压力过大而挂掉以后,其他的es服务会备份本应那台es保存的数据,造成更大压力,于是整个集群会发生雪崩。

生产环境下建议关闭自动平衡。

  1. cluster.routing.rebalance.enable: none

可以设置延迟副本重新分配时间

  1. index.unassigned.node_left.delayed_timeout: 5m

还可以指定集群节点到达多少数量才开始平衡

  1. gateway.recover_after_nodes: 8

6.8 手动维护分片

一共有三种操作,分别为:

移动(move),

取消(cancel)

和分配(allocate)。

下面分别介绍这三种情况:移动(move) 把分片从一节点移动到另一个节点。可以指定索引名和分片号。取消(cancel) 取消分配一个分片。可以指定索引名和分片号。node参数可以指定在那个节点取消正在分配的分片。allowprimary参数支持取消分配主分片。分配(allocate) 分配一个未分配的分片到指定节点。可以指定索引名和分片号。node参数指定分配到那个节点。allowprimary参数可以强制分配主分片,不过这样可能导致数据丢失。


文章转载自Java2B,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论