加入收藏 | 设为首页 | 会员中心 | 我要投稿 莆田站长网 (https://www.0594zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长资讯 > 动态 > 正文

一款Kafka可视化Web界面管理工具

发布时间:2021-02-18 14:02:05 所属栏目:动态 来源:互联网
导读:虽然 NewSQL 分布式数据库产品都宣传完备支持分布式事务,但这并不是说应用可以完全不用关心数据拆分,这些数据库的最佳实践中仍然会写到,应用的大部分场景尽可能避免分布式事务。 既然强一致事务付出的性能代价太大,我们可以反思下是否真的需要这种强一致

虽然 NewSQL 分布式数据库产品都宣传完备支持分布式事务,但这并不是说应用可以完全不用关心数据拆分,这些数据库的最佳实践中仍然会写到,应用的大部分场景尽可能避免分布式事务。

既然强一致事务付出的性能代价太大,我们可以反思下是否真的需要这种强一致的分布式事务?

尤其是在做微服务拆分后,很多系统也不太可能放在一个统一的数据库中。

尝试将一致性要求弱化,便是柔性事务,放弃 ACID(Atomicity,Consistency,Isolation,Durability),转投BASE(Basically Available,Soft state,Eventually consistent)。

例如 Saga、TCC、可靠消息保证最终一致等模型,对于大规模高并发 OLTP 场景,我个人更建议使用柔性事务而非强一致的分布式事务。

关于柔性事务,笔者之前也写过一个技术组件,最近几年也涌现出了一些新的模型与框架(例如阿里刚开源的 Fescar),限于篇幅不再赘述,有空再单独写篇文章。

解决分布式事务是否只能用两阶段提交协议?OceanBase1.0 中通过 updateserver 避免分布式事务的思路很有启发性 ,不过 2.0 版后也变成了 2PC。

业界分布式事务也并非只有两阶段提交这一解,也有其他方案 its-time-to-move-on-from-two-phase:

 

其中提到:分布式系统中,您可以知道工作在哪里,或者您可以知道工作何时完成,但您无法同时了解两者;两阶段协议本质上是反可用性协议。

完备性

两阶段提交协议是否严格支持 ACID,各种异常场景是不是都可以覆盖?

2PC 在 Commit 阶段发送异常,其实跟最大努力一阶段提交类似也会有部分可见问题,严格讲一段时间内并不能保证 A 原子性和 C 一致性(待故障恢复后 Recovery 机制可以保证最终的 A 和 C)。

完备的分布式事务支持并不是一件简单的事情,需要可以应对网络以及各种硬件包括网卡、磁盘、CPU、内存、电源等各类异常,通过严格的测试。

之前跟某友商交流,他们甚至说目前已知的 NewSQL 在分布式事务支持上都是不完整的,他们都有案例跑不过,圈内人士这么笃定,也说明了分布式事务的支持完整程度其实是层次不齐的。

但分布式事务又是这些 NewSQL 数据库的一个非常重要的底层机制,跨资源的 DML、DDL 等都依赖其实现,如果这块的性能、完备性打折扣,上层跨分片 SQL 执行的正确性会受到很大影响。

性能

传统关系数据库也支持分布式事务 XA,但为何很少有高并发场景下用呢?

因为 XA 的基础两阶段提交协议存在网络开销大,阻塞时间长、死锁等问题,这也导致了其实际上很少大规模用在基于传统关系数据库的 OLTP 系统中。

NewSQL 数据库的分布式事务实现也仍然多基于两阶段提交协议,例如 google percolator 分布式事务模型,采用原子钟+MVCC+Snapshot Isolation(SI)。

这种方式通过 TSO(Timestamp Oracle)保证了全局一致性,通过 MVCC 避免了锁,另外通过 primary lock 和 secondary lock 将提交的一部分转为异步,相比 XA 确实提高了分布式事务的性能。

SI 是乐观锁,在热点数据场景,可能会大量的提交失败。另外 SI 的隔离级别与 RR 并无完全相同,它不会有幻想读,但会有写倾斜。

但不管如何优化,相比于 1PC,2PC 多出来的 GID 获取、网络开销、prepare 日志持久化还是会带来很大的性能损失,尤其是跨节点的数量比较多时会更加显著。

例如在银行场景做个批量扣款,一个文件可能上 W 个账户,这样的场景无论怎么做还是吞吐都不会很高。

Spanner 给出的分布式事务测试数据:



(编辑:莆田站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读