【技术分享】《深入理解Elasticsearch》读书笔记

题记

由于之前已经梳理过Elasticsearch基础概念且在项目中实战过Elasticsearch的增删改查、聚类、排序等相关操作,对Elasticsearch算是有了一定的认知。但是,仍然对于一些底层的原理认知模糊,特买来《深入理解Elasticsearch》过了一遍,第一章到第四章偏应用,跟着敲一遍代码基本就能理解原理,第五章到第九章偏理论。现将书中一些细节知识点结合官网文档梳理如下。

第五章 分布式索引架构

如何选择合适的分片和副本数?

  • 目的:规划索引及配置,适应应用的变化。
  • 正确认知:分片数索引创建后不可以修改,副本数索引创建后可以通过API随时修改。
  • 多副本的缺点:额外副本占据了额外的存储空间,构建索引副本的开销也随之增大。
  • 同时要注意:如果不创建副本,当主分片发生问题时,可能会造成数据的丢失。
  • 配置参考:最理想的分片数量应该依赖于节点的数量。
  • 参考公式:所需的最大节点数 = 分片数 *(副本数+1)
    举例:你计划5个分片和1个副本,那么所需要的最大的节点数为:5*(1+1)=10个节点。

可不可以基于时间构建索引?

  • 目的:选择感兴趣的索引上进行查询,历史索引(时间比较久)的定期删除。
  • 正确操作方法:通过名称为logs_2017_01, logs_2017_02,…..logs_2017_12来构建索引。

第六章 底层索引控制

什么是段?

Elasticsearch中的每个分片包含多个segment(段),每一个segment都是一个倒排索引;在查询的时,会把所有的segment查询结果汇总归并为最终的分片查询结果返回。

在创建索引的时候,ES会把文档信息写到内存bugffer中(为了安全,也一起写到translog),定时(可配置)把数据写到segment缓存小文件中,然后刷新查询,使刚写入的segment可查。

虽然写入的segment可查询,但是还没有持久化到磁盘上。因此,还是会存在丢失的可能性的。所以,ES会执行flush操作,把segment持久化到磁盘上并清除translog的数据(因为这个时候,数据已经写到磁盘上,不再需要了)。
参考链接

什么是段合并?

由于自动刷新流程每秒会创建一个新的段,这样会导致短时间内的段数量暴增。而段数目太多会带来较大的麻烦。

  • 消耗资源:每一个段都会消耗文件句柄、内存和cpu运行周期;
  • 搜索变慢:每个搜索请求都必须轮流检查每个段,所以段越多,搜索也就越慢。
ES通过在后台进行段合并来解决这个问题。小的段被合并到大的段,然后这些大的段再被合并到更大的段。

段合并做了什么?

段合并的时候会将那些旧的已删除文档从文件系统中清除。

被删除的文档(或被更新文档的旧版本)不会被拷贝到新的大段中。

启动段合并不需要你做任何事。进行索引和搜索时会自动进行。

  • 当索引的时候,刷新(refresh)操作会创建新的段并将段打开以供搜索使用。
  • 合并进程选择一小部分大小相似的段,并且在后台将它们合并到更大的段中。这并不会中断索引和搜索。

为什么要进行段合并?

  • 索引段的个数越多,搜索性能越低并且消耗更多的内存;
  • 索引段是不可变的,你并不能物理上从中删除信息。(可以物理上删除document,但只是做了删除标记,物理上并没有删除)
  • 当段合并时,这些被标记为删除的文档并没有被拷贝至新的索引段中,这样,减少了最终的索引段中的document数目。

段合并的好处是什么?

  • 减少索引段的数量并提高检索速度;
  • 减少索引的容量(文档数)——段合并会移除被标记为已删除的那些文档。

段合并可能带来的问题?

  • 磁盘IO操作的代价;
  • 速度慢的系统中,段合并会显著影响性能。

第七章 管理Elasticsearch

有了副本机制为什么还需要集群备份?

Elasticsearch 副本提供了高可靠性;它们让你可以容忍零星的节点丢失而不会中断服务。

但是,副本并不提供对灾难性故障的保护。对这种情况,你需要的是对集群真正的备份——在某些东西确实出问题的时候有一个完整的拷贝。

集群如何备份?

使用 snapshot API备份你的集群。

