| 
 新書推薦:
 
  《 
			岁月的泡沫(波伏瓦、加缪的密友,法国文坛鬼才书写爱情霍乱!)
			》
 售價:HK$ 
			46.2
 
  《 
			索恩丛书·帝国计划:英国世界体系的兴衰(1830~1970)
			》
 售價:HK$ 
			185.9
 
  《 
			改变的勇气:数十个真实人生蜕变故事,教你改变命运的密码。
			》
 售價:HK$ 
			64.9
 
  《 
			明清时期的灾害治理机制
			》
 售價:HK$ 
			66.0
 
  《 
			甲骨文丛书·理查国王:尼克松和水门事件
			》
 售價:HK$ 
			108.9
 
  《 
			绣罗衣裳照暮春——古代服饰与时尚
			》
 售價:HK$ 
			93.5
 
  《 
			HR如何招聘人才:招聘思维与技能
			》
 售價:HK$ 
			61.6
 
  《 
			《汉印精选》
			》
 售價:HK$ 
			206.8
 
 
 | 
         
          | 編輯推薦: |   
          | 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团队的同事段军义,我们互相学习,一起解决了很多麻烦的问题。感谢出版社的策划编辑陈晓猛先生,他为本书的写作提供了很多建设性意见,并且耐心地编校了本书,让本书得以顺利出版。
 感谢我的妻子和三岁的女儿,我爱你们!
 张超
 |    |