源自星球同学的提问:es如何与hive或mysql结合使用?es不支持事务有什么好的弥补方案吗?
如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下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,对数据的修改是持久的。
一些支持ACID数据存储的数据库包括:Postgres, SQLite, Oracle, MySQL (with InnoDB), and MongoDB (4.0+),不包括Elasticsearch。
Elasticsearch的底层技术是Lucene,Lucene是追求速度而非冗余的信息检索技术。Lucene具有完全不同的体系结构,可以提供极快的性能,但代价是更容易受到数据丢失的影响。
丢失数据有很多种方式,如果需要的话,你需要重新创建数据。 没错,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为了提高写操作的吞吐量而做出的延迟牺牲,当然这个设置是可以手动调整的,但是并不建议你去动它,会极大地影响搜索性能。不同的应用对实时性的定义并不一样,这取决于你的需求。
使用哪种产品作为数据仓库或主数据库存储完全取决于具体的应用场景。
选型核心思考问题如下:
设计时候注意:
核心操作:
参考: https://zhuanlan.zhihu.com/p/29166694 https://zhuanlan.zhihu.com/p/37031059 http://t.cn/RgUgU06 http://t.cn/RVomKfW https://bonsai.io/blog/ideal-elasticsearch-cluster/ http://t.cn/RQK1Ksu http://t.cn/RgUd3GN
本文分享自 铭毅天下Elasticsearch 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!