image.png

image.png

## 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
  - 文件描述符