它会拿到你集群里当前的状态和数据然后保存到一个共享仓库里。这个备份过程是”智能”的。
ES5.6集群备份官网参考

集群备份分类?

完整备份——你的第一个快照会是一个数据的完整拷贝。

增量备份——所有后续的快照会保留的是已存快照和新数据之间的差异。随着你不时的对数据进行快照,备份也在增量的添加和删除。这意味着后续备份会相当快速,因为它们只传输很小的数据量。

集群可以备份到哪里?

要使用这个功能,你必须首先创建一个保存数据的仓库。有多个仓库类型可以供你选择:

  • 共享文件系统,比如 NAS
  • HDFS (Hadoop集群分布式文件系统)

备份如何操作API?

PUT _snapshot/my_backup
{

"type": "fs",
"settings": {
    "location": "/mount/backups/my_backup"
}

}

注意:共享文件系统路径必须确保集群所有节点都可以访问到。

##第八章 提高性能

>####什么情况下会出现堆内存泄漏?

>>如果没有足够的堆内存来供你的应用在堆上创建新对象,JVM会抛出一个OutOfMemeory异常,这是一个内存出了问题的迹象,要么是没有足够的内存给它,要么是有内存泄漏,导致没有释放不再使用的对象。

>####推荐的性能测试工具?

>>- JMeter
- ab(Apache基准测试工具)

>####ES需要优化的原因?

>>- 硬件问题——如机械硬盘和固态硬盘;
- 不良的数据结构;
- 糟糕的查询设计——如wildcard模糊匹配很长的字符串。

>####后台什么在运行导致CPU飙升?如何排查?

>>热点线程APi能向你提供查找问题根源所必需的信息。
GET /_nodes/hot_threads?pretty

>####如何扩展集群?

>>- 垂直扩展
向Elasticsearch集群添加更多的资源。
制约因素如:JVM最大支持31GB物理内存。
- 水平扩展
索引多分片、多副本,集群中分散处理之。
优点:降低运行集群的成本。
版本升级后(如5.X升级到6.0),确保服务仍然可用。

>####集群架构设计考虑因素?

>>当你在设计架构、决定节点数量、有多少个索引以及每个索引的分片数量时,你需要把能接受的出现故障的节点数量考虑进去。

>>当然了,你还需要考虑性能,只不过冗余和高可用应该是进行扩展时的一个因子。

>####大规模集群节点角色如何设定?

>>为了有一个完全容错和高可用的集群,我们应该区分节点,为每个节点一个设计好的角色,角色分类如下:
- 路由节点或查询聚合节点;
发送子查询到其他节点,收集和合并结果,以及响应发出查询的客户端。

node.master: false
node.data: false

- 数据节点

node.master: false
node.data: true

- 候选主节点

node.master: true
node.data: false
http.enabled: false


>>候选主节点禁用Http协议是为了避免意外地在这些节点上进行查询。这样候选主节点相比于数据节点和路由节点可以使用更少的资源,可以确保它们仅仅被用来处理和主节点相关的工作。

>####高负载场景Elasticsearch优化的常规建议?

>>这里是建议,不是准则。
- 选择正确的存储,如:选择默认的default存储类型。
- 按需设定刷新频率
索引刷新频率定义:文档需要多长时间才能出现在搜索结果中。
- 正确认知:
刷新频率越短,查询越慢,且索引文档的吞吐率越低。
默认刷新频率:1s刷新一次。
无限的增加刷新时间是没有意义的,因为超过一定的值(取决于你的数据负载和数据量)之后,性能提升变得微乎其微。
- 线程池优化
线程池优化的必要场景:你看到节点正在填充队列并且仍然有计算能力剩余,且这些计算能力可以被指定用于处理待处理的任务。
- 调整合并过程
index.merge.policy.mery_factory低于默认值10,会导致更少的段,更低的RAM消耗,更快的查询速度和更慢的索引速度;
若大于10,导致索引由更多的分段组成,更高的RAM消耗,更慢的查询速度和更快的索引速度。
- 合理数据分布
高索引量的使用场景:把索引分散到多个分片上来降低服务器CPU和I/O子系统的压力。

>>如果你的节点无法处理查询带来的负载,你可以增加更多的ES节点,并增加副本的数量,于是主分片的物理拷贝会部署到新增节点上。这样会使得文档索引慢一些,但是会给你同时处理更多查询的能力。

