一文搞懂 ElasticSearch 集群

转载:https://mp.weixin.qq.com/s?__biz=MzI4Njc5NjM1NQ==&mid=2247516757&idx=2&sn=80b251969a95efd90925d1b5bc726060&chksm=ebd5bd79dca2346fe7ceee518053a931b4118df29c30c92cd84cfae72d2ae33925878799f08e&scene=132#wechat_redirect

一、为什么要集群

单台 Elasticsearch 服务器提供服务,往往都有最大的负载能力,超过这个阈值,服务器性能就会大大降低甚至不可用,所以生产环境中,一般都是运行在指定服务器集群中。除了负载能力,单点服务器也存在其他问题:

  • 单台机器存储容量有限
  • 单服务器容易出现单点故障,无法实现高可用
  • 单服务的并发处理能力有限

配置服务器集群时,集群中节点数量没有限制,大于等于 2 个节点就可以看做是集群了。一般出于高性能及高可用方面来考虑集群中节点数量都是 3 个以上。

二、集群的概念

一个集群就是由一个或多个服务器节点组织在一起,共同持有整个的数据,并一起提供索引和搜索功能。

一个 Elasticsearch 集群有一个唯一的名字标识,这个名字默认就是”elasticsearch”。这个名字是重要的,因为一个节点只能通过指定某个集群的名字,来加入这个集群。

三、(mac/windows)集群部署

注:本博客是mac系统的部署,但本人亲测windows依旧可以适用,mac和windows上唯一的区别在于windows的启动文件是bin/elasticsearch.bat

将ElasticSearch的解压文件复制三份,如下所示:

图片

1.修改node-8001的config/elasticsearch.yml文件,如下

cluster.name: my-application

node.name: node-8001
node.master: true
node.data: true

network.host: localhost

http.port: 8001
transport.tcp.port: 9301

http.cors.enabled: true
http.cors.allow-origin: "*"

2.修改node-8002的config/elasticsearch.yml文件,如下

cluster.name: my-application

node.name: node-8002
node.master: true
node.data: true

network.host: localhost

http.port: 8002
transport.tcp.port: 9302
discovery.seed_hosts: ["localhost:9301"]
discovery.zen.fd.ping_timeout: 1m
discovery.zen.fd.ping_retries: 5

http.cors.enabled: true
http.cors.allow-origin: "*"

3.修改node-8003的config/elasticsearch.yml文件,如下

cluster.name: my-application

node.name: node-8003
node.master: true
node.data: true

network.host: localhost

http.port: 8003
transport.tcp.port: 9303
discovery.seed_hosts: ["localhost:9301","localhost:9302"]
discovery.zen.fd.ping_timeout: 1m
discovery.zen.fd.ping_retries: 5

http.cors.enabled: true
http.cors.allow-origin: "*"

然后按照顺序执行bin/elatsicsearch文件,在postman中通过访问http://localhost:8001/_cluster/health可以看出集群部署成功!

图片

四、操作演示

1.单点集群

我们只启动上面的node-8001的ES(node-8002和node-8003都没启动),为了演示目的,我们将分配3个主分片和一份副本(每个主分片拥有一个副本分片)

图片

通过chrome浏览器的Elastic Head插件,我们可以看出 3 个副本分片都是 Unassigned —— 它们都没有被分配到任何节点。在同一个节点上既保存原始数据又保存副本是没有意义的,因为一旦失去了那个节点,我们也将丢失该节点上的所有副本数据。

图片

2.故障转移

当集群中只有一个节点在运行时,意味着会有一个单点故障问题——没有冗余。幸运的是,我们只需再启动一个节点即可防止数据丢失。当你在同一台机器上启动了第二个节点时,只要它和第一个节点有同样的 cluster.name 配置,它就会自动发现集群并加入到其中。

但是在不同机器上启动节点的时候,为了加入到同一集群,你需要配置一个可连接到的单播主机列表。之所以配置为使用单播发现,以防止节点无意中加入集群。只有在同一台机器上运行的节点才会自动组成集群。

这里我们直接启动node-8002和node-8003:

通过chrome浏览器的Elastic Head插件,我们可以看出一切正常!node-8001前面有星号,说明是主节点。并且有加粗边框的分片(例如node-8003都)是主分片,没有加粗的分片(例如node-8002都)是副本。

图片

3.水平扩容

