

## Elasticsearch 高可用
### 前置知识
- Elasticsearch 节点角色
- 候选主节点
- 协调节点
- 数据节点
- 热数据节点
- 暖数据节点
- 冷数据节点
- 写入数据
- 写文档
- 先写 Buffer
- 再写 Page Cache
- 段
- 段合并(过程叫 refresh)
- 最后刷盘
- 写 Translog
- 只追加
- 定时刷盘
- 索引与分片
- 索引包含数据本身
- 一个索引多个分片
- 分片由主从分片构成
### 优化方案
- 限流保护节点
- Elasticsearch 插件
- 网关/代理(如极限网关)
- 客户端限流
- 利用消息队列削峰
- 流程
- 数据写入数据库
- 监听 binlog,发消息到消息队列
- 消费消息,写入 Elasticsearch
- 变种
- 降级(降不重要消费者)
- 降级(停写入业务,腾资源给读请求)
- 保护协调节点
- 瓶颈(类似分库分表代理,性能&可用性)
- 措施
- 使用单一角色
- 分组与隔离(联动微服务)
- 重要请求用专属协调节点
- 大请求用专属协调节点
- 双集群
- CCR(钞能力)
- 消息队列双写
- 写入
- 写入数据到消息队列
- 两个消费者分别消费,插入 AB 集群
- 读取
- 客户端容错
- DNS 容错
## Elasticsearch 高性能
### Elasticsearch 的倒排索引
- 步骤
- 1. 将文档切割成关键词
- 2. 为每个关键词建立倒排索引
- 倒排索引
- key:关键词
- value
- 文档 ID
- 关键词位置:第几个词
- 关键词偏移量:首字符位置
- 出现频率:相关性强弱
- FST
- 利用 FST 来定位 Block
### 优化方案
- 优化分页查询
- 尽量和分库分表关联在一起
- 分页的难点:FROM X SIZE Y => N * (X + Y)
- 优化方案
- Scroll 和 Scroll Scan — 不适合深度分页
- Search After — 近似于禁用跳页方案
- 批量提交(Kafka 中也用过)
- 单个-聚合
- 单个发送转批量发送优化方案
- 消息队列消息积压优化方案
- 优化批次大小
- 调大批次
- 降级丢弃数据
- 调大 index.refresh_interval
- 简单好用的手段
- 优化不必要字段
- 只同步被查询的字段
- 回查主表获得全部数据
- 类似于分库分表中间表查询方案
- 注意:索引字段只加不减,减少字段只能新建索引
- 冷热分离
- 微服务、Redis 等多地可借鉴
- 热点节点:高性能高可用
- 冷节点:廉价量大管饱
- 利用生命周期管理自动将数据从热点节点迁移到冷节点
- 常规优化方案
- 优化垃圾回收
- 使用 G1/ZGC;停顿时间减少
- 基于 JVM 的中间件都可用的优化方式
- 优化 swap
- 直接禁用
- 调整 vm.swappiness
- 调整 vm.swappiness
- 文件描述符