只记录关键内容

分布式数据库,从名字上可以拆解为:分布式+数据库。用一句话总结为:由多个独立实体组成,并且彼此通过网络进行互联的数据库。

数据分片概论

分片是将大数据表分解为较小的表(称为分片)的过程,这些分片分布在多个数据库集群节点上

水平分片:在不同的数据库节点中存储同一表的不同行。

垂直分片:在不同的数据库节点中存储表不同的表列。

哈希分片,首先需要获取分片键,然后根据特定的哈希算法计算它的哈希值,最后使用哈希值确定数据应被放置在哪个分片中。

数据库一般对所有数据使用统一的哈希算法(例如 ketama),以促成哈希函数在服务器之间均匀地分配数据,从而降低了数据不均衡所带来的热点风险。通过这种方法,数据不太可能放在同一分片上,从而使数据被随机分散开

分片键生成
ShardingShpere 首先提供了分布式的主键生成,这是生成分片键的关键。由于分布式数据库内一般由多个数据库节点参与,因此基于数据库实例的主键生成并不适合分布式场景。

常用的算法有 UUID 和 Snowfalke 两种无状态生成算法。

Snowfalke 其中有效部分有三个。

时间戳:算法类似 UNIX 时间的表示形式,它是从一个特定时间开始到当前时间点之间的毫秒数,本案例中该算法可以使用近 70 年。

工作节点 ID:保证每个独立工作的数据库节点不会产生重复的数据。

访问序列:在同一个进程、同一个毫秒内,保证产生的 ID 不重复。

复制

复制的主要目的是在几个不同的数据库节点上保留相同数据的副本,从而提供一种数据冗余。这份冗余的数据可以提高数据查询性能,而更重要的是保证数据库的可用性。

单主复制与多主复制

(复制延迟、高可用和复制方式)

单主复制,也称主从复制。写入主节点的数据都需要复制到从节点

从使用者的角度来看,从节点都是只读的

一致性与 CAP 模型

CP 系统:一致且容忍分区的系统。更倾向于减少服务时间,而不是将不一致的数据提供出去。一些面向交易场景构建的 NewSQL 数据库倾向于这种策略,如 TiDB、阿里云 PolarDB、AWS Aurora 等。但是它们会生成自己的 A,也就是可用性很高。

AP 系统:可用且具有分区容忍性的系统。它放宽了一致性要求,并允许在请求期间提供可能不一致的值。一般是列式存储,NoSQL 数据库会倾向于 AP,如 Apache Cassandra。但是它们会通过不同级别的一致性模式调整来提供高一致性方案。

最终一致性

它被表述为副本之间的数据复制完全是异步的,如果数据停止修改,那么副本之间最终会完全一致

而这个最终可能是数毫秒到数天,乃至数月,甚至是“永远”。

两阶段提交与三阶段提交

两阶段提交包含协调器与参与者两个角色。在第一个阶段,协调器将需要提交的数据发送给参与者,同时询问参与者是否能够提交该数据,而后参与者返回投票结果。在第二阶段,协调器根据参与者的投票结果,决定是提交还是取消这次事务,而后将结果发送给每个参与者,参与者根据结果来提交本地的事务。

Paxos、Raft 等算法的区别

共识算法

它首先是要解决分布式系统比较棘手的失败问题,通过内置的失败检测机制可以发现失败节点、领导选举机制保证数据高效处理、一致性模式保证了消息的一致性。

原子广播协议:Zookeeper Atomic Broadcast(ZAB)。

可以保证消息顺序的传递 且消息广播时的原子性保障了消息的一致性

领导节点。领导是一个临时角色,它是有任期的。这么做的目的是保证领导角色的活性。领导节点控制着算法执行的过程,广播消息并保证消息是按顺序传播的。读写操作都要经过它,从而保证操作的都是最新的数据。如果一个客户端连接的不是领导节点,它发送的消息也会转发到领导节点中。

跟随节点。主要作用是接受领导发送的消息,并检测领导的健康状态。

ZAB 选举的优势是,如果领导节点一直健康,即使当前任期过期,选举后原领导节点还会承担领导角色,而不会触发领导节点切换,这保证了该算法的稳定

所谓的 Paxos 算法,是为了解决来自客户端的值被发送到集群中的任意一点,而后集群中的所有节点为该值达成共识的一种协调算法

基本的 Paxos 算法非常简单,它由三个角色组成。

Proposer:Proposer 可以有多个,Proposer 提出议案(value)。所谓 value,可以是任何操作,比如“设置某个变量的值为 value”。不同的 Proposer 可以提出不同的 value。但对同一轮 Paxos 过程,最多只有一个 value 被批准。

Acceptor:Acceptor 有 N 个,Proposer 提出的 value 必须获得 Quorum 的 Acceptor 批准后才能通过。Acceptor 之间完全对等独立。

Learner:上面提到只要 Quorum 的 Accpetor 通过即可获得通过,那么 Learner 角色的目的就是把通过的确定性取值同步给其他未确定的 Acceptor。

Multi-Paxos 可以并发执行多个 Paxos 协议

Raft 可以看成是 Multi-Paxos 的改进算法 包括 TiDB、FaunaDB、Redis 等都使用了这种技术