>###高负载、高查询频率场景的建议

>>- 启动过滤器缓存和分片查询缓存
过滤器缓存配置:indices.cache.filter.size
分片查询缓存配置:indices.cache.query.enable
- 优化查询语句结构
书本中的过滤器已不再使用5.X以及更高版本。
但,依然可以优化查询语句,返回核对查询同样语句返回时间,进行权衡优化。
- 使用路由
有着相同路由值的数据都会保存到相同的分片上。
- 并行查询
建议数据平均分配,多个节点可以有相同的负载。
- 字段数据缓存和断路
当使用聚合和排序等字段数据缓存相关操作时,遇到了内存相关的问题(内存泄漏或者GC停顿),可以考虑使用 doc value。
- 控制size和shard_size
主要针对聚合操作。
增加size和shard_size能使得聚合结果更准确,代价是:更多的网络开销和内存使用;
减少size和shard_size能使得聚合不那么精确,代价是:网络开销小和内存使用率低。

>####高负载、高索引吞吐量场景

>>- 批量索引
批量索引代替逐个索引文档。
- doc values和索引速度的取舍
一方面:我们只关心更高的索引速度和更大的索引吞吐量,可以考虑不适用doc values。
另一方面:如果有大量的数据,为了使用聚合和排序功能而不产生内存相关问题,唯一选择——使用 doc values。
- 控制文档字段
方式一:_source 控制字段输出;
方式二:禁用_all。
减少文档的大小和其内文本字段的数量会让索引稍快一些。
- 索引的结构和副本
1) 主分片部署到所有的节点上,以便:并行的索引文档,加快索引的速度。
2)过多的副本导致索引速度下降。
- 调整预写日志。
- 存储优化
1)资金充足,建议购买SSD——原因:速度优势明显;
2)资金不足,考虑ES使用多个数据路径。
3)不要使用共享或者远程的文件系统保存索引——原因:速度慢,整体性能下降。
- 索引期间的内存缓存
建议给每个索引期间生效的分片分配512MB内存。
indices.memeory.index_buffer_size是设置节点的,而不是分片。

##小结

>书中基于ES1.X版本的一些优化细节,可能在5.X、6.X甚至更高版本中有所不同,需要根据实战需要、并结合最新官网文档更新相关知识。

作者:铭毅天下   文章转载自http://blog.csdn.net/laoyang360

阿里云Elasticsearch已正式发布啦,Elastic开源官方联合开发,集成5.3商业版本XPack功能,欢迎开通使用。
时间: 2024-10-22 00:58:42

【技术分享】《深入理解Elasticsearch》读书笔记的相关文章

《淘宝技术这十年》读书笔记 (四). 分布式时代和中间件

        前面两篇文章介绍了淘宝的发展历程.Java时代的变迁和淘宝开始创新技术:            <淘宝技术这十年>读书笔记 (一).淘宝网技术简介及来源            <淘宝技术这十年>读书笔记 (二).Java时代的脱胎换骨和坚若磐石            <淘宝技术这十年>读书笔记 (三).创造技术TFS和Tair        这篇文章主要讲述分布式时代和中间件相关知识,包括服务化.HSF.Notify和TDDL.同时里面有我们经常遇见的编

《淘宝技术这十年》读书笔记 (二).Java时代的脱胎换骨和坚若磐石

        马云说过"一个好的东西往往是是说不清楚的",姑且不论这句话的对与错.但我真的很佩服<淘宝技术这十年>这本书的作者子柳,能够通过淘宝的一些故事,按照时间顺序和IT发展的各种技术描述清楚,而且过程中读起来非常有意思.         该读书笔记中参杂了很多原文的知识,因为我实在无法割舍,都挺有意思的:同时记录一些有用的知识,通过这本书能介绍些学过的知识或面试中可能出现的题目及作者所思,文章还是非常有趣的,希望对大家有所帮助! 一. Java时代 脱胎换骨    

《淘宝技术这十年》读书笔记 (三). 创造技术TFS和Tair

        前面两篇文章介绍了淘宝的发展历程和Java时代的变迁:             <淘宝技术这十年>读书笔记 (一).淘宝网技术简介及来源             <淘宝技术这十年>读书笔记 (二).Java时代的脱胎换骨和坚若磐石         马云说过"创新不是为了与对手竞争,而是跟明天竞争",所以这篇文章讲述淘宝的创新技术TFS和Tair及创新的产品.         该篇文章不仅仅对在读大学生非常有所帮助,因为你能从文章中看到很多你需要学

