有很多原因数据库需要扩展性。1、请求需要访问的数据量过大(单纯的数据量大不是理由,例如从不访问,归档即可);2、服务器CPU、内存、网络、IO到了瓶颈,响应时间大大下降;3、MPP中,集中式数据库在设计时通常为了开发人员使用更加顺畅和丝滑,尽可能的让数据库设计和SQL非常简单,比如不需要指定某些表实际上是存在主外键关系,从而导致并行执行效果打折;或者并行执行在一开始并不包含,后面逐渐增强,导致并行执行有天然的缺陷,分区亦如此。这三通常是根本原因。
当下有三类分布式数据库实现方式:1、一定程度上可以认为基于中间件的分布式数据库,如相对通用的mycat/shardingsphere/presto/citus;2、带全局事务管理节点的原生分布式数据库,如postgresql-xl、postgresql-xc、tidb;3、不带全局事务管理节点的分布式数据库,如greenplum、CockroachDB。从目前的来看,xc基本已经输给了citus;xl输给了gp。原生分布式数据库如CockroachDB等性能和时延上明显不如基于中间件架构的citus。要想掌握分布式数据库的实现,这三种实现逻辑都需要理解,他们代表了三种实现,除了第二种外,1、3都在商业上取得了成功,2目前来看并不成功。
这三种模式在内核的可优化空间上也有较大差异:原生按照分布式数据库的架构通常具有最大优化空间、SQL无限制,但是受限于硬件、在ms甚至更低级别的时延上表现较差;中间件架构受限于侵入能力,在事务能力上比较弱、在物理优化策略上比较弱、SQL限制多、尤其是管理特性、系统函数和序列等、唯一约束、分析函数等限制