主分片的数目在索引创建时就已经确定了下来。实际上,这个数目定义了这个索引能够存储的最大数据量。(实际大小取决于你的数据、硬件和使用场景。) 但是,读操作——搜索和返回数据——可以同时被主分片 或 副本分片所处理,所以当你拥有越多的副本分片时,也将拥有越高的吞吐量。

下面就是在索引创建后,修改副本的数量(案例中是把副本数量修改为2),只需要如下的操作:

图片

我们再看看elasticsearch head 的监控页面,发现每个节点上已经有三个分片了

图片

4.应对故障

比如node-8001这个主节点某一刻挂掉了(我们直接把node-8001的黑窗口关掉来模拟这种情况)。所以下图很好理解:8001关掉了,自然是未连接!

图片

我们来查看8002端口的情况,发现有有三个副本无法分配,虽然健康状态是黄色的,但依旧不会影响使用,依旧可以提供服务!

图片

假设经过抢修,现在8001点故障已经解决了,那我们该如何将其重新加入集群中呢?其实我们只需要下面的操作:

第一步:再次修改config/elasticsearch.yml文件,添加下面的一行

图片

第二步:启动node-8001,发现node-8001已经纳入集群,而且分片正常,但主节点变成了node-8002也不影响使用!

图片

五、路由计算&分片控制

1.路由计算

经过上面的操作,我们会有这样的疑问——当索引一个文档的时候,文档会被存储到一个主分片中。Elasticsearch 如何知道一个文档应该存放到哪个分片中呢?当我们创建文档时,它如何决定这个文档应当被存储在分片1 还是分片 2 中呢?

这就引出了下面的路由算法,这就解释了为什么我们要在创建索引的时候就确定好主分片的数量 并且永远不会改变这个数量:因为如果数量变化了,那么所有之前路由的值都会无效,文档也再也找不到了。

图片

routing是一个可变值,默认是文档的_id,也可以设置成一个自定义的值。

routing通过hash 函数生成一个数字,然后这个数字再除以number_of_primary_shards(主分片的数量)后得到余数 。

这个分布在0到number_of_primary_shards-1 之间的余数,就是我们所寻求的文档所在分片的位置。

图片

2.分片控制

比如上图,zhangsan文档经过路由计算找到了2号分片,但2号分片在三个节点中都存在(node-8001和node-8002保存的是分片的副本)。我们可以发送请求到集群中的任一节点。每个节点都有能力处理任意请求。

每个节点都知道集群中任一文档位置,所以可以直接将请求转发到需要的节点上。当发送请求的时候, 为了扩展负载,更好的做法是轮询集群中所有的节点。

图片

六、集群中的读写操作流程

1.写操作

新建、索引和删除 请求都是写操作,必须在主分片上面完成之后才能被复制到相关的副本分片

图片

在客户端收到成功响应时,文档变更已经在主分片和所有副本分片执行完成,变更是安全的。有一些可选的请求参数允许您影响这个过程,可能以数据安全为代价提升性能。这些选项很少使用,因为 Elasticsearch 已经很快,但为了知识的完整性请看下方:

  1. consistency 参数的值可以设为 one (只要主分片状态 ok 就允许执行_写_操作),all(必须要主分片和所有副本分片的状态没问题才允许执行_写_操作), 或quorum 。默认值为 quorum , 即大多数的分片副本状态没问题就允许执行_写_操作。
  2. 如果没有足够的副本分片会发生什么?Elasticsearch 会等待,希望更多的分片出现。默认情况下,它最多等待 1 分钟。如果你需要,你可以使用 timeout 参数使它更早终止:100 100 毫秒,30s 是 30 秒。
2.读操作

我们可以从主分片或者从其它任意副本分片检索文档

图片

 

推荐这些文章:

ElasticSearch 8.x 默认密码

WINDOWS版本ES8第一次运行elasticSearch时 会自动进行安全配置
这在控制台可以看到有password
-> Elasticsearch security features have been automatically configured!
-> Authentication is enabled and cluster connections are encrypted.

