CMU15445 Lecture 23 Distributed OLTP Databases


OLTP vs. OLAP

OLTP

  • txn的读写时间短
  • 给系统留下的影响小
  • 重复性的操作

OLAP

  • txn主要是read,且时间长
  • 涉及到复杂的join?
  • 要读取大量数据,做分析

assumption

所有的node都是可以信任的,且所有的node都归属同一个管理域,否则需要Byzantine Fault Tolerant 协议来实现分布式事务,这样的话效率非常低

Atomic Commit Protocols

用于保证一个txn相关的所有node保持atomic

  • 2pc 用的多
  • three-phase commit 基本不用
  • paxos 用于协调事务的时候比较少,更多用于协调副本,投票方案
  • raft
  • ZAB 投票方案
  • Viewstamped Replication
    啥叫center data?2PC round trip更少?

Two-Phase Commit

Optimazation:

  • 如果client发送的query是最后一条,这时还没有发送commit,那么remote node可以回复prepare 的结果与query result
  • coordinator先回复client,再去进入第二阶段,也就是通知participant去commmit

Issues

  • 如果coordinator中途挂了,那么participants需要根据log回滚
  • 如果participants中途挂了,那么假装为participants回应了abort

Paxos

Paxos是一种不那么严格的2PC,时间延迟更低

等到crash的acceptor恢复之后,proposer会持续的告诉这个acceptor去做相应的执行

拒绝lower的logical timestamp,而是去回复higher timestamp吗?

multi-paxos

multi-paxos用来解决两个propser互相发送higher timestamp而互相阻塞的情况?
为什么可以跳过propose阶段?为什么要回退到full paxos?

Replication

Number of Primary Nodes

Primary-Replica

一个主节点,多个从节点,主节点传播其update到从节点时不需要使用atomic commit protocol?为什么不需要,可能是因为可以先从主节点获取,那么从节点就不需要是最新的数据了

适合数据不分片(sharding)的业务,从节点一般用于read query

Multi-Primary

多个主节点,这里就需要保证所有所有主节点强一致性的同步,也就是需要atomic commit protocol

K-Safety

对于replica的数量有一个下限值,低于改下限值,主节点停止服务

Propagation Scheme

传送的是log

synchronous scheme

asynchronous scheme

Propagation Timing

数据传播的时机,主节点什么时候开始将日志数据同步给复制节点

continuous propagation timing

DBMS 在生成日志时就持续地将日志传播给复制节点,只要不出现问题,这种做法的效率更高。DBMS 还需要将事务提交或中止的信息也传播给复制节点,保证事务在复制节点也能统一提交或中止。缺点在于:如果事务最终中止,那么复制节点就做了无用功。
大部分数据库为了效率采用的都是这种方案。

on commit propagation timing

DBMS 只在一个事务彻底执行完成时才将日志传播给复制节点,这样如果事务中止,复制节点就什么事都不用做。缺点在于,由于需要等待事务结束时才同步数据,整体同步效率较低。同时log需要缓存再memory中,因为需要等到commit一并传输给复制节点。

Active vs Passive

Approach #1: Active-Active

传递logical log,事务同时在多个复制节点上独立执行,在执行结束时需要检查两边数据是否一致。

Approach #2: Active-Passive

事务先在一个复制节点上执行,然后将数据的变动传播给其它复制节点。传递logcial log(也就是sql query)或者physical log都行

CAP THEOREM (Consitent Available Network_Partition_Tolerant)

一致性,高可用,网络分区容错不可能全都实现

Consitent

啥意思?commit就一致

Available

高可用(指的是一定节点宕机后系统还是可用)

Network_Partition_Tolerant

Partition Tolerant指的是如果一个集群变成两个集群之后,也就是网络挂了,集群是否会出现错误
此处牺牲了Consistent,达成了Available


Traditional/NewSQL DBMSs牺牲了A,保证CP
有些NoSql会在reconnected之后对数据进行梳理,因此只要有部分节点还可用,他们的系统就可以继续运行,所以是牺牲了C,保证了AP

Federated Databases

到现在为止,我们都假设我们的分布式系统中每个节点都运行着相同的 DBMS,但在实际生产中,通常公司内部可能运行着多种类型的 DBMS,如果我们能够在此之上抽象一层,对外暴露统一的数据读写接口也是一个不错的想法。这就是所谓的联邦数据库,比如一个公司内部使用PG和MYSQL
然而实际上这个很难,也从没有人把这种方案实现地很好。不同的数据模型、查询语句、系统限制,没有统一的查询优化方案,大量的数据复制,都使得这种方案比较难产。

PostgreSQL 有 Foreign Data Wrappers 组件能提供这种方案,它能识别请求的类型并将其发送给相应的后端数据库