x-DB

X_DB需解决的问题

X_DB往往是在线系统和离线系统的边界。

结合应用场景说话

缓存无底洞

http://ifeve.com/redis-multiget-hole/

缓存雪崩

同一时刻大量cache时效,导入对底层数据库的冲击。 缓存雪崩发生场景 : 当Redis服务器重启或者大量缓存在同一时期失效时,此时大量的流量会全部冲击到数据库上面,数据库有可能会因为承受不住而宕机

缓存击穿

缓存击穿发生场景: 查询的数据在cache中过期了,在DB数据库里存在。一个并发访问量比较大的key在某个时间过期,导致所有的请求直接打在DB上。

缓存穿透

缓冲穿透发生场景 : 此时要查询的数据不存在,缓存无法命中所以需要查询完数据库,但是数据是不存在的,此时数据库肯定会返回空,也就无法将该数据写入到缓存中,那么每次对该数据的查询都会去查询一次数据库。

读热key

单个key读太热,使得分布式负载不平衡。

单个key写太热

缓存预热

并发控制

X_DB 技术架构

存储引擎

B+ Tree模型

LSM-Tree模型(log-structured merge-tree)

分片 和 弹性伸缩

分片在不同系统中有各自的别名,Spanner 和 YugabyteDB 中被称为 Tablet,在 HBase 和 TiDB 中被称为 Region,在 CockraochDB 中被称为 Range。

分布式哈希寻址

https://www.jianshu.com/p/fe7b7800473e

读写分离

数据一致性

Paxos

Raft 寻找一种易于理解的一致性算法

Gossip 弱

2PL两阶段锁

两阶段锁协议(2PL)是一种能够保证事务可串行化的协议,它将事务的获取锁和释放锁划分成了增长(Growing)和缩减(Shrinking)两个不同的阶段。在增长阶段,一个事务可以获得锁但是不能释放锁;而在缩减阶段事务只可以释放锁,并不能获得新的锁.

MVCC

(Multi-Version Concurrency Control):多版本并发控制 每一个写操作都会创建一个新版本的数据,读操作会从有限多个版本的数据中挑选一个最合适的结果直接返回;在这时,读写操作之间的冲突就不再需要被关注,而管理和快速挑选数据的版本就成了 MVCC 需要解决的主要问题。

事务处理能力

分布式kv存储具备海量的存储和服务能力,但没有事务能力。

NewSQL

NewSQL的基础是NoSQL. 在架构设计上倾向计算节点与存储节点分离。 Google的分布式数据库,有怎么样的特性。

PostgreSQL-XC

从单体数据库出发进行拓展分布式化,最大程度复用了单体数据库的工程实现,通过协调节点来协调大量的数据节点(单体数据库)。

WAL 机制

WAL(Write Ahead Log)预写日志,是数据库系统中常见的一种手段,用于保证数据操作的原子性和持久性。 修改并不直接写入到数据库文件中,而是写入到另外一个称为 WAL 的文件中;如果事务失败,WAL 中的记录会被忽略,撤销修改;如果事务成功,它将在随后的某个时间被写回到数据库文件中,提交修改。

硬件加速

持久化内存 AEP AEP是Intel最新研发的持久内存产品,具备掉电数据不丢失、低成本(DRAM的1/3)、高性能(DRAM的1/7~1/4)等特性 AEP的读写不对称,读性能明显优于写性能

固态硬盘 SSD 写放大问题: 写入放大(WA)是闪存和固态硬盘之间相关联的一个属性,因为闪存必须先删除才能改写(我们也叫“编程“),在执行这些操作的时候,移动(或重写)用户数据和元数据(metadata)不止一次。这些多次的操作,不但增加了写入数据量,减少了SSD的使用寿命,而且还吃光了闪存的带宽(间接地影响了随机写入性能)

SQL引擎 query planner

SQL是一种查询语言,是对数据库查询的抽象。SQL不仅可用于简单的查询,借助UDF、UDAF、UDTF的能力,可以完成复杂的计算逻辑,因而就成了一门编程语言。

sql数据库的服务端,可以划分为执行器 (Execution Engine) 和存储引擎 (Storage Engine) 两部分。

https://github.com/google/zetasql https://github.com/apache/calcite https://github.com/antlr/antlr4

执行计划定义了:

  1. 访问存储表的顺序
  2. 用于从每个表提取数据的方法
  3. 用于计算的方法

X_DB 开源实现

数据库的实现类型非常之多,没有最好的数据库,只有最适合的数据库,一定要根据业务的特点进行选择。 2021年,开源数据库的Popularity首次超越了商用数据库。https://db-engines.com/en/ranking_osvsc

SQLite

https://sqlite.org/arch.html

SQLite的工作方式是将SQL语句转换为字节码,然后执行该字节码。

VDBE实现了以虚拟机语言运行程序的虚拟计算机。每个程序的目标是询问或更改数据库。为此,VDBE实现的机器语言专门用于搜索,读取和修改数据库。

InnoDB

MySQL 关系数据库

需要了解什么场景适合mysql,什么场景不合适mysql

Redis

出于访问性能,将数据库放在内存。

redis 实现高并发主要依靠主从架构,一主多从

哨兵模式 Sentinel

pipeline命令 允许client将多个请求依次发给服务器(redis的客户端,如jedisCluster,lettuce等都实现了对pipeline的封装),过程中而不需要等待请求的回复,在最后再一并读取结果即可。

