ES常识

一、概述
ES集群由若干节点组成,这些节点在同一个网络内,cluster-name相同
1.master节点:它将负责管理集群范畴的变更,例如创建或删除索引,添加节点到集群或从集群删除节点
2.data节点:持有数据和倒排索引
3.client节点:如果将node.master属性和node.data属性都设置为false,那么该节点就是一个客户端节点,扮演一个负载均衡 的角色,将到来的请求路由到集群中的各个节点
二、分片
会对整个索引分片存储,分为主分片或从分片,从分片只是主分片的副本,并且主从分片可以交互存储在不同节点上。比如node1 是cars库的1、2主分片同时也可以是3的从分片,node2上是cars库的1、2的从分片同时是3的主分片。主从分片不是跟着node固定的
三、Master选举机制
Elasticsearch的选主是ZenDiscovery模块负责的,主要包含Ping(节点之间通过这个RPC来发现彼此)和Unicast(单播模块包含一个主机列表以控制哪些节点需要ping通)这两部分;
对所有可以成为master的节点(候选主节点)(node.master: true)根据nodeId字典排序,每次选举每个节点都把自己所知道节点排一次序,然后选出第一个(第0位)节点,暂且认为它是master节点。
如果对某个节点的投票数达到一定的值(可以成为master节点数n/2+1)并且该节点自己也选举自己,那这个节点就是master。否则重新选举一直到满足上述条件。
补充:master节点的职责主要包括集群、节点和索引的管理,不负责文档级别的管理;data节点可以关闭http功能。
四、脑裂问题
当集群master候选数量不小于3个时,可以通过设置最少投票通过数量(discovery.zen.minimum_master_nodes为n/2+1)多半数,超过所有候选节点一半以上来解决脑裂问题;
当候选数量为两个时,只能修改为唯一的一个master候选,其他作为data节点,避免脑裂问题。
五、客户端在和集群连接时,如何选择特定的节点执行请求的?
TransportClient利用transport模块远程连接一个elasticsearch集群。它并不加入到集群中,只是简单的获得一个或者多个初始化的transport地址,并以 轮询 的方式与这些地址进行通信。
六、索引文档过程


image.png

七、详细描述一下Elasticsearch更新和删除文档的过程。
删除和更新也都是写操作,但是Elasticsearch中的文档是不可变的,因此不能被删除或者改动以展示其变更;
磁盘上的每个段都有一个相应的.del文件。当删除请求发送后,文档并没有真的被删除,而是在.del文件中被标记为删除。该文档依然能匹配查询,但是会在结果中被过滤掉。当段合并时,在.del文件中被标记为删除的文档将不会被写入新段。
在新的文档被创建时,Elasticsearch会为该文档指定一个版本号,当执行更新时,旧版本的文档在.del文件中被标记为删除,新版本的文档被索引到一个新段。旧版本的文档依然能匹配查询,但是会在结果中被过滤掉。
八、详细描述一下Elasticsearch搜索的过程。
Query Then Fetch


image.png

九、在并发情况下,Elasticsearch如果保证读写一致?
可以通过版本号使用乐观并发控制,以确保新版本不会被旧版本覆盖,由应用层来处理具体的冲突;
另外对于写操作,一致性级别支持quorum/one/all,默认为quorum,即只有当大多数分片可用时才允许写操作。但即使大多数可用,也可能存在因为网络等原因导致写入副本失败,这样该副本被认为故障,分片将会在一个不同的节点上重建。
对于读操作,可以设置replication为sync(默认),这使得操作在主分片和副本分片都完成后才会返回;如果设置replication为async时,也可以通过设置搜索请求参数_preference为primary来查询主分片,确保文档是最新版本。
十、如何监控Elasticsearch集群状态?
Marvel 让你可以很简单的通过 Kibana 监控 Elasticsearch。你可以实时查看你的集群健康状态和性能,也可以分析过去的集群、索引和节点指标。
十一、建立索引和查询的流程
建立索引的流程:
首先根据空白符进行分割再切分关键词,去除停用词,如果有英文全部转换为小写,对切分的关键词建立索引,每个关键词都有对应的id,还有一个倒排索引队列存储该关键词出现在文档的id,在该文档出现的次数,在该文档出现的位置
查询的流程:
首先根据空白符进行分割,再切分关键词,去除停用词,如果有英文全部转换为小写,将切分后的到的关键词和索引库进行匹配
中文分词器-IK
es官方提供的分词插件对中文分词效果不是很好,可以集成ik分词,对中文分词效果比较好
如果想根据自己的规则进行分词,可以自定义分词库,自定义分词库文件必须以.dic结尾,词库文件的编码为utf—8 without bom,一个词语一行,将自定义的文件库加入到ES_HOME/config/ik/ 目录下,修改ik的配置文件,重启生效

1.query是怎么分发到每个节点的?
QUERY_THEN_FETCH(默认)
a:客户端把请求发送给集群中的某一个节点,这个节点会把查询请求发送给所有分片去执行,
b:每个分片会把查询的数据(包含数据的分值,以及数据ID)返回给某一个 节点进行汇总,排序,取前10名
c:根据前10名的id到对应的分片查询数据的详细内容,返回给客户端

这种方案,解决了数据量的问题。
但是排名还有有问题。
2.Elasticsearch使用上的优化有哪些?
3.怎么避免脑裂?
4.query和filter的区别?
@1查询上下文中,查询操作不仅仅会进行查询,还会计算分值,用于确定相关度;在过滤器上下文中,查询操作仅判断是否满足查询条件
@2 过滤器上下文中,查询的结果可以被缓存。
5.Elasticsearch的缺点有哪些?你觉得可以在哪些地方进行改进?
6.Lucene加快查询的机制有哪些?
7.如何使用Lucene构建分布式索引?
8.说一下master节点选举算法
9.Elasticsearch出现OOM的场景遇到过吗?
10.说一下副本的作用。
11.每天2个TB的数据怎么规划集群?
12.比较一下向量空间模型和概率检索模型的优缺点。
13.DocValues的作用。
14.一个索引下多个type可能会导致什么样的问题?

你可能感兴趣的:(ES常识)