1、问题

源自星球同学的提问:es如何与hive或mysql结合使用?es不支持事务有什么好的弥补方案吗?

2、事务的核心概念

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

原子性(Atomicity)
原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚, 一致性(Consistency)
一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。 隔离性(Isolation)
隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。 持久性(Durability)
持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

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

START TRANSACTION;
SELECT balance FROM checking WHERE customer_id = 10233276;
UPDATE checking SET balance = balance - 200.00 WHERE customer_id = 10233276;
UPDATE savings SET balance = balance + 200.00 WHERE customer_id = 10233276;
COMMIT;

原子性:要么完全提交(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支持的场景

数据安全性场景:ElasticSearch的shard支持replication,一份数据可以保存多份,如果某一台机器挂掉了,数据在其他机器上还有,不用担心丢失。

访问安全性场景:随着x-pack开源,ElasticSearch支持验证,不用担心未授权的访问。或者借助第三方search-guard等。

迁移特性:ElasticSearch支持众多的插件,在和其他开源系统之间导入,导出数据都很简单。

数据完整性:ElasticSearch支持保存数据原文。

5、Elasticsearch不支持的场景

不支持事务,如前所述。

类似数据库中通过外键的复杂的多表关联操作,Elasticsearch天生支持不足。

读写有一定延时,写入的数据,最快1s中能被检索到。
实时性的官网解读: 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为了提高写操作的吞吐量而做出的延迟牺牲,当然这个设置是可以手动调整的,但是并不建议你去动它,会极大地影响搜索性能。不同的应用对实时性的定义并不一样,这取决于你的需求。

ES不是关系数据库,因此如果您的数据会受益于外键等等,那么ES不是您主要数据存储的好选择

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

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

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

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

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

选型核心思考问题如下:

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

设计时候注意:

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

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

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

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

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

核心操作:

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

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

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

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

Elasticsearch不支持事务有什么好的弥补方案的更多相关文章

  1. MySql不支持事务解决

    用的是一个绿色版的mysql数据库,发现不支持事务,在网络上搜集资料找到解决方案: 1.执行语句  SHOW ENGINES; 如果发现InnoDB全部显示为“YES”,说明该版本的数据库支持事务 2 ...

  2. 遇过的坑(2)—MyISAM表类型不支持事务操作

    最近需要通过JDBC对数据库做事务型操作,实践时发现,并没有达到想要的效果,表现在:1.每次执行executeUpdate()后,数据就马上能在DB中查到.但按理来说,我还没执行commit(),DB ...

  3. 第三章(附)mysql表类型MyISAM和InnoDB区别(决定了是否支持事务)

    mysql表类型MyISAM和InnoDB区别 MyISAM:这个是默认类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问 ...

  4. Spring+Mybatis多数据源的一种实现方式,支持事务

    最近一个项目用到了多个数据库,所以需要实现动态切换数据源来查询数据,http://www.cnblogs.com/lzrabbit/p/3750803.html这篇文章让我受益匪浅,提供了一种自动切换 ...

  5. MongoDB与Spring整合(支持事务)——SpringDataMongoDB

    1.将MongoDB设置为复制集模式 a.修改 mongod.cfg 文件,添加replSetName复制集名称 #replication: replication: replSetName: &qu ...

  6. 这么小的key-val数据库居然也支持事务——与短跑名将同名的数据库Bolt

    传送门: 柏链项目学院 什么是Bolt?   Bolt是一个纯净的基于go语言编写的key-val数据库,该项目受到LMDB项目的启发,目标是提供一个不需要完整服务器的简单.快速.可靠的数据库.    ...

  7. MySQL(存储过程,支持事务操作)

    day61 保存在MySQL上的一个别名   >   一坨SQL语句 -- delimiter // -- create procedure p1() -- BEGIN -- select * ...

  8. 4、什么是事务?MySQL如何支持事务?

    什么是事务? 事务是由一步或几步数据库操作序列组成逻辑执行单元,这系列操作要么全部执行,要么全部放弃执行.程序和事务是两个不同的概念.一般而言:一段程序中可能包含多个事务.(说白了就是几步的数据库操作 ...

  9. 什么是事务?MySQL如何支持事务?

    什么是事务? 事务是由一步或几步数据库操作序列组成逻辑执行单元,这系列操作要么全部执行,要么全部放弃执行.程序和事务是两个不同的概念.一般而言:一段程序中可能包含多个事务.(说白了就是几步的数据库操作 ...

随机推荐

  1. RocketMQ之消费者启动与消费流程

    vivo 互联网服务器团队 - Li Kui 一.简介 1.1 RocketMQ 简介 RocketMQ是由阿里巴巴开源的分布式消息中间件,支持顺序消息.定时消息.自定义过滤器.负载均衡.pull/p ...

  2. Python List 中的append 和 extend 的区别

    方法的参数不同 append 方法是向原list的末尾添加一个对象(任意对象:如元组,字典,列表等),且只占据一个原list的索引位,添加后无返回值,直接在原列表中添加. list.append(ob ...

  3. ooday07 Java_接口

    笔记: 接口: 是一种引用数据类型 由interface定义 只能包含常量和抽象方法------默认权限是public 接口不能被实例化 接口是需要被实现/继承,实现/派生类:必须重写所有抽象方法 一 ...

  4. 分享|2022数字安全产业大数据白皮书(附PDF)

    内容摘要: 2021年以来,数字安全赛道的受关注程度达到一个历史新高度.<数据安全法><个人信息保护法><关键信息基础设施安全保护条例>,一个接一个重磅的法规接连出 ...

  5. 第一天python3 封装和解构

    封装 将多个值使用逗号分割,组合在一起:本质上,返回一个元组,只是省略了小括号:python特有语法,被很多语言学习和借鉴;比如javascript:t1=(1,2) 定义为元组:t2=1,2 将1和 ...

  6. python常用功能模块

    路径相关:os.pathlib Windows注册表相关:winreg 系统cpu.内存.线程相关:psutil 文件.文件夹处理:shutil 解析和生成ini文件:ConfigParser:(co ...

  7. python 生成Windows快捷方式

    此处以虚拟机镜像快捷方式为例 link_filepath:快捷方式的生成路径 win32_cmd:需要执行的应用程序 arg_str:exe的参数 快捷方式的目标:由win32_cmd + arg_s ...

  8. 「APIO2010」巡逻 题解

    来源 LCA 个人评价:lca求路径,让我发现了自己不会算树的直径(但是本人似乎没有用lca求) 1 题面 「APIO2010」巡逻 大意:有一个有n个节点的树,每条边权为1,一每天要从1号点开始,遍 ...

  9. 举重若轻流水行云,前端纯CSS3实现质感非凡的图片Logo鼠标悬停(hover)光泽一闪而过的光影特效

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_197 喜欢看电影的朋友肯定会注意到一个有趣的细节,就是电影出品方一定会在片头的Logo环节做一个小特效:暗影流动之间光泽一闪而过, ...

  10. Taurus.MVC 微服务框架 入门开发教程:项目部署:1、微服务应用程序常规部署实现多开,节点扩容。

    系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...