什么是分布式数据库
传统数据库(例如mysql)一般是单机数据库,其容量和性能受宿主机本身的性能的限制,在web系统这种数据量性能要求一般的场景下其可以很好的满足,但是在大数据量大吞吐量的场景(例如:云数据库这种单实例多租户)下其力不从心,借用分布式的设计理念产生了分布式数据库,用多台物理机承载数据库实例从而扩展数据库的能力。
与mysql的区别
mysql通过各种扩展组件也可以实现类似分布式数据库的能力,但是和云原生的分布式数据库有很大区别。
一种分布式mysql的实现
1. 接入层
使用nginx这种网关做接入层,实现高可用和负载均衡;
2. 路由转发层
其实就是一个mysql实例,只不过这个实例里面存储的是用户元数据,比如:某个用户的某个表的某个范围的行是存储在哪一个mgr中的,用来做路由转发;
3. mgr集群
mysql可以用多个实例组成一个mgr(MySQL Group Replication),比如三个mysql实例组成一个mgr,那么这个mgr中一个主mysql负责读写和数据同步,其他从mysql负责数据冗余也可以提供读服务,多个mgr就组成了一个mgr集群,配合上路由转发就实现了分布式;
可以看出上面的分布式mysql和主流的分布式存储设计不大一样,主要特点就是冗余,其最小单位是一个mysql实例,可以结合下面介绍的分布式数据库架构对比;
架构
1. 元数据引擎
- 管理存储集群和一些数据库中的元数据,比如dbschema,租户信息之类的;和大部分分布式存储系统类似。
- 当数据发生异常时,调度数据迁移;
2. 查询引擎
所谓查询引擎主要有两个功能,
- 解析sql语句(或者是dataframe这种查询)将其转换成可执行的任务;
- 执行这些任务,根据元数据引擎中的信息将任务转发至对应的存储节点;
3. 索引引擎
数据库都有的东西,主要功能就是提高查询效率,类似与书本的目录;
4. 存储引擎
- 主流一般都是用lsm-tree算法,比如tikv直接使用rocksdb,cnosdb使用自己实现的lsm-tree引擎
- 既然云原生,那么可以使用云服务,比如对象存储来作为存储后端,比如OceanDB的ceresdb
架构
- 一个分布式数据库实例只需要一个元数据集群,一般搞三个元数据实例(raft算法);
- 可以看出查询引擎是无状态的,所以它可以任意水平扩展
- 索引引擎是与数据一一对应的,所以索引引擎需要伴随存储引擎部署
- 存储引擎也是支持水平扩展的,只是需要在元数据管理集群中注册;
OLAP
一般来说,分布式数据库是面向大量数据的存储计算的(OLAP),与mysql这种OLTP的数据库还有些不一样,简单说来就是,对于mysql这种一般是的场景就是一行的写入和读取,但是分布式数据库更多会面对count,max这种在查询时附带函数计算的场景,而且这种计算大多是面向列的计算,所以在设计上,会有一下区别:
mysql:OLTP + 行存;
分布式数据库:OLAP + 列存
行存与列存:是指数据在底层的组织方式;