单机
&
集群
单台
Elasticsearch
服务器提供服务,往往都有最大的负载能力,超过这个阈值,服务器
性能就会大大降低甚至不可用,所以生产环境中,一般都是运行在指定服务器集群中
配置服务器集群时,集群中节点数量没有限制,大于等于
2
个节点就可以看做是集群了。一
般出于高性能及高可用方面来考虑集群中节点数量都是
3
个以上。
集群
Cluster
一个集群就是由一个或多个服务器节点组织在一起,共同持有整个的数据,并一起提供
索引和搜索功能。一个
Elasticsearch
集群有一个唯一的名字标识,这个名字默认就
是
”elasticsearch”
。这个名字是重要的,因为一个节点只能通过指定某个集群的名字,来加入
这个集群。
节点
Node
集群中包含很多服务器,一个节点就是其中的一个服务器。作为集群的一部分,它存储
数据,参与集群的索引和搜索功能。
一个节点可以通过配置集群名称的方式来加入一个指定的集群。默认情况下,每个节点
都会被安排加入到一个叫做
“elasticsearch”
的集群中,这意味着,如果你在你的网络中启动了
若干个节点,并假定它们能够相互发现彼此,它们将会自动地形成并加入到一个叫做
“elasticsearch”
的集群中。
核心概念
索引(
Index
)
一个索引就是一个拥有几分相似特征的文档的集合。在一个集群中,可以定义任意多的索引。
能搜索的数据必须索引,这样的好处是可以提高查询速度,比如:新华字典前面的目录
就是索引的意思,目录可以提高查询速度。
Elasticsearch
索引的精髓:一切设计都是为了提高搜索的性能。
类型(
Type
)
7.x 默认不再支持自定义索引类型(默认类型为:_doc)
文档(
Document
)
一个文档是一个可被索引的基础信息单元,也就是一条数据
在一个
index/type
里面,你可以存储任意多的文档。
字段(
Field
)
相当于是数据表的字段,对文档数据根据不同属性进行的分类标识。
映射(
Mapping
)
mapping
是处理数据的方式和规则方面做一些限制,如:某个字段的数据类型、默认值、
分析器、是否被索引等等。这些都是映射里面可以设置的,其它就是处理
ES
里面数据的一
些使用规则设置也叫做映射,按着最优规则处理数据对性能提高很大,因此才需要建立映射,
并且需要思考如何建立映射才能对性能更好。
分片 Shards
一个索引可以存储超出单个节点硬件限制的大量数据。比如,一个具有
10
亿文档数据
的索引占据
1TB
的磁盘空间,而任一节点都可能没有这样大的磁盘空间。或者单个节点处
理搜索请求,响应太慢。为了解决这个问题,
Elasticsearch
提供了将索引划分成多份的能力,
每一份就称之为分片。当你创建一个索引的时候,你可以指定你想要的分片的数量。每个分
片本身也是一个功能完善并且独立的
“
索引
”
,这个
“
索引
”
可以被放置到集群中的任何节点
上
分片很重要,主要有两方面的原因:
1
)允许你水平分割
/
扩展你的内容容量。
2
)允许你在分片之上进行分布式的、并行的操作,进而提高性能
/
吞吐量。
被混淆的概念是,一个
Lucene
索引 我们在
Elasticsearch
称作 分片 。 一个
Elasticsearch
索引 是分片的集合。 当
Elasticsearch
在索引中搜索的时候, 他发送查询
到每一个属于索引的分片
(Lucene
索引
)
,然后合并每个分片的结果到一个全局的结果集。
副本(
Replicas
)
在一个网络
/
云的环境里,失败随时都可能发生,在某个分片
/
节点不知怎么的就处于
离线状态,或者由于任何原因消失了,这种情况下,有一个故障转移机制是非常有用并且是
强烈推荐的。为此目的,
Elasticsearch
允许你创建分片的一份或多份拷贝,这些拷贝叫做复
制分片
(
副本
)
。
复制分片之所以重要,有两个主要原因:
在分片/节点失败的情况下,提供了高可用性。因为这个原因,注意到复制分片从不与
原
/
主要(
original/primary
)分片置于同一节点上是非常重要的。
扩展你的搜索量
/
吞吐量,因为搜索可以在所有的副本上并行运行。
总之,每个索引可以被分成多个分片。一个索引也可以被复制
0
次(意思是没有复制)
或多次。一旦复制了,每个索引就有了主分片(作为复制源的原来的分片)和复制分片(主
分片的拷贝)之别。分片和复制的数量可以在索引创建的时候指定。在索引创建之后,你可
以在任何时候动态地改变复制的数量,但是你事后不能改变分片的数量。默认情况下,
Elasticsearch
中的每个索引被分片
1
个主分片和
1
个复制,这意味着,如果你的集群中至少
有两个节点,你的索引将会有
1
个主分片和另外
1
个复制分片(
1
个完全拷贝),这样的话
每个索引总共就有
2
个分片,我们需要根据索引需要确定分片个数。
分配(
Allocation
)
将分片分配给某个节点的过程,包括分配主分片或者副本。如果是副本,还包含从主分
片复制数据的过程。这个过程是由
master
节点完成的。
系统架构
一个运行中的
Elasticsearch
实例称为一个节点,而集群是由一个或者多个拥有相同cluster.name 配置的节点组成,
它们共同承担数据和负载的压力。当有节点加入集群中或者 从集群中移除节点时,集群将会重新平均分布所有的数据。
当一个节点被选举成为主节点时, 它将负责管理集群范围内的所有变更,例如增加、
删除索引,或者增加、删除节点等。 而主节点并不需要涉及到文档级别的变更和搜索等操
作,所以当集群只拥有一个主节点的情况下,即使流量的增加它也不会成为瓶颈。 任何节
点都可以成为主节点。我们的示例集群就只有一个节点,所以它同时也成为了主节点。
作为用户,我们可以将请求发送到集群中的任何节点 ,包括主节点。 每个节点都知道任意文档所处的位置,并且能够将我们的请求直接转发到存储我们所需文档的节点。 无论我们将请求发送到哪个节点,它都能负责从各个包含我们所需文档的节点收集回数据,并将最终结果返回給客户端。 Elasticsearch 对这一切的管理都是透明的。
一个运行中的
Elasticsearch
实例称为一个节点,而集群是由一个或者多个拥有相同 cluster.name 配置的节点组成, 它们共同承担数据和负载的压力。当有节点加入集群中或者 从集群中移除节点时,集群将会重新平均分布所有的数据。
作为用户,我们可以将请求发送到集群中的任何节点 ,包括主节点。 每个节点都知道 任意文档所处的位置,并且能够将我们的请求直接转发到存储我们所需文档的节点。 无论 我们将请求发送到哪个节点,它都能负责从各个包含我们所需文档的节点收集回数据,并将 最终结果返回給客户端。 Elasticsearch
对这一切的管理都是透明的。
分布式集群
1)单节点集群