赞
踩
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
ES集群中有2个比较核心的概念需要理解一下。分别是:节点、分片。在聊这些概念之前,我们先重新梳理一下,ES的集群是什么。
ES的集群,亦上图所示,它通常由如下特征:
注意:ES在实际生产环境中,还会部署多个集群一起工作
-E cluster.name=es-cluster
进行设定ES中的节点本质上是一个Elasticsearch的实例,一个Java进程。通常,我们建议生产环境中,一台机器只运行一个ES实例。(一台机器部署多个节点,其实是违背【高可用】原则的)
ES节点有如下特性:
-E node.name=node1
指定Master Node
:主节点,负责索引的删除创建Master eligible nodes
:【直译:符合条件的节点】。可以参与选举的合格节点Data Node
:数据节点,负责文档的写入、读取。节点保存数据并执行与数据相关的操作,如CRUD、搜索和聚合Coordinating Node
:协调节点通过ES多角色定义可以看的出来,ES的集群架构非常成熟,它也是我目前见过的角色最丰富的架构。如此丰富的角色定义,肯定是为了拓展集群架构而生的,单一职责嘛。不过有一点我没想通的是,如果节点太多了,做一次CRUD的速度能快吗?会不会在通信上就花费了很多时间。
节点类型,可以通过如下配置参数禁用/启用
关于Master eligible nodes和Master Node
node.mater=false
禁止关于Data Node 和 Coordinating Node
node.data: false
禁止其他节点类型
Hot & Warm Node
:冷热节点。不同硬件配置 的Data Node,用来实现Hot & Warm
架构,降低集群部署的成本不同硬件配置,通常是CPU跟硬盘。硬盘根据冷热数据类型,可以选择固态或者机械硬盘
Ingest Node
:数据前置处理转换节点,支持pipeline管道设置,可以使用ingest对数据进行过滤、转换等操作Machine Learning Node
:负责跑机器学习的Job,用来做异常检测Tribe Node
:Tribe Node连接到不同的Elasticsearch集群,并且支持将这些集群当成一个单独的集群处理以下是一个多集群业务架构图:
Master节点主要功能::
Data Node数据节点的功能:
官方定义:
数据节点保存包含您已索引的文档的分片。数据节点处理数据相关操作,例如 CRUD、搜索和聚合。这些操作是 I/O、内存和 CPU 密集型操作。监视这些资源并在过载时添加更多数据节点非常重要。
拥有专用数据节点的主要好处是主角色和数据角色的分离。
要创建专用数据节点,请设置:node.roles: [ data ]
在多层部署体系结构中,您可以使用专门的数据角色将数据节点分配到特定层:data_content
、data_hot
、data_warm
、data_cold
或data_frozen
。一个节点可以属于多个层,但具有专用数据角色之一的节点不能具有通用data角色。
官方定义:
诸如搜索
请求或批量索引
请求之类的请求,它们可能涉及不同数据节点上保存的数据。例如,搜索请求分两个阶段执行,这两个阶段由接收客户端请求的节点(协调节点)协调。
每个节点都是隐式的协调节点。这意味着具有显式空角色列表的节点node.roles将仅充当协调节点,无法禁用。因此,这样的节点需要有足够的内存和 CPU 才能处理收集阶段。
官方定义:
在实际的文档索引发生之前,使用摄取节点对文档进行预处理。摄取节点拦截批量和索引请求,应用转换,然后将文档传递回索引或批量api。
默认情况下,所有节点都启用摄取,因此任何节点都可以处理摄取任务。您还可以创建专用的摄取节点。如果要禁用节点的摄取,请在elasticsearch. conf中配置以下配置。yml文件:node.ingest: false
要在索引之前对文档进行预处理,请定义一个指定一系列处理器的管道。每个处理器都以某种特定的方式转换文档。例如,管道可能有一个处理程序从文档中删除字段,然后有另一个处理程序重命名字段。然后,集群状态存储配置的管道。
要使用管道,只需在索引或批量请求上指定pipeline参数。这样,摄取节点就知道要使用哪个管道。例如:
PUT my-index/my-type/my-id?pipeline=my_pipeline_id
{
"foo": "bar"
}
其他节点相对来说使用的比较少,不做介绍了
ES的选举流程也很简单,如下:
在我们的生产过程中,Master Node的最佳实践方案
- Master节点非常重要,在部署上需要考虑解决单点的问题
- 为一个集群设置多个Master节点,每个节点只承担Master 的单一角色
分片是ES中一个比较重要的概念。ElasticSearch是一个分布式的搜索引擎,索引可以分成一份或多份,多份分布在不同节点的分片当中。ElasticSearch会自动管理分片,如果发现分片分布不均衡,就会自动迁移。
分片又有【主分片】、【副本分片】之分。它们的区别如下:
# 指定索引的主分片和副本分片数
PUT /csdn_blogs
{
"settings": {
"number\_of\_shards": 3,
"number\_of\_replicas": 1
}
}
分片架构
如上图是某个集群的分片架构,它有如下特征:
通常都是奇数,所谓【集群奇数法则】。但其实只是名字很唬人,本质上也没那么神奇。你自己想想,如果是偶数的话,是不是很有可能出现选举平票的时候?根据我的经验,选举算法通常都希望快速选举一个master或者leader出来,以便能够快速提供服务,所以没空扯皮
高可用之——故障转移
node1
的副本放在node3
,node2
放在node1
,node3
放在node2
)使用【cat API查看集群信息】
- GET /_cat/nodes?v #查看节点信息
- GET /_cat/health?v #查看集群当前状态:红、黄、绿
- GET /_cat/shards?v #查看各shard的详细情况
- GET /_cat/shards/{index}?v #查看指定分片的详细情况
- GET /_cat/master?v #查看master节点信息
- GET /_cat/indices?v #查看集群中所有index的详细信息
- GET /_cat/indices/{index}?v #查看集群中指定index的详细信息 `
下面是在Linux环境,centos7下面的集群搭建步骤:
1)系统环境准备
首先创建用户,因为es不允许root账号启动
adduser es
passwd es
安装版本:elasticsearch-7.17.3。接着切换到root用户,修改/etc/hosts:
vim /etc/hosts
192.168.66.150 es-node1
192.168.66.151 es-node2
192.168.66.152 es-node3
2)修改elasticsearch.yml
注意配置里面的注释,里面有一些细节。比如:
# 指定集群名称3个节点必须一致 cluster.name: es-cluster #指定节点名称,每个节点名字唯一 node.name: node-1 #是否有资格为master节点,默认为true node.master: true #是否为data节点,默认为true node.data: true # 绑定ip,开启远程访问,可以配置0.0.0.0 network.host: 0.0.0.0 #用于节点发现 discovery.seed_hosts: ["es-node1", "es-node2", "es-node3"] #7.0新引入的配置项,初始仲裁,仅在整个集群首次启动时才需要初始仲裁。 #该选项配置为node.name的值,指定可以初始化集群节点的名称 cluster.initial_master_nodes: ["node-1","node-2","node-3"] #解决跨域问题 http.cors.enabled: true http.cors.allow-origin: "\*"
三个节点配置很简单,按照上面的模板,依次修改node.name
就行了
3) 启动每个节点的ES服务
# 注意:如果运行过单节点模式,需要删除data目录, 否则会导致无法加入集群
rm -rf data
# 启动ES服务
bin/elasticsearch -d
4)验证集群
正常来说,如果我们先启动了192.168.66.150
,那么它就是这个集群当中的主节点,所以我们验证集群的话,只需要访问http://192.168.66.150:9200
即可看到如下界面:
介绍完了ES的集群部署,我们再来看看ES客户端的部署。这里有两个可选方案,它们分别是Cerebro和Kibana,它们的区别与联系如下:
Cerebro和Kibana都是用于Elasticsearch的开源工具,但它们在功能和使用场景上存在一些区别。
功能:
- Cerebro:Cerebro是Elasticsearch的图形管理工具,可以查看分片分配和执行常见的索引操作,功能集中管理alias和index template,十分快捷。此外,Cerebro还具有实时监控数据的功能。
- Kibana:Kibana是一个强大的可视化工具,可以用于Elasticsearch数据的探索、分析和展示。它提供了丰富的图表类型,包括折线图、直方图、饼图等,可以方便地展示基于时间序列的数据。此外,Kibana还提供了日志管理、分析和展示的功能
使用场景:
- Cerebro:Cerebro适合用于生产和测试环境的Elasticsearch集群管理,尤其适用于需要快速查看和执行索引操作的情况。由于Cerebro轻量且适用于实时监控,它可能更适用于较小的集群和实时监控的场景。
- Kibana:Kibana适合对Elasticsearch数据进行深入的分析和探索,以及对日志进行管理和分析。它提供了丰富的可视化功能和灵活的数据展示方式,适用于各种规模的数据分析和监控场景。
Cerebro安装
Cerebro 可以查看分片分配和通过图形界面执行常见的索引操作,完全开源,并且它允许添加用户,密码或 LDAP 身份验证问网络界面。Cerebro 基于 Scala 的Play 框架编写,用于后端 REST 和 Elasticsearch 通信。 它使用通过 AngularJS 编写的单页应用程序(SPA)前端。
安装包下载地址如下:https://github.com/lmenezes/cerebro/releases/download/v0.9.4/cerebro-0.9.4.zip
下载安装之后,用以下命令启动即可:
cerebro-0.9.4/bin/cerebro
#后台启动
nohup bin/cerebro > cerebro.log &
访问:http://192.168.66.150:9000/
输入ES集群节点:http://192.168.66.150:9200
,建立连接。然后会出现以下界面:
kibana安装
1)修改kibana配置
vim config/kibana.yml
server.port: 5601
server.host: "192.168.66.150"
elasticsearch.hosts: ["http://192.168.66.150:9200","http://192.168.66.151:9200","http://192.168.66.152:9200"]
i18n.locale: "zh-CN"
2)运行Kibana
#后台启动
nohup bin/kibana &
3)访问
访问http://192.168.66.150:5601/
验证
我们在上面的介绍中知道,节点有多种不同的类型(角色),有:Master eligible / Data / Ingest / Coordinating /Machine Learning等。不过跟之前学习的各种集群架构不同的是,ES一个节点可承担多种角色。
不过,在生产环境中尽量还是一个节点一种角色比较好,优点是:极致的高可用;缺点是:可能有点费钱
想要一个节点只承担一个角色,只需要修改如下配置:
#Master节点 node.master: true node.ingest: false node.data: false #data节点 node.master: false node.ingest: false node.data: true #ingest 节点 node.master: false node.ingest: true node.data: false #coordinate节点 node.master: false node.ingest: false node.data: false
在实际生产中,我们可能会遇到需要水平扩展容量的场景,通常来说,以下是几个常见的场景:
下面是一个多集群架构。集群处在三个数据中心,数据三写,使用GTM分发读请求
全局流量管理(GTM)和负载均衡(SLB)的区别:
GTM 是通过DNS将域名解析到多个IP地址,不同用户访问不同的IP地址,来实现应用服务流量的分配。同时通过健康检查动态更新DNS解析IP列表,实现故障隔离以及故障切换。最终用户的访问直接连接服务的IP地址,并不通过GTM。
而 SLB 是通过代理用户访问请求的形式将用户访问请求实时分发到不同的服务器,最终用户的访问流量必须要经过SLB。 一般来说,相同Region使用SLB进行负载均衡,不同region的多个SLB地址时,则可以使用GTM进行负载均衡。
热节点存放用户最关心的热数据;温节点或者冷节点存放用户不太关心或者关心优先级低的冷数据或者暖数据。
它的典型的应用场景如下:
在成本有限的前提下,让客户关注的实时数据和历史数据硬件隔离,最大化解决客户反应的响应时间慢的问题。业务场景描述:每日增量6TB日志数据,高峰时段写入及查询频率都较高,集群压力较大,查询ES时,常出现查询缓慢问题。
ES为什么要设计Hot & Warm 架构呢?
两类数据节点,不同的硬件配置:
Hot Nodes:用于数据的写入
Warm Nodes
用于保存只读的索引,比较旧的数据。通常使用大容量的磁盘
配置Hot & Warm 架构
使用Shard Filtering实现Hot&Warm node间的数据迁移
1)标记节点
需要通过“node.attr”来标记一个节点
# 标记一个 Hot 节点 elasticsearch.bat -E node.name=hotnode -E cluster.name=tulingESCluster -E http.port=9200 -E path.data=hot_data -E node.attr.my\_node\_type=hot # 标记一个 warm 节点 elasticsearch.bat -E node.name=warmnode -E cluster.name=tulingESCluster -E http.port=9201 -E path.data=warm_data -E node.attr.my\_node\_type=warm ![img](https://img-blog.csdnimg.cn/img_convert/04a02a5101ea65de653fe5683434db60.png) ![img](https://img-blog.csdnimg.cn/img_convert/d46bc62ed74b39ed4c127380eaa568a9.png) **网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。** **[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)** **一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!** cluster.name=tulingESCluster -E http.port=9200 -E path.data=hot_data -E node.attr.my\_node\_type=hot # 标记一个 warm 节点 elasticsearch.bat -E node.name=warmnode -E cluster.name=tulingESCluster -E http.port=9201 -E path.data=warm_data -E node.attr.my\_node\_type=warm [外链图片转存中...(img-67FB4MqX-1715110133332)] [外链图片转存中...(img-zTCrxUfi-1715110133332)] **网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。** **[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)** **一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。