图数据库 | 17、高可用分布式设计(上)

server/2025/1/6 7:20:32/

我们在前面的文章中,探索了多种可能的系统扩展方式,以及每种扩展方式的优劣。

本篇文章将通过具体的架构设计方案来对每一种方案的设计、投入产出比、各项指标与功能,以及孰优孰劣等进行评价。

在设计高性能、高可用图数据库的时候,从单实例、单节点出发,一般有3种架构演进选项:主备高可用、分布式共识和大规模水平分布式。我们都知道这3套系统的实现复杂度是从低到高渐进的,但这并不意味着复杂度更高的系统在不同的应用场景、用户需求、查询模式、查询复杂度、数据特征条件下就能获得更好的效果。

作为未来的图数据库架构师、用户或爱好者,我们希望每一位读者都能在架构选型时冷静、清醒地分析自己所面临的挑战,找到最适合的解决方案。

一、主备高可用

最简单的高可用数据库是从单实例扩增为双实例的,仅两个实例又可以分化出多种角色扮演:
·单实例(A)负责读写,另一实例(B)负责备份;
·单实例(A_)负责读写,另一实例可以参与读操作负载;
·双实例都支持读写,互为备份。
在以上的第一种角色扮演中,实例A负责承载全部的客户请求,而实例B在一般情况下并不与客户端发生直接互动,它只负责被动接受实例A的备份请求。
只有当实例A因故下线的时候,实例B才转为上线,开始承载客户负载。
事实上,即便是这样看似简单的主备模式,还有很多细节值得考虑,例如:
·A、B实例之间的通信如何保证可靠?
·当一个实例下线的时候,如何使得另一实例转为上线?
对上面两个问题,答案的探寻会引出网络化、分布式系统架构设计的“潘多拉之盒”——除非我们能确定网络是100%可靠的,且A和B上运行的程序和数据是100%安全可靠的,否则,确定A到B或B到A通信可靠及数据可靠就是一件颇为复杂的事情。
因为当A向B发送备份信息后,如何确定B收到信息并完成了备份操作呢?
我们希望B向A发送一条回执,甚至两条回执,其中一条来表达收到(ACK)​,另一条来表达已完成(ACK+DONE)​。但是,我们是否需要让B也知道A已经收到回复了呢?这个回复再回复的通信过程可以变成一种死循环依赖。下图1就形象地示意了造成两军无限通信(同步)问题的具体情形。

两军通信问题

 两军通信问题是拜占庭将军问题的一个简化版本(一种特例)​,它表达了一种在任意通信失败前提下无法达成系统一致性的可能性。

在实际的工程实践中,我们只能在一定程度上规避极端情况的发生,例如TCP协议中的3次握手建立网络连接与4次握手终止网络连接的方案,只能假设在大多数情况下网络是可靠的,A、B实例上运行的程序是具有完整性的。两军通信问题告诉我们任何系统都存在不可靠性,这也是为什么我们会用“几个9”的方式来衡量一个系统的稳定性,例如5个9(99.999%)的在线率,我们也见过一些公有云服务对外称有11个9的稳定性(相当于3 000年才会出现一次离线1s的故障)​,然而只要拔掉1到2根网线或者终止一两个进程就可以让整个系统下线。笔者不确定人类创建的任何计算机系统是否能够50年无故障,毕竟还没有任何系统用满了50年。
 

如果把双实例继续演化,则可以构造至少3个实例的集群,如下图2所示:

图2: 主从备份系统示意图 a)一般形式 b)负载均衡形式

当主备系统有3个实例(A、B、C)的时候,它们之间的通信就变得更复杂了,有至少8种(2×2×2)可能的互动方式。通常,我们会从最简单的主备实现方式开始,即仅从A向B与C单向同步数据,当A下线后,在B与C中选择(手工或自动切换)一个实例作为新的主节点承担客户端发送请求。

但是,当A再次上线后,依然存在需要从B或C中反向输出、同步数据的问题。在B成为主实例的期间,若C下线,则集群中仅B在线,依然可以提供服务,但这种情况下已经不再是高可用的系统。

另一种较为常见的,在一定程度上负载均衡的主备系统实现如图5-13b所示,即主实例承载全部的读写操作,其他实例负载均衡所有来自客户端的读操作,以及同步来自主实例的备份操作。

在主备模式的系统架构中,一个大的假设前提是在任意一个时间切片中至少有一个实例存有全量的、最新的数据。如果这个前提不能被保证,则当前系统的数据一致性已经受到破坏(另一种可能是该系统并非以主备模式运行,后续会进行探讨)​。

