图数据库 | 17、高可用分布式设计(上)
我们在前面的文章中,探索了多种可能的系统扩展方式,以及每种扩展方式的优劣。
本篇文章将通过具体的架构设计方案来对每一种方案的设计、投入产出比、各项指标与功能,以及孰优孰劣等进行评价。
在设计高性能、高可用图数据库的时候,从单实例、单节点出发,一般有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所示:

当主备系统有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,这在真正的高性能系统设计中已经是一个不可忽略的时耗了。

这也是为什么在很多交易场景中消费者会明显感受到秒级的延迟,因为在较长通信线路上,光折返通信就可能存在零点几秒的延迟,外加多套业务系统,例如反欺诈系统的多个规则的运行以及事务型交易处理的完全提交,约2s的延迟是极为正常的。也正是因为这些通信延迟,图数据库线上化(低延迟)、高并发(高负载)地处理海量数据的能力就显得尤为可贵,毕竟高维数关联、聚合、深度穿透计算的复杂度要显著高于传统数据库的低维、浅层计算的复杂度。
下篇继续聊关于分布式共识系统的文章。最近很忙,不过老夫会尽快更文。
· END ·
(文/Ricky - HPC高性能计算与存储专家、大数据专家、数据库专家及学者)
相关文章:

图数据库 | 17、高可用分布式设计(上)
我们在前面的文章中,探索了多种可能的系统扩展方式,以及每种扩展方式的优劣。 本篇文章将通过具体的架构设计方案来对每一种方案的设计、投入产出比、各项指标与功能,以及孰优孰劣等进行评价。 在设计高性能、高可用图数据库的时候…...

1.运控概述
以下并不是我原创(包括图片),都是来源于网络收集。如CSDN博主,朝夕教育,AI等。 什么是运动控制 运控是指“控制移动”之意,可以利用各种电机进行位置控制等操作,让机器听懂你的指令。 什么是…...

DuckDB:密钥管理器及其应用
密钥管理器(Secrets Manager)为所有使用密钥的后端提供了统一的用户界面。密钥信息可以被限定范围,因此不同的存储前缀可以有不同的密钥信息,例如允许在单个查询中连接跨组织的数据。密钥也可以持久化,这样就不需要在每次启动DuckDB时都指定它…...

单元测试4.0+思路总结
Jmockit使用笔记_增加代码覆盖率_覆盖try catch_使用new MockUp私有方法-CSDN博客 一般使用new MockUp模拟被测试代码中的私有方法(常用) 使用new Expetations模拟被测试代码中的方法?...