-> Password for the elastic user (reset with `bin/elasticsearch-reset-password -u e...

ElasticSearch学习文档

中文文档:https://doc.codingdict.com/elasticsearch/
 

Elastic 官方网站:Free and Open Search: The Creators of Elasticsearch, ELK & Kibana | Elastic
B 站培训视频 Elastic搜索的个人空间_哔哩哔哩_Bilibili
Elastic 中文社区 meetup 活动报名 Elastic 中文社区 - 百格活动
Elastic 开发文档:Elastic Stack and Product Documentation | Elas...

ElasticSearch学习二 单节点安装

安装
下载
到ElasticSearch 官网下载相应的版本:https://www.elastic.co/cn/downloads/past-releases#elasticsearch
上传并解压
Alt + p 打开SecureCRT的SFTP,使用put命令,把本地的elasticsearch-7.4.2-linux-x86_64.tar.gz上传到Linux服务器。
创建安装目录,并解压
[root@localhost ~]# mkdir /usr/local/es
[root@localhost ~]# tar -zxvf elasticsearch-7.4.2-linux-x8...

ElasticSearch三master节点集群状态查看方法

ES集群的状态实际上也是使用RESTful的接口,一般用的是GET方法
http://[主机IP]:[ES端口]
通常我们启动服务器之后,就可以通过这个简单的方式来验证服务器是否启动成功。
从下面返加的JSON我们可以得到该节点的节点名,所属集群名,ES版本号,lucene版本号

@目录1,集群的健康状态2,集群的索引数3,集群所在磁盘的分配状况4,集群的节点5,集群的其它信息
以下端口31800是9200做的映射
1,集群的健康状态
http://ip:9200/_cat/health?v

RL中_cat表示查看信息,health表明返回的信息为集群健康信息,?v表示返回的信息加上头信...

【ElasticSearch】docker安装es7.12.1,设置xpack密码

docker run -d \
--name elasticsearch \
-p 9200:9200 \
-p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx128m" \
-v /home/es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.ym...

Elasticsearch技术解析与实战(11)ElasticSearch Head

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

【ElasticSearch/Linux】ES常见错误:node.lock

【出错原因】
之前启动的ES没有正常退出,导致节点锁定
【解决方案】
找出之前ES进程,强行kill掉
【具体步骤】

[ufo@localhost bin]$ ps aux|grep elastic
ufo 6609 2.7 13.6 2755980 136268 pts/1 Sl+ 20:07 1:19 /home/ufo/elasticsearch-8.0.0/jdk/bin/java -Xshare:auto -Des.networkaddress.cache.ttl=60 -Des.networkaddress.cache.negative.ttl=10 -...

ElasticSearch C# Elasticsearch.Net 获取原始ES查询JSON

我们C# 中使用 Elasticsearch.Net  ,nest 连接ES操作数据的时候,想要获取Elasticsearch.Net.dll 发给 es 的请求json数据有两种方式。
1、创建客户端的时候 加上 DisableDirectStreaming 方法,但是如果一直开启会损耗性能。

var settings = new ConnectionSettings(pool).DisableDirectStreaming().RequestTimeout(TimeSpan.FromSeconds(30));

加上之后,正常发起对ES的请求,然后再结...

一文详解 | 开放搜索兼容Elasticsearch做召回引擎

​简介:开放搜索发布开源兼容版,支持阿里云Elasticsearch做搜索召回引擎,本文详细介绍阿里云ES用户如何通过接入开放搜索兼容版丰富行业分词库,提升查询语义理解能力,无需开发、算法投入,即可获得淘系同款搜索效果。
开放搜索开源兼容版简介
很多客户在搭建搜索业务时更熟悉开源技术栈,会选择Elasticsearch/Solr等开源引擎负责搜索的召回环节,然而在召回引擎以外训练NLP、排序等算法能力,不仅耗时耗力,而且大部分处于高投入低回报的状态。
开放搜索开源兼容版的Elasticsearch引擎则是基于阿里巴巴在搜索领域的积累,开放搜索的Elasticsearch引擎实例作为一个阿里云...

Elasticsearch技术解析与实战(10)ElasticSearch Head

序言
安装ElasticSearch Head,它相当于是ES的图形化界面,这个更简单,它是一个浏览器的扩展程序,直接在chrome浏览器扩展程序里下载安装即可:
打开chrome浏览器,在扩展程序chrome应用商店那里,搜索elasticsearch:

选择ElasticSearch Head,点击添加至Chrome,进行扩展程序的安装即可:

 

 

 
 
资料

...

文章标题:一文搞懂 ElasticSearch 集群
文章链接:https://www.dianjilingqu.com/51125.html
本文章来源于网络,版权归原作者所有,如果本站文章侵犯了您的权益,请联系我们删除,联系邮箱:saisai#email.cn,感谢支持理解。
THE END
< <上一篇
下一篇>>