《Elasticsearch源码解析与优化实战》是一本关于搜索引擎Elasticsearch的深入解析和优化的实践指南,作为一个开源的全文搜索引擎,Elasticsearch在大规模集群应用时常常面临各种问题,难以逐一分析和处理,这本书通过对Elasticsearch中重要模块的分析,揭示了其实现原理和机制,帮助读者深入理解搜索优化的关键点,除了解析源码,本书还提供了实践经验和示例,使得读者不仅能知其然,还能知其所以然,无论是对于有Elasticsearch使用经验的开发者,还是对搜索引擎感兴趣的技术人员,这本书都是一本不可多得的宝典。
Elasticsearch源码解析与优化实战 电子书
内容介绍
这书详细介绍了Elasticsearch的系统软件基本原理,致力于协助阅读者掌握其內部基本原理、设计方案观念,及其在环境中怎样恰当地布署、优化软件。系统软件基本原理分两层面详细介绍,一方面详解关键步骤,比如起动步骤、选主流程、修复步骤;另一方面详细介绍各关键控制模块的保持,及其控制模块相互关系,比如gateway控制模块、allocation控制模块等。这书的*后一部分详细介绍怎样提升载入速率、检索速率等大伙儿关注的具体难题,并出示了一些确诊难题的方式和专用工具供阅读者参照。
目录
- 第1章 走进Elasticsearch
- 1.1 基本概念和原理
- 1.1.1 索引结构
- 1.1.2 分片(shard)
- 1.1.3 动态更新索引
- 1.1.4 近实时搜索
- 1.1.5 段合并
- 1.2 集群内部原理
- 1.2.1 集群节点角色
- 1.2.2 集群健康状态
- 1.2.3 集群状态
- 1.2.4 集群扩容
- 1.3 客户端API
- 1.4 主要内部模块简介
- 1.4.1 模块结构
- 1.4.2 模块管理
- 第2章 准备编译和调试环境
- 2.1 编译源码
- 2.1.1 准备JDK和Gradle
- 2.1.2 下载源代码
- 2.1.3 编译项目,打包
- 2.1.4 将工程导入IntelliJ IDEA
- 2.2 调试Elasticsearch
- 2.2.1 本地运行、调试项目
- 2.2.2 远程调试
- 2.3 代码书签和断点组
- 第3章 集群启动流程
- 3.1 选举主节点
- 3.2 选举集群元信息
- 3.3 allocation过程
- 3.4 index recovery
- 3.5 集群启动日志
- 3.6 小结
- 第4章 节点的启动和关闭
- 4.1 启动流程做了什么
- 4.2 启动流程分析
- 4.2.1 启动脚本
- 4.2.2 解析命令行参数和配置文件
- 4.2.3 加载安全配置
- 4.2.4 检查内部环境
- 4.2.5 检测外部环境
- 4.2.6 启动内部模块
- 4.2.7 启动keepalive线程
- 4.3 节点关闭流程
- 4.4 关闭流程分析
- 4.5 分片读写过程中执行关闭
- 4.6 主节点被关闭
- 4.7 小结
- 第5章 选主流程
- 5.1 设计思想
- 5.2 为什么使用主从模式
- 5.3 选举算法
- 5.4 相关配置
- 5.5 流程概述
- 5.6 流程分析
- 5.6.1 选举临时Master
- 5.6.2 投票与得票的实现
- 5.6.3 确立Master或加入集群
- 5.7 节点失效检测
- 5.7.1 NodesFaultDetection事件处理
- 5.7.2 MasterFaultDetection事件处理
- 5.8 小结
- 第6章 数据模型
- 6.1 PacificA算法
- 6.1.1 数据副本策略
- 6.1.2 配置管理
- 6.1.3 错误检测
- 6.2 ES的数据副本模型
- 6.2.1 基本写入模型
- 6.2.2 写故障处理
- 6.2.3 基本读取模型
- 6.2.4 读故障处理
- 6.2.5 引申的含义
- 6.2.6 系统异常
- 6.3 Allocation IDs
- 6.3.1 安全地分配主分片
- 6.3.2 将分配标记为陈旧
- 6.2.3 一个例子
- 6.3.4 不会丢失全部
- 6.4 Sequence IDs
- 6.4.1 Primary Terms和Sequence Numbers
- 6.4.2 本地及全局检查点
- 6.4.3 用于快速恢复(Recovery)
- 6.5 _version
- 第7章 写流程
- 7.1 文档操作的定义
- 7.2 可选参数
- 7.3 Index/Bulk基本流程
- 7.4 Index/Bulk详细流程
- 7.4.1 协调节点流程
- 7.4.2 主分片节点流程
- 7.4.3 副分片节点流程
- 7.5 I/O异常处理
- 7.5.1 Engine关闭过程
- 7.5.2 Master的对应处理
- 7.5.3 异常流程总结
- 7.6 系统特性
- 7.7 思考
- 第8章 GET流程
- 8.1 可选参数
- 8.2 GET基本流程
- 8.3 GET详细分析
- 8.3.1 协调节点
- 8.3.2 数据节点
- 8.4 MGET流程分析
- 8.5 思考
- 第9章 Search流程
- 9.1 索引和搜索
- 9.1.1 建立索引
- 9.1.2 执行搜索
- 9.2 search type
- 9.3 分布式搜索过程
- 9.3.1 协调节点流程
- 9.3.2 执行搜索的数据节点流程
- 9.4 小结
- 第10章 索引恢复流程分析
- 10.1 相关配置
- 10.2 流程概述
- 10.3 主分片恢复流程
- 10.4 副分片恢复流程
- 10.4.1 流程概述
- 10.4.2 synced flush机制
- 10.4.3 副分片节点处理过程
- 10.4.4 主分片节点处理过程
- 10.5 recovery速度优化
- 10.6 如何保证副分片和主分片一致
- 10.7 recovery相关监控命令
- 10.8 小结
- 第11章 gateway模块分析
- 11.1 元数据
- 11.2 元数据的持久化
- 11.3 元数据的恢复
- 11.4 元数据恢复流程分析
- 11.4.1 选举集群级和索引级别的元数据
- 11.4.2 触发allocation
- 11.5 思考
- 第12章 allocation模块分析
- 12.1 什么是allocation
- 12.2 触发时机
- 12.3 allocation模块结构概述
- 12.4 allocators
- 12.5 deciders
- 12.5.1 负载均衡类
- 12.5.2 并发控制类
- 12.5.3 条件限制类
- 12.6 核心reroute实现
- 12.6.1 集群启动时reroute的触发时机
- 12.6.2 流程分析
- 12.6.3 gatewayAllocator
- 12.6.4 shardsAllocator
- 12.7 从gateway到allocation流程的转换
- 12.8 从allocation流程到recovery流程的转换
- 12.9 思考
- 第13章 Snapshot模块分析
- 13.1 仓库
- 13.2 快照
- 13.2.1 创建快照
- 13.2.2 获取快照信息
- 13.2.3 快照status
- 13.2.4 取消、删除快照和恢复操作
- 13.3 从快照恢复
- 13.3.1 部分恢复
- 13.3.2 恢复过程中更改索引设置
- 13.3.3 监控恢复进度
- 13.4 创建快照的实现原理
- 13.4.1 Lucene文件格式简介
- 13.4.2 协调节点流程
- 13.4.3 主节点流程
- 13.4.4 数据节点流程
- 13.5 删除快照实现原理
- 13.5.1 协调节点流程
- 13.5.2 主节点流程
- 13.6 思考与总结
- 第14章 Cluster模块分析
- 14.1 集群状态
- 14.2 内部封装和实现
- 14.2.1 MasterService
- 14.2.2 ClusterApplierService
- 14.2.3 线程池
- 14.3 提交集群任务
- 14.3.1 内部模块如何提交任务
- 14.3.2 任务提交过程实现
- 14.4 集群任务的执行过程
- 14.5 集群状态的发布过程
- 14.5.1 增量发布的实现原理
- 14.5.2 二段提交总流程
- 14.5.3 发布过程
- 14.5.4 提交过程
- 14.5.5 异常处理
- 14.6 应用集群状态
- 14.7 查看等待执行的集群任务
- 14.8 任务管理API
- 14.8.1 列出运行中的任务
- 14.8.2 取消任务
- 14.9 思考与总结
- 第15章 Transport模块分析
- 15.1 配置信息
- 15.1.1 传输模块配置
- 15.1.2 通用网络配置
- 15.2 Transport总体架构
- 15.2.1 网络层
- 15.2.2 服务层
- 15.3 REST解析和处理
- 15.4 RPC实现
- 15.4.1 RPC的注册和映射
- 15.4.2 根据Action获取处理类
- 15.5 思考与总结
- 第16章 ThreadPool模块分析
- 16.1 线程池类型
- 16.1.1 fixed
- 16.1.2 scaling
- 16.1.3 direct
- 16.1.4 fixed_auto_queue_size
- 16.2 处理器设置
- 16.3 查看线程池
- 16.3.1 cat thread pool
- 16.3.2 nodes info
- 16.3.3 nodes stats
- 16.3.4 nodes hot threads
- 16.3.5 Java的线程池结构
- 16.4 ES的线程池实现
- 16.4.1 ThreadPool类结构与初始化
- 16.4.2 fixed类型线程池构建过程
- 16.4.3 scaling类型线程池构建过程
- 16.4.4 direct类型线程池构建过程
- 16.4.5 fixed_auto_queue_size类型线程池构建过程
- 16.5 其他线程池
- 16.6 思考与总结
- 第17章 Shrink原理分析
- 17.1 准备源索引
- 17.2 缩小索引
- 17.3 Shrink的工作原理
- 17.3.1 创建新索引
- 17.3.2 创建硬链接
- 17.3.3 硬链接过程源码分析
- 第18章 写入速度优化
- 18.1 translog flush间隔调整
- 18.2 索引刷新间隔refresh_interval
- 18.3 段合并优化
- 18.4 indexing buffer
- 18.5 使用bulk请求
- 18.5.1 bulk线程池和队列
- 18.5.2 并发执行bulk请求
- 18.6 磁盘间的任务均衡
- 18.7 节点间的任务均衡
- 18.8 索引过程调整和优化
- 18.8.1 自动生成doc ID
- 18.8.2 调整字段Mappings
- 18.8.3 调整_source字段
- 18.8.4 禁用_all字段
- 18.8.5 对Analyzed的字段禁用Norms
- 18.8.6 index_options 设置
- 18.9 参考配置
- 18.10 思考与总结
- 第19章 搜索速度的优化
- 19.1 为文件系统cache预留足够的内存
- 19.2 使用更快的硬件
- 19.3 文档模型
- 19.4 预索引数据
- 19.5 字段映射
- 19.6 避免使用脚本
- 19.7 优化日期搜索
- 19.8 为只读索引执行force-merge
- 19.9 预热全局序号(global ordinals)
- 19.10 execution hint
- 19.11 预热文件系统cache
- 19.12 转换查询表达式
- 19.13 调节搜索请求中的batched_reduce_size
- 19.14 使用近似聚合
- 19.15 深度优先还是广度优先
- 19.16 限制搜索请求的分片数
- 19.17 利用自适应副本选择(ARS)提升ES响应速度
- 第20章 磁盘使用量优化
- 20.1 预备知识
- 20.1.1 元数据字段
- 20.1.2 索引映射参数
- 20.2 优化措施
- 20.2.1 禁用对你来说不需要的特性
- 20.2.2 禁用doc values
- 20.2.3 不要使用默认的动态字符串映射
- 20.2.4 观察分片大小
- 20.2.5 禁用_source
- 20.2.6 使用best_compression
- 20.2.7 Fource Merge
- 20.2.8 Shrink Index
- 20.2.9 数值类型长度够用就好
- 20.2.10 使用索引排序来排列类似的文档
- 20.2.11 在文档中以相同的顺序放置字段
- 20.3 测试数据
- 第21章 综合应用实践
- 21.1 集群层
- 21.1.1 规划集群规模
- 21.1.2 单节点还是多节点部署
- 21.1.3 移除节点
- 21.1.4 独立部署主节点
- 21.2 节点层
- 21.2.1 控制线程池的队列大小
- 21.2.2 为系统cache保留一半物理内存
- 21.3 系统层
- 21.3.1 关闭swap
- 21.3.2 配置Linux OOM Killer
- 21.3.3 优化内核参数
- 21.4 索引层
- 21.4.1 使用全局模板
- 21.4.2 索引轮转
- 21.4.3 避免热索引分片不均
- 21.4.4 副本数选择
- 21.4.5 Force Merge
- 21.4.6 Shrink Index
- 21.4.7 close索引
- 21.4.8 延迟分配分片
- 21.4.9 小心地使用fielddata
- 21.5 客户端
- 21.5.1 使用REST API而非Java API
- 21.5.2 注意429状态码
- 21.5.3 curl的HEAD请求
- 21.5.4 了解你的搜索计划
- 21.5.5 为读写请求设置比较长的超时时间
- 21.6 读写
- 21.6.1 避免搜索操作返回巨大的结果集
- 21.6.2 避免索引巨大的文档
- 21.6.3 避免使用多个_type
- 21.6.4 避免使用_all字段
- 21.6.5 避免将请求发送到同一个协调节点
- 21.7 控制相