概念
集群
在同一个子网内,多个ES节点(master、data、client)组成的一个P2P系统。节点间的通讯和数据分配由ES自动管理。
节点
每一个运行的实例叫做节点。
索引
该索引是名词而不是动词,相当于MySQL里的database。如下图所示
分片与副本
ES自动将数据存储到多个主分片中,也就是说每个主分片保存着某索引的一部分数据。
副本分片是主分片的备份,拥有主分片的数据。一个主分片可以有多个副本。
建立索引的时候默认会建立5个主分片,每个主分片一个副本分片,一共10个分片。也可以在建立索引的时候手动设置主分片数量和副本分片数量。在索引建立完成后,就只能改变副本分片的数量。
ES禁止同一个分片的主分片和副本分片在同一个ES实例节点上。
master节点
在配置文件里配置节点为master节点。一个ES集群可以有多个master节点。master节点负责集群的变更。master节点不参与文档层面的变更和搜索,所以master节点并不会因为流量增长而成为瓶颈。
data节点
data节点持有数据和倒排索引。负责文档的搜索和存储。
client节点
node.master 和 node.data 都设置为false。该客户端节点扮演一个负载均衡的角色。将到来的请求路由到集群各个节点。
recovery
当集群中有节点加入或退出的时候,ES会自动重新分配分片。此代价较高。可以先将自动分片功能关闭,然后添加节点进入集群,手动给其节点分配分片,之后再打开自动分片功能。
自动发现机制
ES2.0之前采用的是ping机制,只要是在同一子网下网络可通且cluster.name相同,就将该节点加入集群。
ES2.0版本之后采用单播和组播的机制(默认单播):配置相同的cluster.name,然后设置discovery.zen.ping.unicast.hosts
ES的了解
功能特性
1.以Lucene搜索引擎库为底层架构
2.分布式搜索引擎,可水平扩展,比如添加节点的时候可以自动均衡数据
3.支持全文索引,搜索功能强大
4.交互数据采用josn模式,且ES提供了基于json的query DSL查询语言
缺点
1.不支持事务
2.读写有一定的延迟。写入的数据最快1s才能被检索到,这样做的原因是提高写入的吞吐量。这个刷新频率是可以手动调整的,一般情况下不建议手工调整。
3.ES没有任何内置的身份验证或授权系统。当然闭源的x-pack除外。
近实时的搜索
当文档写入的时候并不能直接检索出数据,默认需要1S的reflush才能看到。如果业务对实时性要求比较高,可以调用_refresh接口。
全文检索
对文章中的每个词建立一个索引,并指明该词在文章中的位置和数量。也就是说每个词元都是一个倒排索引。
当用户查询的时候,会根据建立的索引来进行查找。
ES没有事务,怎么解决并发冲突的问题呢?
1.悲观锁
- 优点:方便,直接加锁,不需要额外的操作
- 缺点:并发能力很低,同一时间只能有一条线程操作数据
2.乐观锁
- 优点:并发能力高,不给数据加锁,大量线程并发操作
- 缺点:麻烦,每次更新的时候都先要比对版本号,然后需要更新加载数据再修改再写入。
- ES中是通过乐观锁解决并发冲突的,采用_version
- _version :第一次创建document的时候,他的版本号为1,此后每次对该document进行update、delete都会对这个版本号自动加1 . 在删除一个document的时候,它不是立刻就物理删除的,它的一些版本号数据还是保留的:先删除再创建其实是再删除的基础上再加1.
ES的写逻辑
索引的写入:
索引的创建和删除都是在master节点上进行的。如果写入的请求发到了非master节点,那么该节点会将请求转发至master节点,master节点会更改路由和元数据信息,并将对应的修改同步到其他master节点,需要一半以上的候选master节点返回成功才算写入成功。
文档的写入:
请求发到其中一个节点,做路由计算(hash(_id)/候选master +1 )确定请求发往哪一个主分片。
主分片处理请求的同时,执行translog的写入操作和将请求发往其副本分片,等其中一个副本分片返回成功之后,主分片返回客户端写入成功。
常用插件
elasticseach-head
head插件只需要安装到其中一台机器上。
功能:ES集群状态查看、索引数据查看、DSL实现增删改查操作
cerebo插件
功能:集群监控
kibana
除了支持各种数据的可视化之外,最重要的是:支持Dev Tool进行RESTFUL API增删改查操作。
但是在功能和可用性上比不上grafana