看到很多大佬关注了这个问题,小弟来先来抛砖引玉……

先说一下什么是分布式数据库。广义地看,分布式的存储系统都可以称为分布式数据库。狭义地说,分布式数据库,专指无共享的,分布式的,关系型数据库。更准确地,即支持SQL,分布式事务,有统一接口的分布式的数据库。本人更倾向于狭义的定义,以下讨论的也主要是这类系统。其代表比如,OceanBase,TiDB,Spanner这些系统。其它的,比如像一些Sharding中间件,SQL On Hadoop系统,流处理系统,共享存储的关系型数据库,不算(狭义的)分布式数据库。

分布式数据库在数据库历史的早期就有了,代表例子是System R*。分布式事务的概念也研究的很早。但分布式数据库直到最近几年才被关注,其原因是多方面的。一是早期数据规模不够大,单机数据库就能搞定;二是长期以来,市面上也没有较好的分布式数据库;第三是分布式数据库本身不可避免的一些缺陷。在以前人们的印象中,数据库是不讲扩展的。2000年以后,伴随着互联网行业不断增长的数据规模,NoSQL运动发展起来了。NoSQL牺牲了关系型数据库的一些限制,为数据存储带来的扩展性。这使得数据库社区开始重新思考传统关系型数据库,之后催生了NewSQL。NewSQL定义了一种新型的数据库,兼具扩展性与传统关系型数据库的特性。

分布式数据库的优点显尔易见,主要优势有:扩展性,分布式数据库把数据分散存储到多个节点上,以实现水平扩展。当前的许多NewSQL都能自动的扩容,这相对于传统方式(MySQL分表分库)来说拥有很大的优势。

效率,把数据分到多个节点上,多个节点可以并行地执行,提高了整体的吞吐。

分布式数据库的缺点也很明显:分布式事务的代价较高。这种代价主要来源于:两阶段的提交造成过多的消息传输;可能的锁争用变大;复制多副本和高可用。在应用开发者抛弃交互式事务(接受使用存储过程)之前,分布式事务在未来将还是个很难消除的瓶颈

管理复杂,相比单机的数据库,分布式数据库会有更多的节点和组件,更难于管理。幸运的是,现在主流的分布式数据库多数使用共识协议实现自动容错,许多时候不需要用户介入。

随着摩尔定律的失效,以前靠升级硬件实现Scale Up的方式已经不行了。让数据库Scale Out变成新的考虑目标。分布式数据库在以后将会有更大的应用空间。对于当下,一般的共识是,数据量不上一定规模,不要用分布式数据库,因为很可能获得不到什么明显的优势。