主备系统的架构还可以演化出同城灾备、异地灾备等模式。异地灾备模式如图3所示,在这种模式中,通常只有一个集群在线工作,另一个集群则整体被动地接受同步数据。从某种程度上看,这样的系统进行了高度的冗余化设计,至少在写入操作的时候,只有1/6的节点在工作,而其他5/6的节点进行数据同步,并且是分为两个阶段的数据同步,即2/6主集群内的实例与1/6副集群内的主实例进行第一阶段同步,副集群内的另外2/6实例进行第二阶段同步。在第一阶段的同步过程中,副集群的主实例的同步完成时间因为网络距离、网络带宽的限制而存在更大的延迟,很多时候我们会忽略这种延迟。在实际的30公里同城双数据中心中,光线路传播就耗时0.0001s,即0.1ms,如果是一个折返操作,则会耗时0.2ms,两个折返通信,则在通信线路上就至少耗时0.4ms,这在真正的高性能系统设计中已经是一个不可忽略的时耗了。

图3:异地(灾备)主从备份系统示意图


这也是为什么在很多交易场景中消费者会明显感受到秒级的延迟,因为在较长通信线路上,光折返通信就可能存在零点几秒的延迟,外加多套业务系统,例如反欺诈系统的多个规则的运行以及事务型交易处理的完全提交,约2s的延迟是极为正常的。也正是因为这些通信延迟,图数据库线上化(低延迟)​、高并发(高负载)地处理海量数据的能力就显得尤为可贵,毕竟高维数关联、聚合、深度穿透计算的复杂度要显著高于传统数据库的低维、浅层计算的复杂度。

下篇继续聊关于分布式共识系统的文章。最近很忙,不过老夫会尽快更文。


· END ·



(文/Ricky - HPC高性能计算与存储专家、大数据专家、数据库专家及学者)

 


http://www.ppmy.cn/server/155737.html

相关文章

基于Java+SQL Server实现的(GUI)会展中心管理系统

基于java实现的会展中心管理系统 1 系统设计 1.1设计目标 在学习了数据库原理和SQL Server 2008数据库管理系统后,采用Java编程语言开发工具,设计并实现会展中心管理系统。 本课程的目的是培养学生数据库技术的综合应用能力,通过设计开发…

Redis Hash哈希

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 Redis Hash哈希 收录于专栏[redis] 本专栏旨在分享学习Redis的一点学习笔记,欢迎大家在评论区交流讨论💌 目录 概述 常见命令 HSET …

TinaCMS: 革命性的开源内容管理框架

在如今的数字时代,高效的内容管理系统(CMS)已成为构建内容丰富网站和应用程序的必需品。传统 CMS,如 WordPress 和 Drupal,功能丰富但复杂度高。而新一代 CMS,例如 TinaCMS,以其灵活性和开发者友…

Web3对跨境支付系统的潜在影响与发展前景

近年来,Web3技术凭借其去中心化和开放性的特点,逐渐受到各界关注。跨境支付系统作为全球化的重要桥梁,其发展正面临效率、透明性和互操作性等方面的挑战。而Web3的引入为跨境支付系统的优化提供了全新思路。本文将探讨Web3在这一领域的潜在影…

面向实习的Golang服务端技能分析

背景: 这个文章就当总纲看吧,没什么内容,大概是我的一个学习计划 首先,该文章是我希望大二暑期能够找到Go后端开发岗位实习机会,结合boss、2024版go学习路线以及我一个go萌新的现有技能做出的大约四个月时间掌握开发…

题海拾贝:[USACO3.4] 美国血统AmericanHeritage(求先序排列问题)

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《题海拾贝》 欢迎点赞&#xff0c;关注&#xff01; 1、求…

植物活性长末端重复序列反转录转座子研究进展-文献精读95

Plant active LTR retrotransposons: a review 植物活性长末端重复序列反转录转座子研究进展 摘要 长末端重复序列 (Long terminal repeat&#xff0c;LTR) 反转录转座子是真核生物基因组中普遍存在的一类可移动的DNA序列&#xff0c;它们以RNA为媒介&#xff0c;通过“复制粘…

Bash 中的 2>1 | tee 命令详解

Bash 中的 2>&1 | tee 命令详解 在 Linux 和 Unix 系统中&#xff0c;命令行提供了强大的输出控制功能&#xff0c;能够灵活地处理标准输入&#xff08;stdin&#xff09;、标准输出&#xff08;stdout&#xff09;和标准错误&#xff08;stderr&#xff09;。本文将详…