分布式系统一般讨论的是高可用中的可靠性的组合场景,比如冗余或者切片。
分布式不等于高可用(availability),不等于高可靠(durability),不等于弹性伸缩,不等于冗余,不等于克服了单点故障,也不提供掉电保护。
硬件上主要体现在冗余性,虚拟直通,存算分离上
上述可以确保VM与内存数据几乎不会丢失,但是VM中运行的软件本身仍然可能挂掉。
假如需要进行专业的体系化CS课程,至少半年,可以参考如下
Distributed Computing Systems(cs230)
时间:物理时间(比如ntp同步)与逻辑时间(比如term)
状态:全局状态与快照
Distributed Coordination and Resource Management
Messaging and Communication in Distributed Systems
Fault Tolerance in Distributed Systems
Security in Distributed Systems
Distributed Database Management and Transaction Processin(cs223)
Distributed Objects and Middleware Platforms(cs237)
这里理论比工程更重要,而且是存粹的理论。
假如只是进行概念的理解,如下即可
一致性:强一致性、最终一致性
需要分布管理的内容:比如
协商方向:
节点角色:广义上也可以看作政治权利,比如说“不”的权利。
故障转移时间RTO:一般商用需要为10s
常见组网架构如下
上述方案假设在高速LAN中横向通信,不含容灾。上述成本基本上都比托管的服务更高,也不包含硬件存储架构方案。
事实上云服务厂商的硬件实现的分布式存储才是最简方案。
工程实践的核心思路是将本侧的分布式难题交给下游供应商,进而提高收益,比如
将业务分解为meta/worker/proxy等无状态的服务,比如sonarqube的ComputeEngine
用硬件的RDMA/NFS转换问题,比如Oracle RAC就强制要求超高性能内网,否则直接停机。
用软件的数据库/Raft,基于元数据实现分片,比如在三个数据中心搭建2+2+1
的高可用的quorum
用云服务,比如FSFO(by Oracle),或者GaussDB参考,用Aurora把难题扔给AWS。然而云服务事实上并不兜底,最多赔偿一点代金券,相对业务损失不值一提。
大部分有状态的主备份方案为冗余方案(hot standby),难点在同步复制协议(Primary/Replica)。它要求的性能与可用性(断电前写入存储介质)中取得平衡
常见如下
类型 | 复制协议 | Monitoring node | 自动恢复 | 读写分离 |
---|---|---|---|---|
Jenkins | NFS/rsync innotify | 0 | 需要手动 | NA |
GitLab(unofficial) | NFS/rsync innotify | keepalived | Y | 勉强够用 |
MySQL | Async Binlog | 0 | 需要手动 | N |
pg-pool | WAL | 1 | 需要手动 | Y |
Redis | Async AOF/RDB | 0 | 需要手动 | N |
Redis(Sentinel) | Async AOF/RDB | 1~3(Sentinel) | Y,比如5s | N |
Artifactory-Remote | Pull | NA | NA | NA |
从我个人实践的角度,热主备方案投资收益极为鸡肋
上述方案其实意义有限,甚至整体恢复时间不如单机版+极速备份回滚
谈到一致性,很多人就想到了被阿里带歪的CAP八股文,我们要先明确
举一些例子
元数据既可以通过集中管理,也可以通过分散管理
我们首先要明确,在中心化的一致性元数据管理中,并没有实现扩容
跨WAN的Region场景,默认是不可靠的,一般要最终一致性,这种流程可以简化容灾,跨Site同步等流程。
这里主要需要纠结pull和push,超时和失败的定义。
只要是异步系统(无法区分超时),共识在有限时间内不能完美地完成
作为技术人员,不要因为面试八股文就陷入100%分布式高可用、弹性伸缩、容灾且完美调度等理想模型中,而是意识到理论的不完美、技术的局限性,现实的不确定性,才能更好地理解分布式系统。
扩容是系统工程,物理机房的密度,交换机的插孔,功耗等都会限制最大值,上述方案最终实现的也不过是“昂贵的数据孤岛”。甚至你在专心搞高可用时,你的友商投入人力做Demo已经把项目拿下了。