《深入理解ElasticSearch》——3.4 准实时、提交、更新及事务日志

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
日志服务 SLS,月写入数据量 50GB 1个月
简介:

本节书摘来自华章计算机《深入理解ElasticSearch》一书中的第3章,第3.4节,作者:[美] 拉斐尔·酷奇(Rafa Ku) 马雷克·罗戈任斯基(Marek Rogoziński)更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.4 准实时、提交、更新及事务日志

一个理想的搜索解决方案中,新索引的数据应该能立即搜索到。ElasticSearch给人的第一印象仿佛就是如此工作的,即使是在多服务器环境下,然而事实并非如此(至少不是任何场景都能保证新索引的数据能被实时检索到),原因我们后面会讲解。接下来的案例中,我们将使用下面的命令将一篇文档索引到新创建的索引中:


<a href=https://yqfile.alicdn.com/c54c8d453ea72d83a223728253c1fd6162c44e66.png" >

现在,更新该文档,并尝试立即搜索它。为实现该目的,我们将串行执行下面的两个命令:


f309f44baa83837ef340960755bf338158af5133

前面的命令将返回类似下面的结果:


4d45679a710b72cd3aef0644ffa40db33b4bd437

第一个返回结果对应索引命令的操作,正如你所见,一切正常。第二个返回结果是查询对应的结果,其中title字段的值应该是test2,然而返回的却是修改前的那个文档,这是怎么回事?
关于上面这个问题,在给出答案之前,不妨去回顾一下Lucene的内部机制,探究一下Lucene是如何让新索引的文档在搜索时可用的。
3.4.1 索引更新及更新提交
在阅读1.1节时我们已经知道,在索引期新文档会写入索引段。索引段是独立的Lucene索引,这意味着查询是可以与索引并行的,只是不时会有新增的索引段被添加到可被搜索的索引段集合之中。Apache Lucene通过创建后续的(基于索引只写一次的特性)segments_N文件来实现此功能,且该文件列举了索引中的索引段。这个过程称为提交(committing),Lucene以一种安全的方式来执行该操作,能确保索引更改以原子操作方式写入索引,即便有错误发生,也能保证索引数据的一致性。
让我们回到之前的例子,尽管第一个操作向索引中添加了文档,但它并没有执行提交commit操作,这就是返回结果令人惊讶的原因。然而,一次提交并不足以保证新索引的数据能被搜索到,这是因为Lucene使用了一个叫作Searcher的抽象类来执行索引的读取。如果索引更新提交了,但Searcher实例并没有重新打开,那么它觉察不到新索引段的加入。Searcher重新打开的过程叫作刷新(refresh)。出于性能考虑,Lucene推迟了耗时的刷新,因此它不会在每次新增一个文档(或批量增加文档)的时候刷新,但Searcher会每秒刷新一次。这种刷新已经非常频繁了,然而有很多应用却需要更快的刷新频率。如果碰到这种状况,要么使用其他技术,要么审视需求是否合理。ElasticSearch提供了强制刷新的API。例如,在例子中可以使用下面的命令:


fc86d52cd327f1ca0d4c7183da860aa38799984d

如果在搜索前执行该命令,就会得到我们预期的结果。
更改默认的刷新时间
Searcher自动刷新的时间间隔可以通过以下手段改变:更改ElasticSearch配置文件中的index.refresh_interval参数值或者使用配置更新相关的API。例如:


<a href=https://yqfile.alicdn.com/0952bec1eb9450661d6d97a5b2f258da01738eb5.png" >

上面的命令将Searcher的自动刷新时间间隔更改为5分钟。请注意,上次刷新后的新增数据并不会被搜索到。
刷新操作是很耗资源的,因此刷新间隔时间越长,索引速度越快。如果需要长时间高速建索引,并且在建索引结束之前暂不执行查询,那么可以考虑将index.refresh_interval参数值设置为-1,然后在建索引结束以后再将该参数恢复为初始值。
3.4.2 事务日志
Apache Lucene能保证索引的一致性,这非常棒,但是这并不能保证当往索引中写数据失败时不会损失数据(如磁盘空间不足、设备损坏,或没有足够的文件句柄供索引文件使用)。另外,频繁提交操作会导致严重的性能问题(因为每提交一次就会触发一个索引段的创建操作,同时也可能触发索引段的合并)。ElasticSearch通过使用事务日志(transaction log)来解决这些问题,它能保存所有的未提交的事务,而ElasticSearch会不时创建一个新的日志文件用于记录每个事务的后续操作。当有错误发生时,就会检查事务日志,必要时会再次执行某些操作,以确保没有丢失任何更改信息。而且,事务日志的相关操作都是自动完成的,用户并不会意识到某个特定时刻触发的更新提交。事务日志中的信息与存储介质之间的同步(同时清空事务日志)称为事务日志刷新(flushing)。
请注意事务日志刷新与Searcher刷新的区别。大多数情况下,Searcher刷新是你所期望的,即搜索到最新的文档。而事务日志刷新用来确保数据正确写入了索引并清空了事务日志。
除了自动的事务日志刷新以外,也可以使用对应的API。例如,可以使用下面的命令,强制将事务日志中涉及的所有数据更改操作同步到索引中,并清空事务日志文件:


e0d75f128ee6c6bf7a710123c5bfcd48c059411d

我们也可以使用flush命令对特定的索引进行事务日志刷新(如library索引):


<a href=https://yqfile.alicdn.com/643041ebe86a10b87745ddd846a000aae2313468.png" >

上面第二行命令中,我们紧接着在事务日志刷新之后,调用Searcher刷新操作,打开一个新的Searcher实例。
事务日志相关配置
如果事务日志的默认配置不能满足用户需要,ElasticSearch还支持默认配置修改功能以满足特定需求。以下参数既可以通过修改elasticsearch.yml文件来配置,也可以通过索引配置更新API来更改。
  • index.translog.flush_threshold_period:该参数的默认值为30分钟,它控制了强制自动事务日志刷新的时间间隔,即便是没有新数据写入。强制进行事务日志刷新通常会导致大量的I/O操作,因此当事务日志涉及少量数据时,才更适合进行这项操作。
  • index.translog.flush_threshold_ops:该参数确定了一个最大操作数,即在上次事务日志刷新以后,当索引更改操作次数超过该参数值时,强制进行事务日志刷新操作,默认值为5000。
  • index.translog.flush_threshold_size:该参数确定了事务日志的最大容量,当容量大于等于该参数值,就强制进行事务日志刷新操作,默认值为200MB。
  • index.translog.disable_flush:禁用事务日志刷新。尽管默认情况下事务日志刷新是可用的,但对它临时性地禁用能带来其他方面的便利。例如,向索引中导入大量文档的时候。

尽管前面提及的所有参数都被指定用于用户选定的某个索引,但它们同时也定义了该索引各个分片的事务日志处理方式。
当然,除了通过修改elasticsearch.yml文件来配置上述参数,我们也可以使用设置更新API来更改相关配置。例如:


<a href=https://yqfile.alicdn.com/36f3e76520ffcf7aaefa3d4be82c958967d91329.png" >

前述命令会在向索引导入大量数据之前执行,大幅提高索引的速度。但是请记住,当数据导入完毕之后,要重新设置事务日志刷新相关参数。
3.4.3 准实时读取
事务日志给我们带来一个免费的特性:实时读取(real-time GET),该功能让返回文档各种版本(包括未提交版本)成为可能。实时读取操作从索引中读取数据时,会先检查事务日志中是否有可用的新版本。如果近期索引没有与事务日志同步,那么索引中的数据将会被忽略,事务日志中最新版本的文档将会被返回。为了演示实时读取的工作原理,我们用下面的命令替换范例中的搜索操作:


9ccea952255fa3dfb41645b6d658bf37b1cc09fc

ElasticSearch将返回类似下面的结果:


64df9b9923eae12e2848304cf122c91c33efc980

