网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
要点
ES要掌握什么:
- 使用:搜索和聚合操作语法,理解分词,倒排索引,相关性算分(文档匹配度)
- 优化: 数据预处理,文档建模,集群架构优化,读写性能优化
笔记正文
一、ES集群架构
1.1 为什么要使用ES集群架构
为什么需要使用集群架构?这就得提一下分布式系统的可用性与扩展性了。
- 高可用性:分为两个点考虑
- 服务高可用性:允许个别节点停止服务,个别节点停止服务不影响整体使用
- 数据可用性:部分节点丢失,不会丢失数据(需要有备份策略)
- 可扩展性:
- 请求量提升/数据的不断增长(将数据分布到所有节点上)
上面所说的正是集群架构的优势所在。对ES集群架构来说,则体现在:
- 提高系统的可用性,部分节点停止服务,整个集群的服务不受影响
- 存储的水平扩容
1.2 ES集群核心概念
ES集群中有2个比较核心的概念需要理解一下。分别是:节点、分片。在聊这些概念之前,我们先重新梳理一下,ES的集群是什么。
ES的集群,亦上图所示,它通常由如下特征:
- 集群中有一个或者多个节点
- 不同的集群通过不同的名字来区分,默认名字【elasticsearch】
注意:ES在实际生产环境中,还会部署多个集群一起工作
- 通过配置文件修改,或者在命令行中
-E cluster.name=es-cluster
进行设定
1.2.1 节点
ES中的节点本质上是一个Elasticsearch的实例,一个Java进程。通常,我们建议生产环境中,一台机器只运行一个ES实例。(一台机器部署多个节点,其实是违背【高可用】原则的)
ES节点有如下特性:
- 每一个节点都有名字,通过配置文件配置,或者启动时候
-E node.name=node1
指定 - 每一个节点在启动之后,会分配一个UID,保存在data目录下
- 节点有多种角色(类型),不同角色通常有不同的功能,它们分别是:
Master Node
:主节点,负责索引的删除创建Master eligible nodes
:【直译:符合条件的节点】。可以参与选举的合格节点Data Node
:数据节点,负责文档的写入、读取。节点保存数据并执行与数据相关的操作,如CRUD、搜索和聚合Coordinating Node
:协调节点- 其他节点
通过ES多角色定义可以看的出来,ES的集群架构非常成熟,它也是我目前见过的角色最丰富的架构。如此丰富的角色定义,肯定是为了拓展集群架构而生的,单一职责嘛。不过有一点我没想通的是,如果节点太多了,做一次CRUD的速度能快吗?会不会在通信上就花费了很多时间。
节点类型,可以通过如下配置参数禁用/启用
关于Master eligible nodes和Master Node
- 每个节点启动后,默认就是一个Master eligible节点,即都可以参与集群选举,成为Master节点。可以通过
node.mater=false
禁止 - 当第一个节点启动时候,它会将自己选举成Master节点
- 每个节点上都保存了集群的状态,但是只有Master节点才能修改集群的状态信息。集群状态信息(Cluster State) 维护了一个集群中所有必要的信息。比如:
- 所有节点信息
- 所有的索引和其他相关的Mapping与Setting信息
- 分片的路由信息
关于Data Node 和 Coordinating Node