Pika Pika是一个可持久化的大容量redis存储服务 https://github.com/Qihoo360/pika

redis支持存储类型除了字符串之外还有list/hashtable/set等容器结构。不过并不能支持容器中每个元素单独设置自己的过期时间 只能自己想办法达到近似的效果

Redis slot 使用分配slot的方式进行key路由。Redis Cluster为整个集群定义了一共16384个slot,并通过crc16的hash函数来对key进行取模,将结果路由到预先分配过slot的相应节点上。 假设有集群设置50个分片,那么每个分片节点上均摊16384/50个slot.

Redis的过期策略 设置指定key的过期时间

Redis的内存淘汰策略 系统内存不足时,主动淘汰一些key。

Tair

LevelDB

单机数据库,一次只允许一个进程访问一个特定的数据库 适合场景 高频写、低频读

Arena内存池

RocksDB

RocksDB 的核心数据结构是 LSM-Tree

PinnableSlice 零拷贝方式的读

RocksDB Column Family

每一个KV对都会关联一个Column Family, 其中默认的Column Family是 “default”. Column Family主要是提供给RocksDB一个逻辑的分区. 从实现上来看不同的Column Family共享WAL,而都有自己的Memtable和SST

RocksDB 是一个基于 LevelDB 衍生的键值存储数据库,它内部的数据以 ColumnFamily(列族,亦有译为列簇)为逻辑单位进行存储.

当用户发出读取请求时,RocksDB 先从 MemTable 查找;如果没找到,再查找不可变的 MemTable,随后再磁盘上进行逐级查找.

MongoDB

Cassandra

etcd

OPENTSDB 时序数据库

Time Series Database, 对比传统数据库仅仅记录了数据的当前值,时序数据库则记录了所有的历史数据。同时时序数据的查询也总是会带上时间作为过滤条件。

InfluxDB 时序数据库

InfluxDB是一个由InfluxData开发的开源时序型数据。它由Go写成,着力于高性能地查询与存储时序型数据。InfluxDB被广泛应用于存储系统的监控数据,IoT行业的实时数据等场景。

Lucene

Java实现的文本搜索库。使用倒排索引来实现高效的文本查询。

ElasticSearch

你说它是搜索引擎也好,也是有很多场景把ELK作为数据库的。

ES-Hadoop 项目, 相当于hadoop MR的一个 ES connector。

Hbase

Hbase,其实是Hadoop Database的简称,本质上来说就是Hadoop系统的数据库,为Hadoop框架当中的结构化数据提供存储服务,是面向列的分布式数据库。

HDFS是Hadoop的存储系统,它的优点是可以存储超大量数据,但是缺点是速度慢。 HBase在HDFS中存储的数据文件称为HFile。这些HFile文件是HBase用来存储表数据的底层文件格式。HFile是HBase的核心存储格式,设计用来高效地进行随机读写操作。 HBase建立在HDFS之上,以KV的形式存储,提供实时访问。 HBase原生只提供了Java 的API 接口。 snapshot是HBase非常核心的一个功能,使用snapshot的不同用法可以实现很多功能

HBase架构介绍 Hbase官方手册

HBase中的数据是按照Rowkey的ASCII字典顺序进行全局排序的 scan查询,用于读取多行数据。可以指定起始行键和结束行键来定义扫描的范围。

查询结果保序 https://hbase.apache.org/book.html#dm.sort

Neo4j

https://github.com/neo4j/neo4j

NebulaGraph 图数据库

https://github.com/vesoft-inc/nebula https://docs.nebula-graph.io/3.2.0/

Dgraph 图数据库

https://github.com/dgraph-io/dgraph

TiDB 分布式事务数据库

在线场景

离线场景

OpenMLDB

OpenMLDB 致力于融合离线数据库和在线数据库。亮点在于一致性执行引擎。 [openmldb的技术博客]https://www.zhihu.com/column/c_1417199590352916480

一致性执行引擎:内部去把 SQL 做了一个转换,转换成线上的执行计划和线下的执行计划,保证这两个值是从定义和执行逻辑上都是一致的。 性能:在线支持毫秒级别延迟的取数+计算! 计算语义:SQL, 提供C++语言的UDF方式来支持用户实现复杂的处理逻辑

Tablet 是 OpenMLDB 用来执行 SQL 和数据存储的模块,也是整个 OpenMLDB 功能实现的核心以及资源占用的瓶颈。Tablet 从功能上来看,进一步包含了 SQL engine 和 storage engine 两个模块。Tablet 也是 OpenMLDB 部署资源的可调配的最小粒度,一个 tablet 不能被拆分到多个物理节点;但是一个物理节点上可以有多个 tablets。

PlanAPI::CreatePlanTreeFromScript
  zetasql::ParseScript
  auto planner_ptr = std::make_unique<SimplePlannerV2>(node_manager, is_batch_mode, is_cluster,
                                                         enable_batch_window_parallelization, extra_options);
  status = planner_ptr->CreateASTScriptPlan(script, plan_trees);
    ConvertASTScript
    CreatePlanTree

YugabyteDB

cockroachDB

X_FS

广义上讲,文件系统是数据库系统的一种形式。

存储接口标准: AWS S3标准协议 (Amazon Simple Storage Service (Amazon S3) )

ChubaoFS

ChubaoFS(CFS)是京东开发的分布式文件系统和对象存储系统 https://chubaofs.readthedocs.io/zh_CN/latest/

CephFS

HDFS

GlusterFS

参考

*****
Written by Lu.dev on 01 June 2020