如代码所示,这正是我们想要的结果,而且这里并没有使用Searcher刷新技巧就得到了最新版本的文档。
相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
24天前
|
消息中间件 监控 Kafka
Filebeat+Kafka+Logstash+Elasticsearch+Kibana 构建日志分析系统
【8月更文挑战第13天】Filebeat+Kafka+Logstash+Elasticsearch+Kibana 构建日志分析系统
66 3
|
5天前
|
机器学习/深度学习 存储 监控
Elasticsearch 在日志分析中的应用
【9月更文第2天】随着数字化转型的推进,日志数据的重要性日益凸显。日志不仅记录了系统的运行状态,还提供了宝贵的洞察,帮助企业改进产品质量、优化用户体验以及加强安全防护。Elasticsearch 作为一个分布式搜索和分析引擎,因其出色的性能和灵活性,成为了日志分析领域的首选工具之一。本文将探讨如何使用 Elasticsearch 作为日志分析平台的核心组件,并详细介绍 ELK(Elasticsearch, Logstash, Kibana)栈的搭建和配置流程。
34 4
|
24天前
|
SQL 数据库 数据安全/隐私保护
SQL Server数据库Owner导致事务复制log reader job无法启动的解决办法
【8月更文挑战第14天】解决SQL Server事务复制Log Reader作业因数据库所有者问题无法启动的方法:首先验证数据库所有者是否有效并具足够权限;若非,使用`ALTER AUTHORIZATION`更改为有效登录名。其次,确认Log Reader使用的登录名拥有读取事务日志所需的角色权限。还需检查复制配置是否准确无误,并验证Log Reader代理的连接信息及参数。重启SQL Server Agent服务或手动启动Log Reader作业亦可能解决问题。最后,审查SQL Server错误日志及Windows事件查看器以获取更多线索。
|
26天前
|
Kubernetes Java 索引
Elasticsearch on K8S 开启慢日志
本文档指导如何在Elasticsearch on PaaS环境中手动配置慢日志。首先通过API设置索引的慢日志阈值,接着创建`log4j2.properties`的ConfigMap以定义日志滚动策略,并修改Elasticsearch配置引入此ConfigMap。最后,通过Kubernetes命令检查Pod内的`logs`目录以查看生成的慢日志文件。需注意,不当配置可能会影响系统性能。[官方文档](https://www.elastic.co/guide/en/elasticsearch/reference/6.8/logging.html)提供更多细节。
91 3
|
4天前
|
SQL 安全 数据库
基于SQL Server事务日志的数据库恢复技术及实战代码详解
基于事务日志的数据库恢复技术是SQL Server中一个非常强大的功能,它能够帮助数据库管理员在数据丢失或损坏的情况下,有效地恢复数据。通过定期备份数据库和事务日志,并在需要时按照正确的步骤恢复,可以最大限度地减少数据丢失的风险。需要注意的是,恢复数据是一个需要谨慎操作的过程,建议在执行恢复操作之前,详细了解相关的操作步骤和注意事项,以确保数据的安全和完整。
9 0
|
7天前
|
API C# 开发框架
WPF与Web服务集成大揭秘:手把手教你调用RESTful API,客户端与服务器端优劣对比全解析!
【8月更文挑战第31天】在现代软件开发中,WPF 和 Web 服务各具特色。WPF 以其出色的界面展示能力受到欢迎,而 Web 服务则凭借跨平台和易维护性在互联网应用中占有一席之地。本文探讨了 WPF 如何通过 HttpClient 类调用 RESTful API,并展示了基于 ASP.NET Core 的 Web 服务如何实现同样的功能。通过对比分析,揭示了两者各自的优缺点:WPF 客户端直接处理数据,减轻服务器负担,但需处理网络异常;Web 服务则能利用服务器端功能如缓存和权限验证,但可能增加服务器负载。希望本文能帮助开发者根据具体需求选择合适的技术方案。
29 0
|
7天前
|
C# Windows 监控
WPF应用跨界成长秘籍:深度揭秘如何与Windows服务完美交互,扩展功能无界限!
【8月更文挑战第31天】WPF(Windows Presentation Foundation)是 .NET 框架下的图形界面技术,具有丰富的界面设计和灵活的客户端功能。在某些场景下,WPF 应用需与 Windows 服务交互以实现后台任务处理、系统监控等功能。本文探讨了两者交互的方法,并通过示例代码展示了如何扩展 WPF 应用的功能。首先介绍了 Windows 服务的基础知识,然后阐述了创建 Windows 服务、设计通信接口及 WPF 客户端调用服务的具体步骤。通过合理的交互设计,WPF 应用可获得更强的后台处理能力和系统级操作权限,提升应用的整体性能。
21 0
|
14天前
|
存储 关系型数据库 MySQL
深入MySQL:事务日志redo log详解与实践
【8月更文挑战第24天】在MySQL的InnoDB存储引擎中,为确保事务的持久性和数据一致性,采用了redo log(重做日志)机制。redo log记录了所有数据修改,在系统崩溃后可通过它恢复未完成的事务。它由内存中的redo log buffer和磁盘上的redo log file组成。事务修改先写入buffer,再异步刷新至磁盘,最后提交事务。若系统崩溃,InnoDB通过redo log重放已提交事务并利用undo log回滚未提交事务,确保数据完整。理解redo log工作流程有助于优化数据库性能和确保数据安全。
73 0
|
14天前
|
存储 SQL 关系型数据库
MySQL事务日志奥秘:undo log大揭秘,一文让你彻底解锁!
【8月更文挑战第24天】本文深入探讨了MySQL中undo log的关键作用及其在确保事务原子性和一致性方面的机制。MySQL通过记录事务前的数据状态,在需要时能回滚至初始状态。主要介绍InnoDB存储引擎下的undo log实现,包括undo segment和record的结构,而MyISAM则采用redo log保障持久性而非一致性。通过一个简单的SQL回滚示例,展示了undo log如何在实际操作中发挥作用,帮助读者更好地理解并运用MySQL事务管理功能。
69 0
|
5天前
|
NoSQL 关系型数据库 Redis
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
mall在linux环境下的部署(基于Docker容器),docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongodb、minio详细教程,拉取镜像、运行容器
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
下一篇
DDNS