单机 & 集群
单台 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)单节点集群