Elasticsearch不支持事务有什么好的弥补方案

发布时间:2021-12-16 16:41:20 作者:柒染
来源:亿速云 阅读:330

Elasticsearch不支持事务有什么好的弥补方案,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

1、问题

es如何与hive或mysql结合使用?es不支持事务有什么好的弥补方案吗?

 

2、事务的核心概念

如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下ACID四个特性:

为了更好地理解ACID,以银行账户转账为例:

1START TRANSACTION;
2SELECT balance FROM checking WHERE customer_id = 10233276;
3UPDATE checking SET balance = balance - 200.00 WHERE customer_id = 10233276;
4UPDATE savings SET balance = balance + 200.00 WHERE customer_id = 10233276;
5COMMIT;
 

原子性:要么完全提交(10233276的checking余额减少200,savings 的余额增加200),要么完全回滚(两个表的余额都不发生变化)

一致性:这个例子的一致性体现在 200元不会因为数据库系统运行到第3行之后,第4行之前时崩溃而不翼而飞,因为事务还没有提交。

隔离性:允许在一个事务中的操作语句会与其他事务的语句隔离开,比如事务A运行到第3行之后,第4行之前,此时事务B去查询checking余额时,它仍然能够看到在事务A中被减去的200元(账户钱不变),因为事务A和B是彼此隔离的。在事务A提交之前,事务B观察不到数据的改变。

持久性:一个事务一旦commit,对数据的修改是持久的。

 

3、Elasticsearh不支持事务

一些支持ACID数据存储的数据库包括:Postgres, SQLite, Oracle, MySQL (with InnoDB), and MongoDB (4.0+),不包括Elasticsearch。

Elasticsearch的底层技术是Lucene,Lucene是追求速度而非冗余的信息检索技术。Lucene具有完全不同的体系结构,可以提供极快的性能,但代价是更容易受到数据丢失的影响。

丢失数据有很多种方式,如果需要的话,你需要重新创建数据。 没错,Elasticsearch有一个快照/恢复功能,但是这个过程只会在数据丢失的情况下部分恢复。 除非您在其他系统对数据有额外的备份存储,否则最新快照和中断之间的更新将会丢失。 快照/恢复在分裂大脑的情况下也无济于事,因为没有用于协调每个分区的更新的机制。 更新将会丢失。

 

4、Elasticsearch支持的场景

 

5、Elasticsearch不支持的场景

In Elasticsearch, this lightweight process of writing and opening a
new segment is called a refresh. By default, every shard is refreshed
automatically once every second. This is why we say that Elasticsearch
has near real-time search: document changes are not visible to search
immediately, but will become visible within 1 second.

默认的刷新频率设置是1秒,也就是说文档从Index请求到对外可见能够被搜到,最少要1秒钟,强制的,你的网络和CPU再快也不行。这么做是Lucene为了提高写操作的吞吐量而做出的延迟牺牲,当然这个设置是可以手动调整的,但是并不建议你去动它,会极大地影响搜索性能。不同的应用对实时性的定义并不一样,这取决于你的需求。

 

6、系统设计数据库选型考量

使用哪种产品作为数据仓库或主数据库存储完全取决于具体的应用场景。

  1. 如果信息获取及分析的能力是你的首要需求,那么无疑Elasticsearch是一个好的选择。

  2. 如果你的数据并不频繁的update操作,也没有事务性操作,那么完全可以用Elasticsearch替代其他存储。

  3. 实时性要求高的场景,需要结合ACID特性的数据库和Elasticsearch结合使用。

选型核心思考问题如下:

Elasticsearch不支持事务有什么好的弥补方案  
 

7、数据库如何与Elasticsearch结合使用?

设计时候注意:

  1. 创建的每个Elasticsearch索引都应该由符合ACID的数据存储支持。

  2. 数据库应该是真实的最终来源,从中填充索引。

  3. 如果异常情况发生(节点丢失,中断或误操作 )导致丢失了索引,您将能够完全恢复它。

  4. 一般的用法是另外的数据库比如NOSQL里面有一份,然后实时同步到ES,这样一个用于键值查询,一个用于各种其他查询。 如果ES升级了之类的,比如数据结构变了,那么老版本数据可以不要,直接NOSQL再导入一份到新版本,还可以恢复。

  5. logstash的同步插件如logstash_input_jdbc 不支持同步删除操作,建议改为更新操作加标记flag,或者通过业务逻辑实现同步删除操作。

核心操作:

  1. ES中只存储检索字段,方便快速检索、全文检索。

  2. Mysql中存储全部字段,利用ACID事务特性。

  3. 通过关联字段建立关联,比如:news_id在ES和mysql中要有相同的值。

  4. 核心数据先通过ES快速获取Id(如news_id),再通过Mysql二次查询。

关于Elasticsearch不支持事务有什么好的弥补方案问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。

推荐阅读:
  1. elasticsearch数据长期保存的方案
  2. 分布式事务处理方案,微服事务处理方案

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

elasticsearch

上一篇:Spring Boot异步请求和异步调用的示例分析

下一篇:怎么解析Python中的Dict

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》