在《ElasticSearch系列文章:基本介绍》中主要介绍了ElasticSearch一些使用场景,本文将对Elasticsearch的核心概念进行介绍,这对后期使用ElasticSearch有着重要的影响。
1、NearRealtime(NRT):准实时
Elasticsearch是一个准实时的搜索平台,这意味着当你索引一个文档(document )时,在细微的延迟(通常1s)之后,该文件才能被搜索到。
2、Cluster:集群
一个集群是一个或多个nodes(servers)的集合,一起保存整个数据,并且提供从所有nodes上进行联合索引(federated indexing)和搜索功能。
节点(node)是一个运行着的Elasticsearch实例。集群(cluster)是一组具有相同cluster.name
的节点集合,他们协同工作,共享数据并提供故障转移和扩展功能,当然一个节点也可以组成一个集群。
你最好找一个合适的名字来替代cluster.name
(config/elasticsearch.yml
)的默认值,比如你自己的名字,这样可以防止一个新启动的节点加入到相同网络中的另一个同名的集群中。比如你可以使用logging-dev,logging-stage和logging-prod来表示development,staging和production的集群环境。
3、Node:节点
一个Node是Elasticsearch集群的一个服务器,用来存储数据并且参与到集群的索引和搜索功能中。和集群的名称一样,一个Node也需要定义一个名字node.name
(config/elasticsearch.yml),如果你不想使用默认,可以手工修改。
一个Node通过配置可以根据集群的名称cluster.name加入一个指定的Elasticsearch集群。
4、 Index:索引
index是具有相似特征的文档(document)集合。例如,你可以有顾客数据的index、商品种类的index和订单数据的index。每个index都有唯一的名称(必须小写),当执行索引、搜索、更新和删除操作时都需要根据该名称找到对应的index。
一个cluster可以包含任意数量的index。
5、Type:类型
在一个index中,可以定义一个或多个type。type是index的逻辑分类。通常,type拥有一组通用field的文档集合。举例,你运行一个博客平台,把全部数据存储在一个index中。在这个index中,你可以为用户数据定义一个type,为博客数据定义一个type,为评论数据定义一个type。
6、Document:文档
document是索引的基本单元信息。举例,你有一个客户的document、一个商品的document和一个订单的document。该document用JSON表示。
一个index/type中,可以包含任意多的document。注意,虽然document物理上存在index中,document实际上必须被分配到index中的type上。
7、Shards和Replicas:分片和副本
一个index可以存储数量超出硬件限制的数据。举例,一个index包含10亿文档,占据1TB硬盘空间,就会导致无法放在单个节点硬盘上或者响应request太慢。
为了解决这个问题,Elasticsearch提供了将索引分片的技术,称为shard。当创建一个index,可以指定shard的数量。每个shard内部都是全功能而且相互独立的“index”,可以放在cluster上的任意node上。
Sharding重要的两个主要原因:
(1) 允许横向扩展容量
(2) 分布式并行操作shard(可能在多个node上),因而提高性能
分片是如何分布、文档是如何聚合回搜索结果的机制完全由Elasticsearch管理,对用户透明。
在网络/云环境中,故障是很常见的,比如一个shard/node宕了,因而容错机制非常有效,也是被推荐的。为此,Elasticsearch允许创建index的shard的一个或多个副本,称为replica。
Replication重要的两个主要原因:
(1) 提供高可用性,以防shard/node失效。注意,一个replica shard绝对不能分配到它原先所在node(即创建副本的原本所在的node);
(2) 允许扩展搜索容量,因为搜索可以并行在所有replica上执行
总结
每个index可以被分为多个shard。一个index也可以被复制0份或者多份。一旦复制过,每个index将有主shard(创建副本的原本所在的shard)和replica shard(主shard的副本)。shard和replica的数量可以在index创建的时候自定义。index创建之后,你可以动态改变replica的数量,但是不能改变shard的数量。
在默认情况下,每个index被分配5个主shard和1个replica,这意味着,如果你在cluster中有至少两个节点,每个index将有10个shard,分别是5个主shard和另外5个replica shard(1个完整的replica)。
需要注意的是,每个Elasticsearch的shard是一个Lucene的index。在一个单独的Lucene的index中有最大数量的documents。因为LUCENE-5843(https://issues.apache.org/jira/browse/LUCENE-5843)的原因,这个documents数量被限制为2,147,483,519(=Integer.MAX_VALUE - 128),你可以通过_cat/shards(curl10.20.18.20:9200/_cat/shards)的api接口来监控shard的大小。
本博客文章除特别声明,全部都是原创!原创文章版权归过往记忆大数据(过往记忆)所有,未经许可不得转载。
本文链接: 【ElasticSearch系列文章:核心概念介绍】(https://www.iteblog.com/archives/1739.html)
大赞,跟着大神步伐学习, 😳 有个疑问,shard数是创建index时指定且不能修改,shard的大小可以动态调整吗?设计shard数的决定的决定因素都有哪些呢?
shard的数量在创建index的时候就确定了(默认是5),之后是不能动态修改的。设计shard的时候需要考虑到你数据量,并行度等情况,当然和你集群规模肯定也有关系。