epoll 水平ET跟边缘LT触发的区别是什么
epoll默认的是水平触发 意思就是当我们depoll默认的是水平触发 LT 模式(水平触发) 工作机制:在 LT 模式下,只要文件描述符(例如套接字)对应的 I/O 缓冲区中有数据可读或者可写空间(对于写操作…...

设计模式 创建型 单例模式(Singleton Pattern)与 常见技术框架应用 解析
单例模式(Singleton Pattern)是一种创建型设计模式,旨在确保某个类在应用程序的生命周期内只有一个实例,并提供一个全局访问点来获取该实例。这种设计模式在需要控制资源访问、避免频繁创建和销毁对象的场景中尤为有用。 一、核心…...

Java项目实战II基于微信小程序的家庭大厨(开发文档+数据库+源码)
目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 在快节奏的生活中,家庭聚餐成为了连接亲情…...

【JVM】总结篇-字节码篇
字节码篇 Java虚拟机的生命周期 JVM的组成 Java虚拟机的体系结构 什么是Java虚拟机 虚拟机:指以软件的方式模拟具有完整硬件系统功能、运行在一个完全隔离环境中的完整计算机系统 ,是物理机的软件实现。常用的虚拟机有VMWare,Visual Box&…...

HTML——28.音频的引入
<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>音频引入</title></head><body><!--audio:在网页中引入音频当属性名和属性值一样,可以只写属性名src属性:指定音频文件路径,必…...

Visual Point Cloud Forecasting enables Scalable Autonomous Driving——点云论文阅读(12)
此内容是论文总结,重点看思路!! 文章概述 这篇文章介绍了一个名为 ViDAR 的视觉点云预测框架,它通过预测历史视觉输入生成未来点云,作为自动驾驶的预训练任务。ViDAR 集成了语义、三维几何和时间动态信息,有效提升了感知、预测和规划等自动驾驶核心任务的性能。实验表明…...

《Xsens动捕与人形机器人训练》讲座将于1月9日下午2:30在线上召开
《Xsens动捕与人形机器人训练》讲座将于1月9日下午2:30在线上召开,本次讲座中来自Xsens的人形机器人与动捕技术专家Jeffrey Muller与Dennis Kloppenburg不仅将就Xsens动作捕捉系统与人形机器人行为训练中的实际应用进行详细讲解,同时还会对目前大家所关注…...

Mac 安装 Flutter 提示 A network error occurred while checking
错误信息 A network error occurred while checking "https://maven.google.com/": Operation timed out原因 在中国大陆(由于访问 Google 服务器的限制导致超时),无法连接到 https://maven.google.com/ 解决方案 需要使用镜像网站 #flutter 使用国内的镜像 export …...

形态学:图像处理中的强大工具
在图像处理中,形态学(Morphology) 是一类基于形状的操作,主要用于提取、分析和处理图像中的几何结构。尽管形态学操作最初是为二值图像设计的,但它也可以应用于灰度图像,帮助提取图像中的结构特征。形态学操…...

树莓派 Pico RP2040 教程点灯 双核编程案例
双核点亮不同的 LED 示例,引脚分别是GP0跟GP1。 #include "pico/stdlib.h" #include "pico/multicore.h"#define LED1 0 // 核心 0 控制的 LED 引脚 #define LED2 1 // 核心 1 控制的 LED 引脚// the setup function runs once when you press …...

2024年大型语言模型(LLMs)的发展回顾
2024年对大型语言模型(LLMs)来说是充满变革的一年。以下是对过去一年中LLMs领域的关键进展和主题的总结。 GPT-4的壁垒被打破 去年,我们还在讨论如何构建超越GPT-4的模型。如今,已有18个组织拥有在Chatbot Arena排行榜上超越原…...

实现单例模式的五种方式
如何实现一个单例 1、构造器需要私有化 2、提供一个私有的静态变量 3、暴露一个公共的获取单例对象的接口 需要考虑的两个问题 1、是否支持懒加载 2、是否线程安全 1、饿汉式 public class EagerSingleton {private static final EagerSingleton INSTANCE new EagerSi…...

pcl源码分析之计算凸包
文章目录 前言一、应用案例二、源码分析1.ConvexHull类2.reconstruct函数3.performReconstruction 函数4.calculateInputDimension 函数 总结 前言 本文分析一下pcl里凸包的源码。什么是凸包以及怎么求解,可以了解一下概念。 一、应用案例 #include <pcl/surfa…...

在K8S中,Pod请求另一个Pod偶尔出现超市或延迟,如何排查?
在Kubernetes中,当Pod请求另一个Pod时偶尔出现超时或延迟,可能是由于多种原因造成的。以下是一些建立的排查步骤: 1. 检查网络配置和插件: 确认你的kubernetes集群使用了合适的网络插件(如Calico、Flannel等…...

3blue1brow线代笔记
向量 物理:空间中的箭头,长度和方向决定一个向量。只要两者相同,可以任意移动保持不变 计算机:有序的数字列表 (数组) 数学:向量可以是任何东西,只要保证两个向量相加以及数字与向量…...

【前端系列】优化axios响应拦截器
文章目录 一、前言🚀🚀🚀二、axios响应拦截器:☀️☀️☀️2.1 为什么前端需要响应拦截器element ui的消息组件 一、前言🚀🚀🚀 ☀️ 回报不在行动之后,回报在行动之中。 这个系列可…...

SQL使用视图
本文将介绍什么是视图,它们怎样工作,何时使用它们。 1. 视图 视图是虚拟的表。与包含数据的表不一样,视图只包含使用时动态检索数据的查询。 说明:SQLite 的视图 SQLite 仅支持只读视图,所以视图可以创建ÿ…...

在Windows计算机上打开 HEIC 文件的 6 种有效方法
如果您是 iPhone 用户,您可能对 HEIC 照片很熟悉。这种新兴格式是一种非常高效的图片编码器,它以小得多的尺寸提供至少类似 JPEG 的质量。这对于存储容量较小的手机尤其有利。但是,如何在Windows上打开 HEIC 文件? 假设您用 iDev…...

开源数据集成平台白皮书重磅发布《Apache SeaTunnel 2024用户案例合集》!
2025年新年临近,Apache SeaTunnel 社区用户案例精选📘也跟大家见面啦!在过去的时间里,SeaTunnel 社区持续成长,吸引了众多开发者的关注与支持。 为了致谢一路同行的伙伴,也为了激励更多人加入技术共创&…...

C# delegate 委托使用教程
什么是委托? 委托是定义方法签名的引用类型数据类型,可以定义委托的变量,就像其他数据类型一样,可以引用与委托具有相同签名的任何方法。 它允许方法作为参数传递,并允许事件驱动编程。它们提供了一种以类型安全的方…...

《机器学习》——数据标准化(0~1标准化,z标准化)
文章目录 数据标准化一、什么是标准化二、常用标准化0~1标准化z标准化 三、注意事项 数据标准化 一、什么是标准化 数据标准化是一种数据预处理技术,用于将数据按照一定的规则进行变换,使得不同特征或变量具有可比性和一致性。作用 消除量纲影响 在实际…...

如何监控和管理API接口的调用频率和并发量?
使用监控工具 APM(应用性能管理)工具 功能介绍:APM 工具如 New Relic、AppDynamics 等可以深入监控 API 的性能指标,包括调用频率、并发量、响应时间等。它们通过在应用程序中嵌入代理或使用无侵入式的监测方式,收集和…...

springboot+vue使用EasyCaptcha实现简单验证码
一、实现效果 springboot使用EasyCaptcha实现简单验证码,更多api和用法可以去github上查看EasyCaptcha: Java图形验证码,支持gif、中文、算术等类型,可用于Java Web、JavaSE等项目。 二、实现步骤 1、导入依赖 <!-- easy-captcha --&g…...

“善弈者”也需妙手,Oclean欧可林:差异化不是说说而已
作者 | 曾响铃 文 | 响铃说 俗话说,“牙痛不是病,痛起来要人命”。这话意思大家都知道,牙痛虽不是什么大病,可一旦发作却是极难忍受。 前几日,Oclean欧可林举办了一场AirPump A10氧气啵啵冲牙器新品品鉴会ÿ…...

Lianwei 安全周报|2025.1.2
以下是本周「Lianwei周报」,我们总结推荐了本周的政策/标准/指南最新动态、热点资讯和安全事件,保证大家不错过本周的每一个重点! 政策/标准/指南最新动态 01 国家数据局等五部门印发《关于促进企业数据资源开发利用的意见》 为充分释放企业…...

吐卡机开发——指令合集—未来之窗行业应用跨平台架构
序号指令10A 09 02 01 01 0D DE20A 09 02 02 01 FD DE30A 09 02 03 01 6D DF40A 09 02 04 01 5D DD50A 09 02 05 01 CD DC60A 09 02 06 01 3D DC70A 09 02 07 01 AD DD80A 09 02 08 01 5D D890A 09 02 09 01 CD D9100A 09 02 10 01 5D D2110A 09 02 11 01 CD D3120A 09 02 12 0…...