当前位置: 首页 > article >正文

易考八股文之Elasticsearch合集

1、为什么要使用 Elasticsearch?

        系统中的数据, 随着业务的发展, 时间的推移, 将会非常多,而业务中往往采用模糊查询进行数据的 搜索,而模糊查询会导致查询引擎放弃索引, 导致系统查询数据时都是全表扫描,在百万级别的数据库中, 查询效率是非常低下的,而我们使用 ES  做一个全文索引, 将经常查询的系统功能的某些字段,比如说电商系统的商品表中商品名,描述、价格还有 id 这些字段我们放入 ES 索引库里,可以提高查询速度。

2、Elasticsearch 的 master 选举流程?

  • Elasticsearch 的选主是 ZenDiscovery 模块负责的, 主要包含 Ping(节点之间通过这个 RPC 来发现彼此)和 Unicast (单播模块包含一个主机列表以控制哪些节点需要 ping 通)这两部分

  • 对所有可以成为 master 的节点(node.master:  true)根据 nodeId 字典排序,每次选举每个节点都把自己所知道节点排一次序,然后选出第一个(第 0 位)节点, 暂且认为它是 master 节点

  • 如果对某个节点的投票数达到一定的值(可以成为 master 节点数 n/2+1) 并且该节点自己也选举自己,那这个节点就是 master 。否则重新选举一直到满足上述条件

  • master 节点的职责主要包括集群、节点和索引的管理, 不负责文档级别的管理;data 节点可以关闭 http功能

3、Elasticsearch 集群脑裂问题?

所谓脑裂问题(类似于精神分裂),就是同一个集群中的不同节点,对于集群的状态有了不一样的理解。

由于某些节点的失效,部分节点的网络连接会断开,并形成一个与原集群一样名字的集群,这种情况成为集群脑裂(split-brain)现象。这个问题非常危险,因为两个新形成的集群会同时索引和修改集群的数据。

“脑裂”问题可能的成因:

  • 网络问题:集群间的网络延迟导致一些节点访问不到 master,认为 master  挂掉了从而选举出新的master,并对 master 上的分片和副本标红,分配新的主分片

  • 节点负载:主节点的角色既为 master 又为 data,访问量较大时可能会导致 ES 停止响应造成大面积延迟,此时其他节点得不到主节点的响应认为主节点挂掉了,会重新选取主节点。

  • 内存回收:data 节点上的 ES 进程占用的内存较大,引发 JVM 的大规模内存回收,造成 ES 进程失去响应

脑裂问题解决方案:

  • 减少误判:discovery.zen.ping_timeout 节点状态的响应时间, 默认为 3s,可以适当调大,如果 master在该响应时间的范围内没有做出响应应答,判断该节点已经挂掉了。调大参数(如 6s , discovery.zen.ping_timeout:6 ) ,可适当减少误判。

  • 选举触发: discovery.zen.minimum_master_nodes:1,该参数是用于控制选举行为发生的最小集群主节点数量。当备选主节点的个数大于等于该参数的值, 且备选主节点中有该参数个节点认为主节点挂了, 进行选举。官方建议为(n/2) +1,n 为主节点个数 (即有资格成为主节点的节点个数)

  • 角色分离:即 master 节点与data 节点分离,限制角色

    • 主节点配置为:node.master: true node.data: false

    • 从节点配置为:node.master: false node.data: true

4、elasticsearch 了解多少,说说你们公司 es 的集群架构,索引数据大小,分片有多少,以及一些调优手段 。

面试官:想了解应聘者之前公司接触的 ES 使用场景、规模,有没有做过比较大规模的索引设计、规划、调优。

解答:如实结合自己的实践场景回答即可。

比如:ES 集群架构 13 个节点,索引根据通道不同共 20+索引,根据日期,每日递增 20+,索引:10分片,每日递增 1 亿+数据,每个通道每天索引大小控制:150GB 之内。

仅索引层面调优手段:

设计阶段调优

  1. 根据业务增量需求,采取基于日期模板创建索引,通过 roll over API 滚动索引;

  2. 使用别名进行索引管理;

  3. 每天凌晨定时对索引做 force_merge 操作,以释放空间;

  4. 采取冷热分离机制,热数据存储到 SSD,提高检索效率;冷数据定期进行 shrink操作,以缩减存储;

  5. 采取 curator 进行索引的生命周期管理;

  6. 仅针对需要分词的字段,合理的设置分词器;

  7. Mapping 阶段充分结合各个字段的属性,是否需要检索、是否需要存储等。……..

写入调优

  1. 写入前副本数设置为 0;

  2. 写入前关闭 refresh_interval 设置为-1,禁用刷新机制;

  3. 写入过程中:采取 bulk 批量写入;

  4. 写入后恢复副本数和刷新间隔;

  5. 尽量使用自动生成的 id。

查询调优

  1. 禁用 wildcard;

  2. 禁用批量 terms(成百上千的场景);

  3. 充分利用倒排索引机制,能 keyword 类型尽量 keyword;

  4. 数据量大时候,可以先基于时间敲定索引再检索;

  5. 设置合理的路由机制

5.在并发情况下,Elasticsearch 如果保证读写一致?

  • 可以通过版本号使用乐观并发控制,以确保新版本不会被旧版本覆盖,由应用层来处理具体的冲突;

  • 对于写操作,一致性级别支持 quorum/one/all,默认为 quorum,即只有当大多数分片可用时才允许写操作。但即使大多数可用, 也可能存在因为网络等原因导致写入副本失败, 这样该副本被认为故 障,分片将会在一个不同的节点上重建。

  • 对于读操作, 可以设置 replication 为 sync(默认),这使得操作在主分片和副本分片都完成后才会返回;如果设置 replication 为 async 时,也可以通过设置搜索请求参数_preference 为 primary 来查询主分片, 确保文档是最新版本。


http://www.kler.cn/a/399273.html

相关文章:

  • 2024山西省网络建设运维第十八届职业院校技能大赛解析答案(3. ansible 服务)
  • 【Fargo】23:采集时间转rtp时间
  • Docker:查看镜像里的文件
  • 使用win32com将ppt(x)文件转换为pdf文件
  • Linux Android 正点原子RK3568替换开机Logo完整教程
  • 【Linux庖丁解牛】—Linux基本指令(下)!
  • 微信小程序自定义顶部导航栏(适配各种机型)
  • IOException: Broken pipe与IOException: 远程主机强迫关闭了一个现有的连接
  • C语言项⽬实践-贪吃蛇
  • Asp.net Mvc 电脑销售系统
  • @ComponentScan:Spring Boot中的自动装配大师
  • Ubuntu下Xshell连接腾讯云服务器
  • 第26天进程(一)
  • 创建型设计模式与面向接口编程
  • w040基于web的社区医院信息平台
  • 【MYSQL】锁详解(全局锁、表级锁、行级锁)【快速理解】
  • STL关联式容器介绍
  • 预处理(1)(手绘)
  • 【Axure原型分享】轮播表格_开始暂停效果
  • 基于语法树的SQL自动改写工具开发系列(2)-使用PYTHON进行简单SQL改写的开发实战
  • LeetCode题解:18.四数之和【Python题解超详细】,三数之和 vs. 四数之和
  • redis类型介绍
  • docker .vhdx文件压缩
  • Linux性能优化之火焰图简介
  • Failed to create a temp file - Jenkins 无法创建任务
  • SpringCloud篇(服务保护 - Sentinel)