说说你们公司的集群架构,索引数据大小,分片有多少,以及一些调优手段
案例: ES集群架构13个节点,索引根据通道不同共20+索引,索引:10分片,每日递增1亿+数据,每个通道每天索引大小控制:150G内
设计阶段调优:
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.设置合理的路由机制
倒排索引是什么?
传统的我们检索是通过文章逐个遍历找到对应的关键词的
倒排索引:通过分词策略,形成了一个词与文章的映射关系表,这种词典+映射表。
实现原理:
FST 数据结构
空间占用小
查询速度快
elasticsearch 是如何实现master 选举的
前置条件:
只有候选主节点的节点才能成为主节点
最小主节点数的目的是防止脑裂
主节点负责管理集群的状态、创建/删除索引,跟踪哪些节点是集群的一部分,并决定将分片分配到那个节点上,当前主节点失败了,集群需要选出一个新的主节点来接替其职责。
1.初始化节点:当一个节点启动时,他会尝试联系其他已知的节点以加入集群。如果这是第一个启动的节点,它会自动成为主节点。
2.故障检测:每个节点都会定期向主节点发送心跳信号。如果一段时间内没有收到主节点的心跳响应,或者主节点不再响应,那么节点们就会认为当前的主节点已经失效。
3.选举过程:
当前检测到当前主节点不可用时,集群中所有具有资格的节点,都将参加新的主节点选举
选举过程中使用一种基于版本向量的算法来确保即使在网络分区的情况下也能选出单一的新主节点。
节点通过广播投票给其他节点来发起选举,每个节点都可以为自身或其他节点投票
如果某个节点接收到了足够的票数(超过半数),则该节点当选为主节点
如果一轮投票后没有节点获得多数票,则会开始新一轮得选举
4.选举后得处理
一旦新的主节点被选出来,它会通知集群中得其他节点,并接管管理集群得任务。此时,它会更新集群状态,包括重新分配未分配的分片等。
描述下elasticsearch 索引文档的过程
elasticsearch是一个基于lucene的分布式搜索和分析引擎,它允许用户存储、搜索、分析大量数据。 索引文档的过程涉及多个步骤,下面简单描述:
- 客户端向es集群发送一个http请求(创建/更新文档),这个请求中包含了要索引的数据以及目标索引
- es会根据文档的_id或者使用默认的hash算法来决定文档发送到哪个主分片上(如果没有指定id。会自动生成)
- 主分片收到文档后,会对文档进行一些列的操作(分析--使用配置好的分词器对文本字段进行分词;索引--创建倒排索引,这是lucene库提供的功能;存储--将原始文档和元数据存储起来,以便可以被检索)
- 一旦主分片完成了文档的处理他会将新的文档复制到相应的副分片上去,副本分片执行与主分片执行相同的过程
- 当所有相关的主分片和副分片都成功处理了文档后,es会返回一个成功的响应给客户端
- 如果设置为同步操作,es只会收到所有相关分片的成功响应之后才会向客户端返回结果;如果是异步操作,则可能在主分片完成时就返回响应,而副本分片的操作将在后台继续进行。
- 默认情况下,es每秒自动刷新一次索引,使得新索引的文档能够被搜索到(也可以手动触发刷新过程)
- 刷新操作使得内存中的更改持久化到文件系统缓存,并且使得这些更改对索引可见,但它不意味数据已经写入磁盘
- 在后台,es会定期地进行段合并,这是一个优化过程,将较小的段合并成为较大的段,从而提高搜索性能并释放资源
- 最终,es将索引状态提交到磁盘,这个过程是幂等的,并保证即使发生崩溃,数据也不会丢失