当前位置: 首页 > news >正文

网站机房建设图网站建设验收单模板

网站机房建设图,网站建设验收单模板,做企业网站支付功能,甘肃建设网站文章目录01. ElasticSearch 倒排索引是什么#xff1f;02. ElasticSearch 倒排索引为什么是不可变的#xff1f;03. ElasticSearch 索引文档原理#xff1f;04. ElasticSearch 如何动态更新索引#xff1f;05. ElasticSearch 文档的新增、删除、更新#xff1f;06. Elasti… 文章目录01. ElasticSearch 倒排索引是什么02. ElasticSearch 倒排索引为什么是不可变的03. ElasticSearch 索引文档原理04. ElasticSearch 如何动态更新索引05. ElasticSearch 文档的新增、删除、更新06. ElasticSearch 搜索为什么是近实时的07. ElasticSearch 在什么情况下使用 refresh api 08. Elasticsearch 是怎样保证更新被持久化在断电时也不丢失数据?09. ElasticSearch 在什么情况下使用 flush api10. ElasticSearch 为什么需要段合并11. ElasticSearch 在什么情况下使用 optimize api12. 分片内部原理1. 索引的不可变性2. 动态更新索引3. 近实时搜索4. 持久化变更5. 段合并01. ElasticSearch 倒排索引是什么 Elasticsearch的倒排索引是一种数据结构它将每个单词与包含该单词的文档列表相关联。倒排索引的优势在于它可以快速地进行全文搜索和相关性评分。 倒排索引由3个主要部分组成词项、词汇表、倒排列表。其中词项是索引中最小的存储和查询单元。词汇表是一个包含所有单词的列表每个单词都有一个唯一的词项ID。倒排列表是一个包含每个单词的文档列表一个单词出现在哪些文档中每个文档都有一个唯一的文档ID。倒排列表还包含每个单词在每个文档中出现的位置和频率的信息。 当用户执行全文搜索时Elasticsearch将查询中的每个单词与词汇表中的词项进行匹配并检索包含这些单词的文档列表。然后Elasticsearch使用倒排列表中的信息来计算每个文档的相关性得分并将结果返回给用户。 ElasticSearch索引中索引了3个文档 文档id文档内容1谷歌地图之父跳槽Facebook2谷歌地图之父加盟Facebook3谷歌地图创始人离开谷歌加盟Facebook 倒排索引中需要记录的信息 单词id单词文档频率倒排列表文档id;单词频率;单词在文档中的位置1谷歌31;112;1;1,3;2;52地图31;122;1;2,3;1;23之父21;132;1;34跳槽21;145Facebook31;152;1;5,3;1;76加盟22;143;1;67创始人13;1;38离开13;1;4 以单词谷歌为例其单词编号为1文档频率为3代表有3个文档包含这个单词对应的倒排列表为{(1;1;1), (2;1;1), (3;2;1)}其含义为在文档1、2、3都出现过这个单词文档1和文档2中该单词出现的频率都为1出现位置也都是1即文档中第1个单词是谷歌。文档3中该单词出现的频率为2次出现的位置为1和5即文档3的第1个和第5个单词是谷歌。 02. ElasticSearch 倒排索引为什么是不可变的 倒排索引被写入磁盘后是不可改变的它永远不会修改。不变性有重要的价值 ① 不需要锁。如果你从来不更新索引你就不需要担心多进程同时修改数据的问题。 ② 一旦索引被读入内核的文件系统缓存便会留在哪里由于其不变性。只要文件系统缓存中还有足够的空间那么大部分读请求会直接请求内存而不会命中磁盘。这提供了很大的性能提升。 ③ 其它缓存(像filter缓存)在索引的生命周期内始终有效。它们不需要在每次数据改变时被重建因为数据不会变化。 ④ 写入单个大的倒排索引允许数据被压缩减少磁盘 I/O 和 需要被缓存到内存的索引的使用量。 当然一个不变的索引也有不好的地方。主要事实是它是不可变的! 你不能修改它。如果你需要让一个新的文档可被搜索你需要重建整个索引。这要么对一个索引所能包含的数据量造成了很大的限制要么对索引可被更新的频率造成了很大的限制。 03. ElasticSearch 索引文档原理 给定一个文档集合第一次索引文档时此时如何建立一个索引首先在内存里维护一个倒排索引当内存占满后将内存数据写入磁盘的临时文件第二阶段对临时文件进行合并形成最终索引。 ① 从磁盘读取文档对文档内容进行解析并在内存中建立一个倒排索引相当于对目前处理的文档子集单独在内存中建立起了一整套倒排索引和最终索引相比其结构和形式是相同的区别是这个索引只是部分文档的索引而非全部文档的索引。 ② 当内存占满后为了腾出内存空间将整个内存中建立的倒排索引写入磁盘临时文件中然后彻底清除所占内存这样就空出内存来进行后续文档的处理。 ③ 每一轮处理都会在磁盘产生一个对应的临时文件当所有文档处理完成后在磁盘中会有多个临时文件为了产生最终的索引需要将这些临时文件合并形成最终索引。 04. ElasticSearch 如何动态更新索引 倒排索引一旦被写入磁盘就是不可更改的没有写入磁盘前是可以更改的噢如果搜索引擎需要处理的文档集合是静态集合那么在索引建立好之后就可以一直用建好的索引响应用户查询请求。但是在真实环境中搜索引擎需要处理的文档集合往往是动态集合即在建好初始的索引后后续不断有新文档进入系统同时原先的文档集合内有些文档可能被删除或者内容被更改。问题是怎样在保留不变性的前提下实现倒排索引的更新呢答案是: 用更多的索引即增加临时索引。在动态更新索引中有3个关键的索引结构倒排索引、临时索引和已删除文档列表。 ① 倒排索引就是对初始文档集合建立好的索引结构该索引存在磁盘中不可改变。 ② 临时索引是在内存中实时建立的倒排索引该索引存储在内存中当新增文档进入系统解析文档之后更新内存中维护的临时索引文档中出现的每个单词在其倒排列表末尾追加倒排列表项随着新加入系统的文档越来越多临时索引消耗的内存也会随之增加一旦临时索引将指定的内存消耗光要考虑将临时索引的内容更新到磁盘索引中以释放内存空间来容纳后续的新进文档。 ③ 已删除文档列表则用来存储已被删除的文档的相应文档ID形成一个文档ID列表。这里需要注意的是当一篇文档内容被更改可以认为是旧文档先被删除之后向系统内增加一篇新的文档通过这种间接方式实现对内容更改的支持。 当系统发现有新文档进入时立即将其加入临时索引中。有文档被删除时则将其加入删除文档队列。文档被更改时则将原先文档放入删除队列解析更改后的文档内容并将其加入临时索引中。通过这种方式可以满足实时性的要求。 如果用户输入查询请求则搜索引擎同时从倒排索引和临时索引中读取用户查询单词的倒排列表找到包含用户查询的文档集合并对两个结果进行合并之后利用删除文档列表进行过滤将搜索结果中那些已经被删除的文档从结果中过滤形成最终的搜索结果并返回给用户。这样就能够实现动态环境下的准实时搜索功能。 注意在内存中的临时索引是不断变化的但是这个临时索引一旦写进磁盘就是不可变的。 05. ElasticSearch 文档的新增、删除、更新 在早期全文检索中为整个文档集合建立了一个很大的倒排索引并将其写入磁盘中如果需要让一个新的文档可被搜索你需要重建整个索引。这种方式在数据量很大时效率很低并且由于创建一次索引的成本很高所以对数据的更新不能过于频繁也就不能保证时效性因此提出了段的概念即将一个索引文件拆分为多个文件每个子文件叫做段每个段都是一个被写入磁盘的倒排索引因此段具有不变性。 Elasticsearch 基于 Lucene, 这个java库引入了按段搜索的概念。 每一段本身都是一个倒排索引 但索引在 Lucene 中除表示所有段的集合外 还增加了提交点的概念提交点是一个列出了所有已知段的文件。 ① 当新增一个文档时这个文档会被添加到内存索引缓存中随后解析文档更新内存中维护的临时索引文档中出现的每个单词在其倒排列表末尾追加倒排列表项。 ② 随着内存索引缓存中的的文档越来越多临时索引消耗的内存也会随之增加一旦临时索引将指定的内存消耗光要考虑将临时索引的内容更新到磁盘索引中以释放内存空间来容纳后续的新进文档。 当缓存被提交时 (1) 一个新的段被写入磁盘。这个段就是缓存中维护的临时倒排索引 (2) 一个新的包含新段名字的提交点被写入磁盘。 (3) 磁盘进行同步。所有在文件系统缓存中等待的写入都刷新到磁盘以确保它们被写入物理文件 (4) 新的段被开启让它包含的文档可见以被搜索。 (5) 内存缓存被清空等待接收新的文档。 每一个倒排索引都会被轮流查询到询完后再对结果进行合并。当一个查询被触发所有已知的段按顺序被查询。词项统计会对所有段的结果进行聚合以保证每个词和每个文档的关联都被准确计算。 这种方式可以用相对较低的成本将新文档添加到索引。 删除和更新文档 段是不可改变的所以既不能从把文档从旧的段中移除也不能修改旧的段来进行反映文档的更新。 取而代之的是每个提交点会包含一个 .del 文件文件中会列出这些被删除文档的段信息。 当一个文档被 “删除” 时它实际上只是在 .del 文件中被 标记 删除。一个被标记删除的文档仍然可以被查询匹配到 但它会在最终结果被返回前从结果集中移除。 文档更新也是类似的操作方式当一个文档被更新时旧版本文档被标记删除文档的新版本被索引到一个新的段中。 可能两个版本的文档都会被一个查询匹配到但被删除的那个旧版本文档在结果集返回前就已经被移除。 06. ElasticSearch 搜索为什么是近实时的 新增的文档被收集到内存缓冲区随后解析这个文档追加到临时索引的单词词典和倒排表中随着加入的文档越来越多最初分配的内存缓冲区被用完就会将内存缓冲区的内容写入磁盘的段中此时文档便可被检索了因此一个新的文档从索引到可被搜索的时间取决于该文档多久能从内存中写入到磁盘中当文档被写入磁盘就可被检索了。 随着按段搜索的发展一个新的文档从索引到可被搜索的时间延迟显著降低了新文档在几分钟之内即可被检索但这样还是不够快。那怎样才能更快呢可不可以把内存缓冲区大小设置的小一点这样一个新的文档从索引到写入磁盘的时间延迟就降低了新增的文档就能更快的被搜索到了 原理是没错的但是不可行原因是磁盘在这里成为了瓶颈当你把内存缓冲区大小设置的更小时磁盘IO的次数就会增加我们知道提交一个新的段到磁盘需要一个 fsync 来确保段被物理性地写入磁盘这样在断电的时候就不会丢失数据。但是 fsync 操作代价很大如果每次索引一个文档都去执行一次 fsync的话会造成很大的性能问题因此我们不能频繁的 fsync 即无法通过提高磁盘IO次数的方式来让新增的文档更快的被用户搜索到。 那到底怎样才能更快呢其实我们需要的是一个更轻量的方式来使一个文档可被搜索不能让内存中维护的倒排索引直接写入磁盘中这意味着 fsync 要从整个过程中被移除。可是文档不写入磁盘又怎么被检索到呢 在Elasticsearch和磁盘之间是文件系统缓存许多人没有意识到文件系统缓存对于性能的影响其实Linux系统默认的设置倾向于把内存尽可能的用于文缓存所以在一台大内存机器上往往我们可能发现没有多少剩余内存。文件系统缓存可以加速磁盘操作使系统有更好的IO性能代价只是把一些空闲的内存利用起来了。 在内存缓冲区中的文档会被写入一个新的段中但是这个新段会被先写入到内存的文件系统缓存中这一步相对于 fsync 更轻量代价更小当段被提交到文件系统缓存中后新增的文档便可被检索了。 Lucene允许新段被写入和打开使其包含的文档在未进行一次完整提交时便对搜索可见完整提交是指将新段写入磁盘 这种方式比进行一次提交代价 fsync 要小得多并且在不影响性能的前提下可以被频繁地执行。 07. ElasticSearch 在什么情况下使用 refresh api 在Elasticsearch中写入和打开一个新段的轻量的过程叫做refresh即refresh是指将内存缓冲区的内容写入到文件系统缓存的一个段中使其包含的文档便可以被搜索默认情况下每个分片会每秒自动刷新(refresh)一次。这就是为什么我们说Elasticsearch是近实时搜索: 文档的变化并不是立即对搜索可见但会在一秒之内变为可见。 这些行为可能会对新用户造成困惑索引了一个文档然后尝试搜索它但却没有搜到。这个问题的解决办法是用 refresh API 执行一次手动刷新: // 刷新Refresh所有的索引 POST /_refresh // 只刷新Refresh blogs 索引 POST /blogs/_refresh 尽管刷新是比提交轻量很多的操作它还是会有性能开销。当写测试的时候 手动刷新很有用但是不要在生产环境下每次索引一个文档都去手动刷新。 相反你的应用需要意识到 Elasticsearch 的近实时的性质并接受它的不足。 这个问题的解决办法是执行一次手动刷新:并不是所有的情况都需要每秒刷新。可能你正在使用 Elasticsearch 索引大量的日志文件 你可能想优化索引速度而不是近实时搜索 可以通过设置 refresh_interval 降低每个索引的刷新频率 //每30秒刷新 my_logs 索引。 PUT /my_logs {settings: {refresh_interval: 30s } }refresh_interval 可以在既存索引上进行动态更新。 在生产环境中当你正在建立一个大的新索引时可以先关闭自动刷新待开始使用该索引时再把它们调回来 //关闭自动刷新 PUT /my_logs/_settings { refresh_interval: -1 } //每秒自动刷新 PUT /my_logs/_settings { refresh_interval: 1s } refresh_interval 需要一个 持续时间 值 例如 1s 1 秒 或 2m 2 分钟。 一个绝对值 1 表示的是 1毫秒 这无疑会使你的集群陷入瘫痪。 08. Elasticsearch 是怎样保证更新被持久化在断电时也不丢失数据? 为了动态更新索引我们增加了段的概念将新增的文档收集到内存缓冲区并维护一个倒排索引待最初分配的内存缓冲区空间用完时将内存缓冲区的内容写入文件系统缓存的段中(refresh)这一步相对 fsync 会更加轻量代价更小。 但是如果没有用 fsync 把数据从文件系统缓存刷flush到硬盘我们不能保证数据在断电甚至是程序正常退出之后依然存在。为了保证Elasticsearch 的可靠性需要确保数据变化被持久化到磁盘。 如果将段从内存缓存刷新(refresh)到文件系统缓存而未刷新到磁盘中那么只是让段包含的文档可被检索了但是这个段并未提交。在动态更新索引我们说一次完整的提交会将段刷到磁盘并写入一个包含所有段列表的提交点。Elasticsearch 在启动或重新打开一个索引的过程中使用这个提交点来判断哪些段隶属于当前分片。一个分片就是一个Lucene索引一个Lucene索引包含多个段和一个包含所有段列表的提交点。 即使通过每秒刷新refresh实现了近实时搜索我们仍然需要经常进行完整提交来确保能从失败中恢复。但在两次提交之间发生变化的文档怎么办如果在下一次完整提交之前机器断电那么存在文件系统缓存中的数据就没了我们也不希望丢失掉这些数据。 Elasticsearch 增加了一个translog或者叫事务日志在每一次对 Elasticsearch进行操作时均进行了日志记录。通过translog 整个流程看起来是下面这样 ① 一个文档被索引之后就会被添加到内存缓冲区并在内存中写入translog 日志后写入日志的原因是数据在建立索引时需要经过分词等一系列复杂的操作有可能写入失败为了保证日志中都是成功的数据所以后写入: ② 分片每秒被刷新refresh一次刷新完成后, 缓存被清空但是事务日志不会 (1) 这些在内存缓冲区的文档被写入到一个新的段中且没有进行 fsync 操作。 (2) 这个段被打开使其可被搜索。 (3) 内存缓冲区被清空。 ③ 这个进程继续工作更多的文档被添加到内存缓冲区和追加到事务日志事务日志不断积累文档 ④ 在刷新flush之后段被全量提交并且事务日志被清空 (1) 所有在内存缓冲区的文档都被写入一个新的段 (2) 缓冲区被清空 (3) 一个提交点被写入硬盘 (4) 文件系统缓存通过 fsync 被刷新flush (5) 内存中的translog写入磁盘并清空老的translog日志文件 translog 提供所有还没有被刷到磁盘的操作的一个持久化纪录。当 Elasticsearch 启动的时候 它会从磁盘中使用最后一个提交点去恢复已知的段并且会重放 translog 中所有在最后一次提交后发生的变更操作。 translog 也被用来提供实时 CRUD 。当你试着通过ID查询、更新、删除一个文档它会在尝试从相应的段中检索之前 首先检查 translog 任何最近的变更。这意味着它总是能够实时地获取到文档的最新版本。 09. ElasticSearch 在什么情况下使用 flush api 这个执行一个提交并且截断 translog 的行为在 ES被称作一次flush , 分片每30分钟被自动刷新flush或者在 translog 太大的时候也会刷新。 flush API 可以被用来执行一个手工的刷新flush: // 刷新flush blogs索引。 POST /blogs/_flush // 刷新flush所有的索引并且并且等待所有刷新在返回前完成。 POST /_flush?wait_for_ongoing 你很少需要自己手动执行 flush 操作通常情况下自动刷新就足够了。这就是说在重启节点或关闭索引之前执行 flush有益于你的索引。当 ES 尝试恢复或重新打开一个索引 它需要重放 translog 中所有的操作所以如果日志越短恢复越快。 10. ElasticSearch 为什么需要段合并 当我们往 ElasticSearch新增文档时文档先加入内存缓冲区并更新倒排索引然后每隔1秒将内存缓冲区的内容写入一个可被检索的新段这个过程叫refresh。由于自动刷新流程每秒会创建一个新的段 这样会导致短时间内的段数量暴增。而段数目太多会带来较大的麻烦。 每一个段都会消耗文件句柄、内存和cpu运行周期。更重要的是每个搜索请求都必须轮流检查每个段所以段越多搜索也就越慢。 Elasticsearch通过在后台进行段合并来解决这个问题。小的段被合并到大的段然后这些大的段再被合并到更大的段。段合并的时候会将那些旧的已删除文档从文件系统中清除。被删除的文档或被更新文档的旧版本不会被拷贝到新的大段中。启动段合并不需要你做任何事。进行索引和搜索时会自动进行。 ① 两个提交了的段和一个未提交的段正在被合并到一个更大的段 (1) 当索引的时候刷新refresh操作会创建新的段并将段打开以供搜索使用。 (2) 合并进程选择一小部分大小相似的段并且在后台将它们合并到更大的段中。这并不会中断索引和搜索。 ② 合并完成时的活动 (1) 新的段被刷新flush到了磁盘。写入一个包含新段且排除旧的和较小的段的新提交点。 (2) 新的段被打开用来搜索。 (3) 老的段被删除。 合并大的段需要消耗大量的I/O和CPU资源如果任其发展会影响搜索性能。ES在默认情况下会对合并流程进行资源限制所以搜索仍然有足够的资源很好地执行。 11. ElasticSearch 在什么情况下使用 optimize api optimize API大可看做是强制合并 API。它会将一个分片强制合并到 max_num_segments 参数指定大小的段数目。 这样做的意图是减少段的数量通常减少到一个来提升搜索性能。 在特定情况下使用 optimize API 颇有益处。例如在日志这种用例下每天、每周、每月的日志被存储在一个索引中。 老的索引实质上是只读的它们也并不太可能会发生变化。在这种情况下使用optimize优化老的索引将每一个分片合并为一个单独的段就很有用了这样既可以节省资源也可以使搜索更加快速 POST /logstash-2014-10/_optimize?max_num_segments1 使用 optimize API 触发段合并的操作不会受到任何资源上的限制。这可能会消耗掉你节点上全部的I/O资源, 使其没有余裕来处理搜索请求从而有可能使集群失去响应。 如果你想要对索引执行 optimize你需要先使用分片分配把索引移到一个安全的节点再执行。 refresh, flush, 和 optimize API 都做了什么, 你什么情况下应该使用他们 12. 分片内部原理 1. 索引的不可变性 倒排索引被写入磁盘后是不可改变的它永远不会修改。不变性有重要的价值 ① 不需要锁。如果你从来不更新索引你就不需要担心多进程同时修改数据的问题。 ② 一旦索引被读入内核的文件系统缓存便会留在哪里由于其不变性。只要文件系统缓存中还有足够的空间那么大部分读请求会直接请求内存而不会命中磁盘。这提供了很大的性能提升。 ③ 其它缓存(像filter缓存)在索引的生命周期内始终有效。它们不需要在每次数据改变时被重建因为数据不会变化。 ④ 写入单个大的倒排索引允许数据被压缩减少磁盘 I/O 和 需要被缓存到内存的索引的使用量。 当然一个不变的索引也有不好的地方。主要事实是它是不可变的! 你不能修改它。如果你需要让一个新的文档 可被搜索你需要重建整个索引。这要么对一个索引所能包含的数据量造成了很大的限制要么对索引可被更新的频率造成了很大的限制。 2. 动态更新索引 1、索引文档 下一个需要被解决的问题是怎样在保留不变性的前提下实现倒排索引的更新答案是: 用更多的索引。 通过增加新的补充索引来反映新近的修改而不是直接重写整个倒排索引。每一个倒排索引都会被轮流查询到查询完后再对结果进行合并。Elasticsearch 基于 Lucene, 这个 java 库引入了按段搜索的概念 每一段本身都是一个倒排索引。 但索引在 Lucene 中除表示所有段的集合外 还增加了提交点 一个列出了所有已知段的文件的概念 。如图一个 Lucene 索引包含一个提交点和三个段 逐段搜索会以如下流程进行工作 ① 新文档被收集到内存索引缓存 如图一个在内存缓存中包含新文档的 Lucene 索引新的文档首先被添加到内存索引缓存中然后写入到一个基于磁盘的段。 ② 不时地缓存被提交 一个新的段一个追加的倒排索引被写入磁盘。一个新的包含新段名字的提交点被写入磁盘。磁盘进行同步所有在文件系统缓存中等待的写入都刷新到磁盘以确保它们被写入物理文件。 ③ 新的段被开启让它包含的文档可见以被搜索。 ④ 内存缓存被清空等待接收新的文档。如图在一次提交后一个新的段被添加到提交点而且缓存被清空 当一个查询被触发所有已知的段按顺序被查询。词项统计会对所有段的结果进行聚合以保证每个词和每个文档的关联都被准确计算。 这种方式可以用相对较低的成本将新文档添加到索引。 2、删除和更新文档 段是不可改变的所以既不能从把文档从旧的段中移除也不能修改旧的段来进行反映文档的更新。 取而代之的是每个提交点会包含一个 .del 文件文件中会列出这些被删除文档的段信息。 当一个文档被 “删除” 时它实际上只是在 .del 文件中被标记删除。一个被标记删除的文档仍然可以被查询匹配到 但它会在最终结果被返回前从结果集中移除。 文档更新也是类似的操作方式当一个文档被更新时旧版本文档被标记删除文档的新版本被索引到一个新的段中。 可能两个版本的文档都会被一个查询匹配到但被删除的那个旧版本文档在结果集返回前就已经被移除。 3. 近实时搜索 随着按段搜索的发展一个新的文档从索引到可被搜索的延迟显著降低了。新文档在几分钟之内即可被检索但这样还是不够快。磁盘在这里成为了瓶颈。提交一个新的段到磁盘需要一个 fsync 来确保段被物理性地写入磁盘这样在断电的时候就不会丢失数据。 但是 fsync 操作代价很大; 如果每次索引一个文档都去执行一次的话会造成很大的性能问题。我们需要的是一个更轻量的方式来使一个文档可被搜索这意味着 fsync 要从整个过程中被移除。 在Elasticsearch和磁盘之间是文件系统缓存。 像之前描述的一样 在内存索引缓冲区中的文档会被写入到一个新的段中。 但是这里新段会被先写入到文件系统缓存这一步代价会比较低稍后再被刷新到磁盘这一步代价比较高。不过只要文件已经在缓存中 就可以像其它文件一样被打开和读取了。 在内存缓冲区中包含了新文档的 Lucene 索引 Lucene 允许新段被写入和打开使其包含的文档在未进行一次完整提交时便对搜索可见。 这种方式比进行一次提交代价要小得多并且在不影响性能的前提下可以被频繁地执行。 缓冲区的内容已经被写入一个可被搜索的段中但还没有进行提交 在 Elasticsearch 中写入和打开一个新段的轻量的过程叫做 refresh 。 默认情况下每个分片会每秒自动刷新一次。这就是为什么我们说 Elasticsearch 是 近 实时搜索: 文档的变化并不是立即对搜索可见但会在一秒之内变为可见。这些行为可能会对新用户造成困惑: 他们索引了一个文档然后尝试搜索它但却没有搜到。这个问题的解决办法是用 refresh API 执行一次手动刷新: POST /_refresh # 刷新Refresh所有的索引。 POST /blogs/_refresh # 只刷新Refresh blogs 索引。尽管刷新是比提交轻量很多的操作它还是会有性能开销。当写测试的时候 手动刷新很有用但是不要在生产环境下每次索引一个文档都去手动刷新。 相反你的应用需要意识到 Elasticsearch 的近实时的性质并接受它的不足。 并不是所有的情况都需要每秒刷新。可能你正在使用 Elasticsearch 索引大量的日志文件 你可能想优化索引速度而不是近实时搜索 可以通过设置 refresh_interval 降低每个索引的刷新频率 # 每30秒刷新 my_logs 索引。 PUT /my_logs {settings: {refresh_interval: 30s } }refresh_interval 可以在既存索引上进行动态更新。 在生产环境中当你正在建立一个大的新索引时可以先关闭自动刷新待开始使用该索引时再把它们调回来 # 关闭自动刷新 PUT /my_logs/_settings { refresh_interval: -1 } # 每秒自动刷新 PUT /my_logs/_settings { refresh_interval: 1s } refresh_interval 需要一个 持续时间 值 例如 1s 1 秒 或 2m 2 分钟。 一个绝对值 1 表示的是 1毫秒 这无疑会使你的集群陷入瘫痪。 4. 持久化变更 如果没有用 fsync 把数据从文件系统缓存刷flush到硬盘我们不能保证数据在断电甚至是程序正常退出之后依然存在。为了保证 Elasticsearch 的可靠性需要确保数据变化被持久化到磁盘。在动态更新索引我们说一次完整的提交会将段刷到磁盘并写入一个包含所有段列表的提交点。Elasticsearch 在启动或重新打开一个索引的过程中使用这个提交点来判断哪些段隶属于当前分片。 即使通过每秒刷新refresh实现了近实时搜索我们仍然需要经常进行完整提交来确保能从失败中恢复。但在两次提交之间发生变化的文档怎么办我们也不希望丢失掉这些数据。Elasticsearch 增加了一个 translog 或者叫事务日志在每一次对 Elasticsearch 进行操作时均进行了日志记录。通过 translog 整个流程看起来是下面这样 ① 一个文档被索引之后就会被添加到内存缓冲区并且追加到了 translog 如图新的文档被添加到内存缓冲区并且被追加到了事务日志 ② 刷新refresh完成后, 缓存被清空但是事务日志不会分片每秒被刷新refresh一次 这些在内存缓冲区的文档被写入到一个新的段中且没有进行 fsync 操作。这个段被打开使其可被搜索。内存缓冲区被清空。 ③ 这个进程继续工作更多的文档被添加到内存缓冲区和追加到事务日志如图事务日志不断积累文档 ④ 每隔一段时间translog 变得越来越大索引被刷新flush一个新的 translog 被创建并且一个全量提交被执行如图在刷新flush之后段被全量提交并且事务日志被清空 所有在内存缓冲区的文档都被写入一个新的段。缓冲区被清空。一个提交点被写入硬盘。文件系统缓存通过 fsync 被刷新flush。老的 translog 被删除。 translog 提供所有还没有被刷到磁盘的操作的一个持久化纪录。当 Elasticsearch 启动的时候 它会从磁盘中使用最后一个提交点去恢复已知的段并且会重放 translog 中所有在最后一次提交后发生的变更操作。 translog 也被用来提供实时 CRUD 。当你试着通过ID查询、更新、删除一个文档它会在尝试从相应的段中检索之前 首先检查 translog 任何最近的变更。这意味着它总是能够实时地获取到文档的最新版本。 这个执行一个提交并且截断 translog 的行为在 Elasticsearch 被称作一次 flush 。 分片每30分钟被自动刷新flush或者在 translog 太大的时候也会刷新。 flush API 可以被用来执行一个手工的刷新flush: # 刷新flush blogs索引。 POST /blogs/_flush # 刷新flush所有的索引并且并且等待所有刷新在返回前完成。 POST /_flush?wait_for_ongoing 你很少需要自己手动执行 flush 操作通常情况下自动刷新就足够了。这就是说在重启节点或关闭索引之前执行 flush 有益于你的索引。当 Elasticsearch 尝试恢复或重新打开一个索引 它需要重放 translog 中所有的操作所以如果日志越短恢复越快。 5. 段合并 由于自动刷新流程每秒会创建一个新的段 这样会导致短时间内的段数量暴增。而段数目太多会带来较大的麻烦。 每一个段都会消耗文件句柄、内存和cpu运行周期。更重要的是每个搜索请求都必须轮流检查每个段所以段越多搜索也就越慢。Elasticsearch通过在后台进行段合并来解决这个问题。小的段被合并到大的段然后这些大的段再被合并到更大的段。段合并的时候会将那些旧的已删除文档从文件系统中清除。被删除的文档或被更新文档的旧版本不会被拷贝到新的大段中。启动段合并不需要你做任何事。进行索引和搜索时会自动进行。 ① 当索引的时候刷新refresh操作会创建新的段并将段打开以供搜索使用。 ② 合并进程选择一小部分大小相似的段并且在后台将它们合并到更大的段中。这并不会中断索引和搜索。如图两个提交了的段和一个未提交的段正在被合并到一个更大的段 ③ 一旦合并结束老的段被删除 新的段被刷新flush到了磁盘 写入一个包含新段且排除旧的和较小的段的新提交点。新的段被打开用来搜索。老的段被删除。 合并大的段需要消耗大量的I/O和CPU资源如果任其发展会影响搜索性能。Elasticsearch在默认情况下会对合并流程进行资源限制所以搜索仍然 有足够的资源很好地执行。 optimize API大可看做是 强制合并 API。它会将一个分片强制合并到 max_num_segments 参数指定大小的段数目。 这样做的意图是减少段的数量通常减少到一个来提升搜索性能。 在特定情况下使用 optimize API 颇有益处。例如在日志这种用例下每天、每周、每月的日志被存储在一个索引中。 老的索引实质上是只读的它们也并不太可能会发生变化。在这种情况下使用optimize优化老的索引将每一个分片合并为一个单独的段就很有用了这样既可以节省资源也可以使搜索更加快速 POST /logstash-2014-10/_optimize?max_num_segments1 使用 optimize API 触发段合并的操作不会受到任何资源上的限制。这可能会消耗掉你节点上全部的I/O资源, 使其没有余裕来处理搜索请求从而有可能使集群失去响应。 如果你想要对索引执行 optimize你需要先使用分片分配把索引移到一个安全的节点再执行。
http://www.tj-hxxt.cn/news/141172.html

