三、水平扩展和垂直扩展
在分布式系统中,数据存储的扩展是为了适应业务的增长和提高系统的性能。分为水平扩展和垂直扩展两种方式,这两种方式在架构设计和应用场景上有着不同的优势和局限性。
水平扩展
水平扩展是通过增加节点或服务器的数量来扩大整个系统的容量和性能。在数据存储领域,水平扩展通常表现为将数据分不到多个节点或副本上,每个节点负责存储一部分数据,先来看看水平扩展的一些关键特性:
- 数据分片:将数据按照某种规则分成多个片段,每个片段分配给不同的节点。这样可以降低单个节点的负载,提高系统整体的读写性能。
- 分布式存储系统:采用分布式数据库或存储系统,使得数据可以水平分布在不同的节点上,提高了系统的可扩展性。
- 负载均衡:通过负载均衡算法确保每个节点的负载均衡相对均衡,避免单一节点成为瓶颈。
- 弹性伸缩:可根据业务需求动态添加或移除节点,实现系统的弹性伸缩。
使用水平扩展之后,我们可以:
- 提高系统的横向扩展性,适应大规模数据和高并发访问
- 易于实现和操作,可以通过添加节点来线性扩展性能
但是以下挑战在使用水平扩展的时候需要关注:
- 一些复杂业务场景难以进行水平分割,导致某些节点负载过重,比如具有强烈一致性需求的场景
- 数据一致性和事务处理相对复杂度很高
垂直扩展
垂直扩展是通过提升单个节点或服务器的性能来提高整个系统的容量和性能。在数据存储方面,垂直扩展通常表现为增加节点的硬件资源,例如更大的内存、更强大的 CPU、更快的存储设备等。看看水平扩展的一些关键特性:
- 单节点资源增加:通过升级节点的硬件配置,增加处理能力、内容容量和存储速度。
- 数据库垂直分区:将不同的数据或表分布到不同的节点上,使每个节点专注于处理特定类型的数据。
- 缓存和索引优化:通过更高效的缓存机制和索引设计来提高单节点的读取性能。
- 数据库垂直划分:将数据库按照业务功能垂直划分,每个数据库负责不同的业务模块。
使用垂直扩展的优势:
- 针对一些单一业务模块压力较大的场景,提高了单节点的性能
- 相对简单,不涉及数据的分片和迁移
但是:
- 成本较高,硬件升级和维护可能导致较大的投入
- 不易应对业务的爆炸性增长,存在一定的性能瓶颈
在实际应用场景中,水平扩展和垂直扩展经常是组合使用,根据具体的业务场景和需求来综合考虑,选择何种扩展方式,需要架构师根据系统的特点、业务需求、性能要求和预算等多个方面来进行全面评估。
四、主从复制和分布式一致性
主从复制
主从复制是一种数据复制模型,其中一个数据节点的变更操作会被异步地复制到其他节点中,一般只主节点的变更操作到从节点上。这种模型通常用于提高系统的可用性、读取性能以及数据备份场景。
主从复制一般包括以下步骤:
- 主节点写入:所有应用的写入操作先发生在主节点上,对主节点的库表进行写入。
- 异步复制:主节点写入数据之后,将变更操作记录成日志,并将这些日志异步地传播到从节点,比如 MySQL 的 binlog。
- 从节点应用:从节点接收到日志推送后,将主节点的变更操作应用用本地数据,使得从节点的数据与主节点数据保持一致。
使用主动复制,可以:
- 提高读取性能:从节点可以专门处理读取请求,分担主节点的读取压力,提高整体读取性能,这也就是平时说的读写分离的实现模式
- 容灾备份:从节点在主节点发生故障时,可以转变成为主节点,提供容灾备份能力,保障系统在故障场景下的可用性
- 数据分发:从节点还可以设计成位于不同的地理位置,实现数据在多个地点的分发,一般异地多活和国际化场景多采用此种模式
但采用主从复制之后,也存在以下挑战:
- 数据延迟:由于异步复制的特性,从节点的数据可能存在一定的延迟,不过使用云原生技术时,有云原生产品来保障,该挑战基本上可以避免解决
- 写入压力:所有写入操作都在主节点,可能会造成主节点的写入压力过大,所以对于主节点的运维精力要投入更多
分布式一致性
分布式一致性是指在分布式系统中,各个节点对共享状态的变更达成一致的过程。保持一致性是分布式系统中的核心挑战,因为各个节点质检的通信可能存在延迟、故障、网络分区等问题。
CAP 原理
前面章节部分已经详细解释了 CAP 原理,这里不再赘述,知识点再次提醒:
- 一致性:所有节点看到的数据是一致的
- 可用性:每个非故障节点都能读写
- 分区容忍性:系统在遇到网络分区的情况下依旧可以保持一致性和可用性
一致性类型
- 强一致性:所有节点在同一时间看到的数据状态是相同的
- 弱一致性:允许节点在不同时间看到不同的数据状态,但最终会一致
- 最终一致性:最终所有节点都会达到一致状态,但是在中间阶段可能存在不一致
分布式协议
- 两阶段提交(2PC):保证事务的一致性,但可能存在阻塞和单点故障
- 三阶段提交(3PC):解决了 2PC 的一些问题,但依旧存在不足
- Paxos 和 Raft:分布式共识协议,用于解决分布式一致性问题
挑战
- 性能开销:一致性协议会带来额外的通信和计算开销
- 网络分区:可能导致节点之间无法达成一致,需要在一致性和可用性之间做出权衡
在分布式一致性中还有一个特别经典的内容,那就是分布式事务,这里不对分布式事务进行介绍,后面会有专门的章节来详细讲解分布式事务。