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 组件能提供这种方案,它能识别请求的类型并将其发送给相应的后端数据库