相关文章:

  • 精品课程网站怎么做二级域名需要申请吗
  • 广州公司网站开发国际新闻用什么软件看看
  • 酒业为什么做网站实用网站设计步骤
  • 做网站视频的赚钱吗广告公司名字
  • 网站建设费会计科目3d动画特效制作软件
  • 南京电商网站设计公司seo优化策略
  • 邯郸网站建设哪家专业各种网站程序的优势
  • seo整站优化方法如何利用国外的网站开发客户
  • 网站建站网站怎么样企业网站如何建设温州
  • 东阳市住房与城乡建设局网站wordpress底部栏文字
  • 网站开发毕设题目工地找工作哪个软件好
  • 销售网站建设价格wordpress检测不到更新
  • 门户网站建设模板下载网站手机版建设项目书
  • 建立网站的技术路径上海品牌推广公司
  • 网页设计建网站流程网络推广是指什么
  • 企业级网站内容管理解决方案短链接在线生成器免费版
  • 网站前端是做网站吗建设服装网站目的和作用
  • 东莞网站建设公司 h5在线教育平台网站建设
  • 网站建设市场需求分析做网站的网页用什么软件好
  • 简历在线制作网站网络卖货怎么卖
  • 山东住房和建设庭官网站官网站建设建设公司
  • 做网站需要技术网站建设内部需求调查表
  • 北京 网站定制开发网站 keywords
  • 网站建设于朦胧网站设计服务有哪些
  • wordpress怎么仿站如何在百度发广告推广
  • wordpress购物车显示优化设计答案大全英语
  • 做网站的费用会计分录浙江省建设监理管理协会网站
  • 不限关键词做网站平台小程序开发文档api
  • 高校网站建设 调查wordpress 数据库建立
  • 便民网站开发服务器维护中