Elasticsearch特点:分布式,高性能,高可用,高伸缩的搜索和分析;
1)可作为一个大型分布式集群,处理PB级别的数据,服务大型公司,亦可运行在少数或单台设备上服务小型公司
分布式的特性:
Elasticsearch致力于隐藏式分布式系统的复杂性,如下这些操作都是在底层自动完成的:
- 将你的文档分区到不同的容器或者分片(shards)中,他们可以存在于一个或多个节点中
- 将分片均匀的分配到各个节点,对索引和搜索做负载均衡。
- 冗余每一个分片,防止硬件故障造成的数据丢失
- 将集群中任意一个节点上的请求路由到相应数据所在的节点
- 无论是节点增加或减少,分片都可以做到无缝的扩展和迁移
2)Elasticsearch主要将全文检索、数据分析以及分布式技术,合并在了一起;
3)对用户而言,使用便利
4)相比传统数据库作搜索性能和功能有了很大提升(全文检索,同义词处理,相关度排名,复杂数据分析,对海量数据近实时处理等等);
功能:
1)分布式搜索引擎和数据分析引擎;
2)全文检索,结构化检索,数据分析。
3)对海量数据进行近实时的处理
集群内部工作方式
Elasticsearch用于构建高可用和可扩展的系统,扩展的方式可以是购买更高配置的Server(纵向扩展:vertical scale or scaling up)或者购买更多数量的server(横向扩展:horizontal scale or scaling out).
Elasticsearche虽说能从更强大的硬件中获得更好的性能,但是纵向扩展仍存在自身的局限性,真正扩展的往往是横向扩展,通过增加节点来分担负载增加可靠习惯。(对于大多数数据库而言,横向扩展的意味着你的程序讲座非常大的改动才能利用这些添加的设备。ES在这里就显现出优点,因为ES天生就是分布式的:他知道如何管理节点来提高扩展和高可用,这意味着你的程序不需要关心这些。)
全文检索和Lucene
1)全文检索,倒排索引
2)lucene,本来是一个jar包,内部包含了封装好的各种建立倒排索引,以及进行搜索的代码,包括各种算法。在使用Java开发的时候,引入lucene的jar包,然后基于lucene的api进行开发时,lucene会帮助我们在已有的数据中建立索引,帮助我们组织索引结构,此外还可以使用lucene提供的功能和api来针对磁盘上的索引数据,进行搜索。
Elasticsearch的相关名词解释
(1)Near Realtime(NRT):近实时,两层含义:写入数据到数据可以被搜索有一个小延迟,基于ES执行搜索和分析可以达到秒级
(2)Cluster:集群,包含多个节点,每个节点属于哪个集群是通过一个配置(集群名称默认是elasticsearch)来决定的;
(3)Node:节点,集群中的一个节点,介意也有一个名称(默认是随机分配的),节点名称也很重要(在执行运维管理操作的时候),默认节点会加入一个名称为“elasticsearch”的集群,假如启动一堆节点,那么这些节点会自动组成一个elasticsearch集群,当然一个节点也可以组成一个elasticsearch集群。
(4)Document:文档,ES中的最小单位,一个document可以是一条客户数据,一条商品分类信息,一条订单数据等等,通常用JSON形式表示,每个index下的type中都可以存储多个document。
(5)Index:索引,包含一推有下你故事结构的文档数据,如有一个客户索引,商品分类索引,订单索引,索引有一个名称。
(6)type:类型,每个索引里都可以有一个或多个type,type是index中的一个逻辑数据分类,一个type下的document,都有相同的field,如博客系统,有一个索引,可以定义用户数据type,博客数据type,评论数据type。
(7)shard:单个机器无法存储大量的数据,ES可以将一个索引中的数据切分为多个shard,分布在多台服务器上存储,有了shard就可以横向扩展,存储更多数据,让搜索和分析等操作分布到多台服务器上去执行,提升吞吐量和性能,。每个shard都是一个lucene index。
(8)replicate:任何一个服务器随时可能故障或宕机,primary shard(建立索引是一个设置,不能修改,默认5个),replicate shard(随时修改数量,默认一个),默认每个索引有10个shard,5个primary shard,5个replicate shard,最小的高可用配置,要求2太服务器。
ES与传统数据库相比
Elasticsearch | 数据库 |
Document | 行 |
Type | 表 |
Index | 数据库 |
空集群
启动一个单独的节点,他还没有数据和索引,如下图:
一个节点(node)即一个Elasticsearch实例,而一个集群(cluster)由一个或多个节点组成,他们具有相同的cluster name,他们协同工作,分享数据和负载。当加入新的节点或者删除一个节点时,集群就会感知到并平衡数据。
集群中的一个节点会被选举为主节点(master),它将临时管理集群级别的一些变更;如新建成或删除索引、增加或删除节点等。master不参与文档级别的变更或搜索,这意味着在流量增长的时候,master不会成为集群的瓶颈。任何节点都可以成为master。这里的举例因为只启动了一个节点,所以它会充当master的角色。
用户可以与集群中的任何节点通信,包括master,每一个节点都知道文档存在于那个节点上,它们可以转发请求到相应的节点上,我们访问的节点负责收集各节点返回的数据,最后一起返回给客户端。这一切都由elasticsearch处理。
ES集群可以监控统计很多信息,但是只有一个最重要:集群的健康(cluster health)。集群健康有三种状态:green、yellow和red。启动集群,在浏览器中登录127.0.0.1:5601,然后在Dev Tools中可以使用命令来获取集群的健康状态,GET /_cluster/health/
(1)status是我们关注的字段
三种状态的解释:
颜色 | 意义 |
green | 所有主要分片(primary shard)和复制分片(replicate shard)都可用 |
yellow | 所有主要分片可用。但不是所有复制分片都可用 |
red | 不是所有的主要分片都可用 |
添加索引
为了将数据添加到ES中,我们需要索引(index)--一个存储关联数据的地方,实际上,索引只是一个用来指向一个或多个分片(shards)的“逻辑命名空间(logical namespace)”.一个分片(shards)是一个最小级别“工作单元(work unit)”,它只是保存了索引中所有数据的一部分。分片其实就是一个Lucene实例,并且它本身就是一个完整的搜索引擎。我们的文档存储在分片中,并且在分片中被索引,但是我们的应用程序不会直接与它们通信,取而代之的是,直接与索引通信。分片是ES在集群中分发数据的关键。把分片想象成数据的容器,文档存储在分片中,然后分片分配到你集群中的节点上。当集群扩缩容时,ES会自动在节点间迁移分片,以使集群保持平衡。
分片可以是主分片(primary shard)或者是复制分片(replicate shard)。你索引中的每个文档属于一个primary shard,所以primary shard的数量决定了索引最多能存储多少数据。
(理论上primary shard能存储的数据大小是没有限制的。限制取决于实际使用情况。shard的最大容量完全取决于你的使用状况:硬件存储大小、文档的大小和复杂度、如何索引和查询你的文档,以及你期望的响应时间)
replicate shard只是primary shard的一个副本,它可以防止硬件故障导致的数据丢失,同时可以提供读请求,比如搜索或者从别的shard取回文档。
当索引创建完成的时候,primary shard的数量就固定了,但是replicate shard的数量可以随时调整。