Elasticsearch简介
ES是Elastic Search的缩写,ES是基于Lucene的分布式存储;Lucene提供了全文检索的功能,ES在此之上加入索引分布式的机制,提供了数据分片、数据副本、数据同步等功能,保证了数据的安全性;
ES存储的基本单位是一个document,可以想象是数据库中的一行,与数据库类似的是,一个document包含有多个Field,可以是数值类型也可以是字符类型,与数据库不同的是,document可以随意添加或删除字段,也就是Schema less,另外ES对于需要检索的字段可以声明为需要索引,这样可以很方便就对document进行检索。
ES具有以下特性:
分布式的实时文件存储,每个字段都被索引并可被搜索;分布式的实时分析搜索引擎;可以扩展到上百台服务器,处理PB级结构化或非结构化数据;ES在分布式概念上做了很大程度上的透明化,你不需要知道任何关于分布式系统、分片、集群发现或者其他大量的分布式概念。ES致力于隐藏分布式系统的复杂性,以下这些操作都是在底层自动完成的:
将你的文档分区到不同的容器或者分片(shards)中,它们可以存在于一个或多个节点中。将分片均匀的分配到各个节点,对索引和搜索做负载均衡。冗余每一个分片,防止硬件故障造成的数据丢失。将集群中任意一个节点上的请求路由到相应数据所在的节点。无论是增加节点,还是移除节点,分片都可以做到无缝的扩展和迁移。性能
基于以上存储特性,ES可以处理PB级的数据,在我们的压测过程中,ES的表现也非常出色;
在五十亿条数据基量(每条数据大小800B)情况下,多线程写入测试,测试结果TPS可以稳定到 8W/S 6W/S,
在同样数据基量情况下,基于document_id进行多线程搜索排序测试,测试结果为8W+/S ;
ES集群中,数据被分散(hash)到多个分片中,每个分片根据设置会有一到二个冗余的分片副本,主分片以及副本分片被分散到不同的节点上;
这保证了在硬件故障时数据不会丢失;
此外,集群中的任意一个节点都会将请求路由到相应数据所在的节点,这样访问集群中的任意节点都会得到正常的数据返回。
Elasticsearch集群一个 Elasticsearch 集群由一个或多个节点(Node)组成,每个集群都有一个共同的集群名称作为标识。
Node 节点一个 Elasticsearch 实例即一个 Node,一台机器可以有多个实例,正常使用下每个实例应该会部署在不同的机器上。Elasticsearch 的配置文件中可以通过 node.master、node.data 来设置节点类型。
node.master:表示节点是否具有成为主节点的资格,多个有资格的主节点会通过选举产生真正的主节点
node.data:表示节点是否存储数据
当node.master和node.data配置都设置为false的时候,该节点只能处理路由请求,处理搜索,分发索引操作等,从本质上来说该客户节点表现为智能负载平衡器。独立的客户端节点在一个比较大的集群中是非常有用的,他协调主节点和数据节点,客户端节点加入集群可以得到集群的状态,根据集群的状态可以直接路由请求。
数据节点数据节点主要是存储索引数据的节点,主要对文档进行增删改查操作,聚合操作等。数据节点对cpu,内存,io要求较高, 在优化的时候需要监控数据节点的状态,当资源不够的时候,需要在集群中添加新的节点。
主节点主节点的主要职责是和集群操作相关的内容,如创建或删除索引,跟踪哪些节点是群集的一部分,并决定哪些分片分配给相关的节点。稳定的主节点对集群的健康是非常重要的,默认情况下任何一个集群中的节点都有可能被选为主节点,索引数据和搜索查询等操作会占用大量的cpu,内存,io资源,为了确保一个集群的稳定,分离主节点和数据节点是一个比较好的选择。
Index 索引一个集群下可以有多个索引,每个索引是一系列相同格式文档的集合(Elasticsearch 6.x 已不支持一个索引下多个Type)。
Shard 分片每个索引有一个或多个分片,每个分片存储不同的数据。分片可分为主分片( primary shard)和副本分片(replica shard),副本分片是主分片的拷贝。默认每个主分片有一个副本分片(默认一个索引创建后会有5个主分片,即:5主+5复制=10个分片),一个索引的副本分片的数量可以动态地调整,复制分片从不与它的主分片在同一个节点上(防止单点故障)。
副本分片有两个作用:
提高恢复能力:当主分片挂掉时,某个副本分片可以变成主分片;提高性能:get 和 search 请求既可以由主分片又可以由副本分片处理;实例
一共3个节点,一个索引 test,test 索引有5个主分片(边框加粗),5个副本分片(边框不加粗),分片会别均匀的分布到每个节点中。
干掉node3,node3 从集群退出之后,集群在短时间内会对分片进行重新分布,当然遵循主、副分片不会在同一个Node。
如果我们继续把node2干掉,那么整个集群就挂了,集群健康值:未连接。因为当前可用的主节点数 1 < discovery.zen.minimum_master_nodes 设置的 2。
我们尝试把 discovery.zen.minimum_master_nodes 设置成 1,然后重启启动一个节点,会发现有一个 Unassigned 的节点,集群健康值:yellow (5 of 10)。这种情况下代表主分片全部可用,存在不可用的副本分片,5个副本分片没有分配到节点上,不过此时的集群是可用的,我们任何请求都能处理,只是所有的操作都落到主分片上,而且可能引发单点故障。当我们把第二个节点启动后,一切就恢复正常了,主分片的数据会同步到副本分片。
实际生产环境,每个节点可能设置不同的节点类型,我们在3个节点的基础上再增加两个节点,然后调整 node.master 和node.data 的值,最终设置为2个主节点,2个数据节点,1个网关节点。
node1 和 node2 是具有主节点选举权限的节点,这里 node1 被选举为master节点。node3 和 node4 是数据节点,所以数据分片只会分配在这两个节点上。node5 是网关节点,最终是对请求起到负载均衡的作用。
elasticsearch-head 安装介绍 - 简书 (jianshu.com)https://www.jianshu.com/p/e3f7bf6277f9elasticsearch-head 是用于监控 Elasticsearch 状态的客户端插件,包括数据可视化、执行增删改查操作等。