作者介绍
温卫斌,就职于中国民生银行信息科技部,目前负责分布式技术平台设计与研发,主要关注分布式数据相关领域。
一、NewSQL数据库先进在哪儿?
首先关于“中间件+关系数据库分库分表”算不算NewSQL分布式数据库问题,国外有篇论文pavlo-newsql-sigmodrec,如果根据该文中的分类,Spanner、TiDB、OB算是第一种新架构型,Sharding-Sphere、Mycat、DRDS等中间件方案算是第二种(文中还有第三种云数据库,本文暂不详细介绍)。
基于中间件(包括SDK和Proxy两种形式)+传统关系数据库(分库分表)模式是不是分布式架构?我觉得是的,因为存储确实也分布式了,也能实现横向扩展。但是不是“伪”分布式数据库?从架构先进性来看,这么说也有一定道理。
“伪”主要体现在中间件层与底层DB重复的SQL解析与执行计划生成、存储引擎基于B+Tree等,这在分布式数据库架构中实际上冗余低效的。为了避免引起真伪分布式数据库的口水战,本文中NewSQL数据库特指这种新架构NewSQL数据库。
NewSQL数据库相比中间件+分库分表的先进在哪儿?画一个简单的架构对比图:
传统数据库面向磁盘设计,基于内存的存储管理及并发控制,不如NewSQL数据库那般高效利用; 中间件模式SQL解析、执行计划优化等在中间件与数据库中重复工作,效率相比较低; NewSQL数据库的分布式事务相比于XA进行了优化,性能更高; 新架构NewSQL数据库存储设计即为基于paxos(或Raft)协议的多副本,相比于传统数据库主从模式(半同步转异步后也存在丢数问题),在实现了真正的高可用、高可靠(RTO<30s,RPO=0); NewSQL数据库天生支持数据分片,数据的迁移、扩容都是自动化的,大大减轻了DBA的工作,同时对应用透明,无需在SQL指定分库分表键。
二、分布式事务
这是把双刃剑。
《为什么大部分NoSQL不提供分布式事务?》
参考链接:https://www.jdon.com/47671
参考链接:http://dockone.io/article/2129
《站在巨人的分布式肩膀上》
参考链接:https://queue.acm.org/detail.cfm?id=2953944
两阶段提交协议是否严格支持ACID,各种异常场景是不是都可以覆盖?
2PC在commit阶段发送异常,其实跟最大努力一阶段提交类似也会有部分可见问题,严格讲一段时间内并不能保证A原子性和C一致性(待故障恢复后recovery机制可以保证最终的A和C)。完备的分布式事务支持并不是一件简单的事情,需要可以应对网络以及各种硬件包括网卡、磁盘、CPU、内存、电源等各类异常,通过严格的测试。
之前跟某友商交流,他们甚至说目前已知的NewSQL在分布式事务支持上都是不完整的,他们都有案例跑不过,圈内人士这么笃定,也说明了分布式事务的支持完整程度其实是层次不齐的。
但分布式事务又是这些NewSQL数据库的一个非常重要的底层机制,跨资源的DML、DDL等都依赖其实现,如果这块的性能、完备性打折扣,上层跨分片SQL执行的正确性会受到很大影响。
▲ Spanner给出的分布式事务测试数据
三、HA与异地多活
四、Scale横向扩展与分片机制
五、分布式SQL支持
六、存储引擎
七、成熟度与生态
八、总结
强一致事务是否必须在数据库层解决? 数据的增长速度是否不可预估的? 扩容的频率是否已超出了自身运维能力? 相比响应时间更看重吞吐? 是否必须做到对应用完全透明? 是否有熟悉NewSQL数据库的DBA团队?
最终一致性是否可以满足实际场景? 数据未来几年的总量是否可以预估? 扩容、DDL等操作是否有系统维护窗口? 对响应时间是否比吞吐更敏感? 是否需要兼容已有的关系数据库系统? 是否已有传统数据库DBA人才的积累? 是否可容忍分库分表对应用的侵入?
近期社区动态