基本概念
Elasticsearch是一个高可扩展的开源全文搜索和分析引擎,它允许存储、搜索和分析大量的数据,并且这个过程是近实时(NRT)的。它通常被用作底层引擎和技术,为复杂的搜索功能和要求提供动力。
近实时(NRT)
近实时(Near Realtime NRT),Elasticsearch是一个近实时的搜索平台,近实时的意思是指从你建立索引到你能够搜索这个文档这个过程,这个过程时间大概是1秒钟。
节点(node)
ElasticSearch 本质上是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个 ElasticSearch 实例。
单个 ElasticSearch 实例称为一个节点(node)。一组节点构成一个集群(cluster)。
在集群中一个节点是一个单独的服务,用来存储数据,为集群的索引和搜索提供能力。
集群中的节点,也有唯一标识的,默认在节点启动的时候会随机指定一个UUID(Universally Unique IDentifiter)。如果不使用默认名称,可以为其指定一个名称。节点名称对于集群管理也是很重要的。
一个节点要加入到指定集群,需要为节点指定集群名称。默认情况下,每个节点都设置集群名称为”elasticsearch”,所以当在同一网络环境中,默认启动一些节点,这些节点会组装成一个名为elasticsearch集群。
查看node节点列表:
$ curl -X GET http://127.0.0.1:9200/_cat/nodes?v
可以启动Kibana,使用Dev Tools工具来查询,就不演示了。下面操作也都可以使用Kibana。
集群(cluster)
一个集群包含一个或多个节点(node),用来保存全部数据,并且这些节点联合提供索引和搜索能力。集群使用唯一名称 进行不同集群间的区分,默认名称是”elasticsearch”。集群的名称很重要,因为一个节点如果要加入到一个集群中,需要设置节点的集群名称。
在实际应用中,需要确保你的不同环境,所使用的名称是不同的,否则会导致节点加入到其它集群环境中。比如你可以使用:logging-dev、logging-stage、logging-prod分别用来搭建开发、过渡、生产环境。
集群可以只有一个节点,这个集群也能正常提供工作能力。此外,也可以搭建多个Elasticsearch集群,通过集群名称区分。
索引(Index)
一个索引包含许多特征类似的文档。例如,有一个索引用来索引用户数据,另一个索引用来索引产品目录,其它的索引可以索引其它数据。
一个索引(名词)需要指定一个名称(必须全部小写),当执行索引(动词)、搜索、修改和删除操作,需要指定对应的索引名称。
在一个集群中,你可以创建多个索引。
下面的命令可以查看当前节点的所有 Index。
$ curl -X GET 'http://localhost:9200/_cat/indices?v'
类型(Type)
类型type,只有在低于7版本中存在,现在最新的es7版本中已经移除了type的概念,一个索引只有有一个type,而且是es自带的type,不允许用户自己来创建,默认就是:_doc (type)。不过在这里还是需要说明一下这个概念:
在低版本中,一个索引中,可以定义多个类型。一个类型可以管理索引中符合特定逻辑的一部分数据。一般来说,类型定义具有公共字段的文档。例如你想创建一个博客平台,并且使用一个索引存储所有数据。在这个索引中,你可以定义一个类型用来存储用户数据,另一个类型用来存储博客数据,还可以创建一个类型用来存储评论。
同一个 Index 里面的 Document,不要求有相同的结构(scheme),但是最好保持相同,这样有利于提高搜索效率,这是对于数据库中表的差异,数据库中的表结构是预定义的,定义之后是不允许修改和插入没有定义的field的!!!
PS: 可以类比一下数据库中的概念,索引index :数据库,类型type:表。
1)下面的命令可以列出每个 Index 所包含的 Type。
$ curl 'localhost:9200/_mapping?pretty=true'
2)列出指定的index的type
$ curl 'localhost:9200/${index}/_mapping?pretty=true'
文档(Doc)
文档是能够被索引的基础单元。例如一个文档存储一个用户信息,另一个文档存储一个产品信息。Elasticsearch文档使用JSON(JavaScript Object Notation)来表现数据。
在一个索引/文档中可以存储许多文档。需要注意,尽管一个文档在物理存储上是存储在一个索引中的,但文档必须被索引或分配给索引的类型中。
Document 使用 JSON 格式表示,下面是一个例子。
{
"ide": "543543565465"
"user": "张三",
"title": "工程师",
"desc": "数据库管理"
}
分片(Shard)&副本(Replicas)
在实际应用中可能存在这样的场景,一个索引存储超过了一个节点的物理存储能力。例如一个索引有十亿的文档,超过了1TB的存储,在单个节点无法完全存储,并且对于单个节点的搜索请求是非常慢的。
为了解决这些问题,Elasticsearch提供了为索引切分成多个分片(Shard)的能力,当你创建一个索引的时候,你能够定义索引被分割成多少个shard。每一个shard都是功能完全,能够独立索引的,可以分配到集群中任何一个节点中。
使用分片有两个重要原因:
- 允许水平分割文档,分布存储。
- 允许你分配并且执行分片,在多个节点中能够提供查询性能和吞吐量。
shard如何分布,当一个请求发来后如何组织数据,这些对于用户来说都是透明的。
当在一个网络环境中,有可能某个节点或分片丢失。Elasticsearch提供了一种针对这种故障转移的功能,就是副本。Elasticsearch允许你为一个分片创建一个或多个副本。分片和副本又称为主/副分片。
使用副本有两个重要原因:
- 当一个节点或分片丢失后,能够继续使用。因此,需要注意的是主/副分片不会存储在一个节点中。
- 当进行搜索的时候,允许搜索所有的副本,所以提高了搜索性能。
所以一个索引能够分割成多个shard,一个索引能够可以有零个或多个副本。每个索引都有主分片(索引切割后的分片,又称原始分片)和副本分片(从原始分片复制过来的)。分片数量和副本数量在创建索引的时候可以被指定,当索引创建后,可以指定改变副本数量,但是不能改变主分片数量。默认情况下每个索引在Elasticsearch有5个分片和1个副本,也就是说总共10个shard(副本是对分片来说的,每个shard又一个副本)。每一个shard内部都是一个Lucene索引实例,单个lucene索引最多能够存储2,147,483,519(Integer.MAX_value-128)个文档。
集群健康
集群健康检查,这里会用到_cat语法:
$ curl http://127.0.0.1:9200/_cat/health?v
从结果可以看到,集群名称为gakki,集群状态为绿色(green)。
集群状态分为绿色(green)、黄色(yellow)和红色(red)。
- 绿色代表集群当前状态是好的(集群功能齐全)。
- 黄色代表所有数据(主分片)都可用,但是一些副本(副分片)还没有分配(集群功能齐全)。
- 红色代表一些数据(主分片)不可用。
需要注意的是,即使集群是红色的,它仍然部分功能可用。例如:可用的shard能够继续为搜索提供服务。但是你应该尽快去解决你丢失的数据。
从上面的信息来看,我们就有一个节点(node),并且可以看到有2个shard。
需要注意一点,Elasticsearch启动使用默认名称是elasticsearch。我这里修改了es的配置文件,将集群的名字改为了gakki,以后有新的es节点要加入这个集群,只需要将该节点的配置文件中的集群名称改为:gakki 即可。Elasticsearch默认采用单播网络去发现其它节点,所以如果你启动了多个Elasticsearch实例,则会自动加入这个名称为”gakki”的集群。