新書推薦:
《
积极心理学
》
售價:HK$
57.3
《
自由,不是放纵
》
售價:HK$
56.4
《
甲骨文丛书·消逝的光明:欧洲国际史,1919—1933年(套装全2册)
》
售價:HK$
277.8
《
剑桥日本戏剧史(剑桥世界戏剧史译丛)
》
售價:HK$
207.0
《
中国高等艺术院校精品教材大系:材料的时尚表达??服装创意设计
》
售價:HK$
78.2
《
美丽与哀愁:第一次世界大战个人史
》
售價:HK$
147.2
《
国家豁免法的域外借鉴与实践建议
》
售價:HK$
188.2
《
大单元教学设计20讲
》
售價:HK$
78.2
|
編輯推薦: |
Elasticsearch 是一个开源的全文搜索引擎,很多用户对于大规模集群应用时遇到的各种问题难以分析处理,或者知其然而不知其所以然。本书分析 Elasticsearch 中重要模块及其实现原理和机制,让用户深入理解相关重要配置项意义,应对系统故障时不再迷茫。另外,本书提供实际应用场景中一些常见问题的优化建议,这些建议都是作者经过大规模测试及应用验证过的。
|
內容簡介: |
本书介绍了Elasticsearch的系统原理,旨在帮助读者了解其内部原理、设计思想,以及在生产环境中如何正确地部署、优化系统。系统原理分两方面介绍,一方面详细介绍主要流程,例如启动流程、选主流程、恢复流程;另一方面介绍各重要模块的实现,以及模块之间的关系,例如gateway模块、allocation模块等。本书的*后一部分介绍如何优化写入速度、搜索速度等大家关心的实际问题,并提供了一些诊断问题的方法和工具供读者参考。
|
關於作者: |
长期从事服务端和基础架构等研发工作,对搜索、分布式系统、高性能网络服务有浓厚的兴趣,喜欢探究技术本质,喜欢分析有深度的问题。目前就职于360企业安全集团基础大数据团队,负责平台内核研发工作。
|
目錄:
|
第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.1NodesFaultDetection事件处理
5.7.2MasterFaultDetection事件处理
5.8小结
第6章 数据模型
6.1PacificA算法
6.1.1数据副本策略
6.1.2配置管理
6.1.3错误检测
6.2ES的数据副本模型
6.2.1基本写入模型
6.2.2写故障处理
6.2.3基本读取模型
6.2.4读故障处理
6.2.5引申的含义
6.2.6系统异常
6.3Allocation IDs
6.3.1安全地分配主分片
6.3.2将分配标记为陈旧
6.2.3一个例子
6.3.4不会丢失全部
6.4Sequence IDs
6.4.1Primary Terms和Sequence Numbers
6.4.2本地及全局检查点
6.4.3用于快速恢复(Recovery)
6.5_version
第7章 写流程
7.1文档操作的定义
7.2可选参数
7.3IndexBulk基本流程
7.4IndexBulk详细流程
7.4.1协调节点流程
7.4.2主分片节点流程
7.4.3副分片节点流程
7.5IO异常处理
7.5.1Engine关闭过程
7.5.2Master的对应处理
7.5.3异常流程总结
7.6系统特性
7.7思考
第8章 GET流程
8.1可选参数
8.2GET基本流程
8.3GET详细分析
8.3.1协调节点
8.3.2数据节点
8.4MGET流程分析
8.5思考
第9章 Search流程
9.1索引和搜索
9.1.1建立索引
9.1.2执行搜索
9.2search 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.2synced flush机制
10.4.3副分片节点处理过程
10.4.4主分片节点处理过程
10.5recovery速度优化
10.6如何保证副分片和主分片一致
10.7recovery相关监控命令
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.3allocation模块结构概述
12.4allocators
12.5deciders
12.5.1负载均衡类
12.5.2并发控制类
12.5.3条件限制类
12.6核心reroute实现
12.6.1集群启动时reroute的触发时机
12.6.2流程分析
12.6.3gatewayAllocator
12.6.4shardsAllocator
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.1Lucene文件格式简介
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.1MasterService
14.2.2ClusterApplierService
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.2Transport总体架构
15.2.1网络层
15.2.2服务层
15.3REST解析和处理
15.4RPC实现
15.4.1RPC的注册和映射
15.4.2根据Action获取处理类
15.5思考与总结
第16章 ThreadPool模块分析
16.1线程池类型
16.1.1fixed
16.1.2scaling
16.1.3direct
16.1.4fixed_auto_queue_size
16.2处理器设置
16.3查看线程池
16.3.1cat thread pool
16.3.2nodes info
16.3.3nodes stats
16.3.4nodes hot threads
16.3.5Java的线程池结构
16.4ES的线程池实现
16.4.1ThreadPool类结构与初始化
16.4.2fixed类型线程池构建过程
16.4.3scaling类型线程池构建过程
16.4.4direct类型线程池构建过程
16.4.5fixed_auto_queue_size类型线程池构建过程
16.5其他线程池
16.6思考与总结
第17章 Shrink原理分析
17.1准备源索引
17.2缩小索引
17.3Shrink的工作原理
17.3.1创建新索引
17.3.2创建硬链接
17.3.3硬链接过程源码分析
第18章 写入速度优化
18.1translog flush间隔调整
18.2索引刷新间隔refresh_interval
18.3段合并优化
18.4indexing buffer
18.5使用bulk请求
18.5.1bulk线程池和队列
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.6index_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.10execution 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.7Fource Merge
20.2.8Shrink 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.5Force Merge
21.4.6Shrink Index
21.4.7close索引
21.4.8延迟分配分片
21.4.9小心地使用fielddata
21.5客户端
21.5.1使用REST API而非Java API
21.5.2注意429状态码
21.5.3curl的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控制相
|
內容試閱:
|
前言
我们可以在不关心原理的情况下使用Elasticsearch(以下简称ES),但要想用好ES,就必须熟知其内部原理。
为什么要阅读代码?在传统软件行业,技术文档非常丰富。当开展一个项目时,从需求分析,到概要设计、详细设计,每个步骤都有相应的文档,从项目的整体架构、技术方案选型,到流程图、类图,细化到每个接口及参数。在这种情况下,想要搞清楚系统原理,并不需要阅读代码,文档上什么都有。但是互联网产品迭代快,技术文档不全,想要搞清楚原理,只能阅读代码,相当于从代码中逆向理解设计思想。
通过分析源码,我们可以有以下收获:
理解设计思想 当我们面临要解决的问题或实现的目标时,往往有多种方案可以选择。无论表面上看起来多么简单的架构,其背后都经过了深思熟虑。思考一下为什么使用现在的方案?有没有更好的解决方案?
探究内部机制的原理 某个技术点是怎么实现的?
搞明白执行流程 某个过程是什么样的,都做了什么?有几步?先做什么,后做什么?
熟悉代码结构 如果需要进行二次开发,则给出代码入口和调用关系,有时候找到某个逻辑的代码实现要花很多时间。
学以致用 借鉴其设计理念,掌握其解决问题的方式和方法,将来面对类似的问题时可以参考。
本书结构
本书由四部分组成,第一部分为基础知识和环境准备(第1~2章);第二部分介绍ES的主要流程(第3~10章),包括集群启动流程、节点启动关闭流程、选主流程、读写流程、搜索流程和索引恢复流程;第三部分主要介绍重要内部模块(第11~17章),包括gateway模块、allocation模块、Snapshot模块、Cluster模块、Transport模块和ThreadPool模块等;第四部分介绍优化和诊断方法(第18~22章),包括写入速度优化、搜索速度优化、磁盘使用量优化,以及在生产环境中的实际应用建议,第22章介绍常用的问题诊断方法,排查集群遇到的问题。
术语约定
ES中有一些特有的概念,这些概念对应的中文翻译约定如下:
? 分片(shard);
? 主分片(primary shard),简称P;
? 分片副本(特指数据的一个分片,无论主分片,还是副分片);
? 副分片(replica shard),简称R;
? 分片分配(shard allocation);
? 集群状态(cluster state);
? 分配决策(allocation decision);
? 分配感知(allocation awareness);
? 分配标识(allocation IDs);
? 追踪(tracking);
? 事务日志(translog);
? 同步集合(in-sync set)。
行文约定
虽然本书是一本源码分析类图书,但原则上尽量少贴代码,引用的代码只是为了说明原理,因此所引用的代码并不保证和源码完全一致,对非核心逻辑有所删减,同时在代码块中,函数参数可能被省略,省略的函数参数用表示,如:
executeBulk...;
在引用代码中的某个方法时,使用#号分隔类名与方法名:
类名#方法名
一个索引由许多分片组成。我们用如下方式表示索引website的第0个分片:
website[0]
联系
读者有任何意见和建议都可以联系作者,邮箱:elasticsearchbook@163.com。
本书配套网站:www.elasticsearchbook.cn。
致谢
感谢李欣杰和郭东东,他们带我走进搜索领域;感谢韩洪伟,他让我学到了很多搜索系统的知识。欣杰和老韩都是资深的搜索架构师,能够和优秀的团队共事是我的荣幸。感谢ES团队的同事段军义,我们互相学习,一起解决了很多麻烦的问题。感谢出版社的策划编辑陈晓猛先生,他为本书的写作提供了很多建设性意见,并且耐心地编校了本书,让本书得以顺利出版。
感谢我的妻子和三岁的女儿,我爱你们!
张超
|
|