阅读更多
市面上分布式数据库目前越来越多,但是流派主要分3波,分库分表加mysql存储,Spanner路线,Aurora路线。
走分库分表加mysql存储路线的,开源产品中有cobar,mycat,sharding-jdbc等,闭源能使用到的产品包括阿里云上的DRDS(TDDL)、腾讯云上的DCDB(TDSQL)等,这条路线最近被另外两条路线抨击比较多,因为站在某些业务场景和规模上(一般中小场景或者规模),分库分表确实对业务要求比较高,存在比较繁重的业务改造,核心问题在于这条路线暴露了拆分条件,需要让用户根据业务特性来判断,一下子把产品做成了一个架构设计,实际上拆分条件就是数据聚簇的依据,类似用单机关系型数据库也会纠结选择哪个唯一字段做主键一样,无非让查询相对二级索引少走一次btree检索,但是分库分表或者分布式数据库领域,维护二级索引一致性无论是强一致还是非强一致都是一个比较痛苦的事情,因为索引和聚簇的数据可能不在一个节点上,这样就跨了一次网络,不确定性大幅度上升,但是二级索引还是有必要存在的,一些产品也提供了这种能力支撑,但是不能滥用。某种意义上来说,把应用改成使用分库分表的数据库解决方案时,就如同单机MySQL只支持了主键索引,这个时候你的应用应该怎么写的问题,不过在核心业务场景,分库分表恰好屏蔽掉了让开发玩得很爽,正式上线压力一大就出故障的问题,并且方案非常成熟,另外MySQL存储是一种非常稳定的存在,以及运维工具、人才储备都是相当充足的,所以你把分布式数据库比作一位姑娘,Spanner路线和Aurora路线的产品就像一个让你浴火焚身的热辣妹子,分库分表加mysql路线就如同一个其貌不扬,但是能够踏踏实实每天把饭菜做好给你吃的居家女孩。
走Spanner路线,开源产品中有最近比较火的TiDB,以及spanner原班人马出来打造的CockroachDB,闭源能使用到的就是Google Cloud上的Spanner产品本尊,当然阿里云上的Oceanbase也走的这条路线,虽然一直挂在阿里云上,但是一直就不见客。这条路线实际上和分库分表加MySQL唯一区别就在于事务的处理。关系型数据库里面,最核心的实际上就是事务,所有的索引、唯一约束、主键约束、外键约束、DDL等都依赖于事务。分布式数据库这个领域,事务的核心在于可见性,一致性或者原子性可以通过各种log实现,但是可见性只有两条路:分布式锁或者分布式MVCC,其实腾讯的DCDB底下基于Mariadb经过艰难困苦的改造,勉强基于XA实现了分布式事务(腾讯之前放出过来一篇文章,随后马上被删除了),但是代价也非常巨大,性能不行,而基于原生MySQL,XA压根是一个鸡肋,两个重大问题长期没有解决(半开事务没有挂起能力,主备同步问题),直到最近的5.7.X才得到解决,效果未知,另外分布式死锁是这个领域里面最恶心的问题。而如果想基于分布式MVCC实现分布式可见性,一个是MySQL并没有暴露或者很难暴露版本,另外如果想要基于MySQL上做一层MVCC,数据实时合并的噩梦让人恐惧,所以这条路线的产品很不错,但是存储必然是一个新的东西,需要时间和场景历练,没个5-6年下不来。
走Aurora路线的,开源据了解应该没有,闭源能够使用到的只有AWS上的Aurora,阿里云上的PolarDB也走这个路线,但是目前还在内测,具体未知,从某种意义上来说,Oracle RAC是这类数据库的祖先,归并到这类也无可厚非,这条路线实际上我个人觉得是从大部分用户诉求去考虑了,就是大部分用户QPS打不满单机数据库,但是数据把磁盘给撑爆了。可能有人想一个数据库机器下挂很多个盘不就解决问题了,但是还是会碰到数据库备份、克隆、DDL因为大数据文件的搬迁导致的延迟和不确定性,所以解决方案就从存储这层下手,分布式用户态文件系统、RDMA等措施改造底层存储,解决数据传输带宽限制、数据读写损耗、数据备份缓慢等问题,但是上层MySQL还是MySQL,全兼容,存储又能做得很大,不过同时因为分布式能力的缺失,事务读写只能单点,只能靠强力的机器堆,满足大部分用户的数据事务读写要求。AWS在国内不给力,不过如果有机会在Aurora上实际跑跑业务可能是真正了解这种架构优缺点的唯一方法,因为我在google上找Aurora的缺点,确实没有找到,要么实在太好了,要么就是用得人还不多。
使用关系型数据库是一个控制欲望的过程,20年前,关系型数据库应对当时的世界可能足够了,你可以用很复杂的关系模型,因为数据量和访问量就那么大,但是现在时代发展了,很多时候我们没有意识到以前实现的关系模型可能并不适用于现在的业务场景,说得难听点,就是糟粕了。这个领域是在不断往前看,也许以前在做分库分表的产品,会推出新存储的强一致分布式数据库,做Aurora类型数据库的加一层共享内存实现事务读写的强一致性,而做spanner路线数据库是难度最大、成熟曲线最高的一种方式,需要时间。