《流媒体技术入门与提高》读书笔记

公司是搞视频类的互联网公司,本人虽为开发人员,但因为业务相关,因此也要懂得视频和流媒体方面的知识,于是把公司图书阁里的<流媒体技术入门与提高>借回来看.我手上的是第二版. 流式技术解决方案 所谓流式技术解决方案,即流媒体应用系统,典型的系统有:一.Real Networks:二.Windows Media:三.Adobe Flash:四.Apple QuickTime. 流媒体服务器使用特别的协议.HTTP 不是特别地适合流媒体,它内部有大量的数据构件,并缺少控制渠道,这就是为什么不能快速地做

将样式表放在顶部——高性能网站建设指南规则5(读书笔记)

PS:以下内容仅仅为个人读书笔记,如有错漏,随时欢迎指正.同时希望能有更多的前端爱好者们共同分享你们的心得! 背景 阅读<高性能网站建设指南>第五章,文章中, 作者建议最好将CSS文件(样式表)放在文档顶部,即<head>标签之间.当然这是在一定的应用前提之下的--该样式表在页面呈现时可能并 不需要,而是作用于由于用户与页面的交互行为而产生的动态标签.比方说你点击某个显示有"猛击我吧!!"的连接,然后页面弹出个DIV,用绿色字体和 24px的字号大小显示的标准国

『 读书笔记 』4月读书总结|博文推荐

原文链接:『 读书笔记 』4月读书总结|博文推荐 写在前面 计划是每月读 5-10 本书,书籍类型大概是三个方面的:金融,技术,管理.之所以选择这三个方面,一方面是因为自己对这三个方面都很有兴趣,其次是被 linkedin 创始人 Hoffman 的 ABZ 理论 深度影响.建议大家都看看 abz 理论那篇文章,如果我有空,也会整理一些常用的这类理论模型到博客里的. 月底读书总结的形式都很简单,只是简单的一个列表和简单的书评,对觉得比较好的书会有单独的读书笔记.另外推荐大家用 excel 来做一

Android应用开发提高系列(2)——《Practical Java 中文版》读书笔记(下)

声明 欢迎转载,但请保留文章原始出处:)  博客园:http://www.cnblogs.com 农民伯伯: http://over140.cnblogs.com   系列 Android应用开发提高系列(1)--<Practical Java 中文版>读书笔记(上)    正文  注意:条目和用语可能与书籍有所出入,但尽量保持原样加一些自己的理解. 一.性能 1. 先把焦点放在设计.数据结构和算法身上 备注:良好的设计.明智的选择数据结构和算法可能比高效代码更重要.   2.  不要依赖编译

《移动设备交互设计》读书笔记[1]

读书笔记,不是对书中的内容做完全的摘抄和援引,我是想把读过的内容,经过自己的理解归纳总结出来与大家分享讨论.一.如何理解移动设备 移动设备是相对于不可移动的设备,这里说的不可移动设备不仅指计算机设备,可以包括游戏机,甚至普通电视机.对应的会有掌上游戏机或是移动电视机等,当然,重要的还是我们大家都在讨论的可以做移动互联网应用的多功能手机.同时,还包括一些更广义的移动设备,比如: 1)可穿戴设备,目前这种设备可能还应用于军事和医疗方面,比如战斗机飞行员戴的可交互信息航空头盔,比如特种兵的数字头盔等.

091025 L DNA读书笔记

读书笔记和读后感 02 如何开始第一个工作     大企业,有很多好处.它与小企业的不同在于,小企业的竞争是对外的,而大企业的竞争则是来自于内部的.选择进入大企业的人,一定要有一个目标,多年后做到某个位置的目标.大企业适合喜欢跟同事竞争的人工作.     小企业,坏处是没有大企业的待遇好,不过可以学会更多的本领.     政府机关,如果选择到这里工作,那就是一个比较稳定的工作.在这里,如果比别人更勤奋的话,爬得也比别人快.     自由职业,如果选择这种方式工作,那么需要人有比较高的自我管控能力