当前位置: 首页 > news >正文

图数据库 | 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所示:

图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高性能计算与存储专家、大数据专家、数据库专家及学者)

 

相关文章:

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

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

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:在网页中引入音频当属性名和属性值一样&#xff0c;可以只写属性名src属性:指定音频文件路径&#xff0c;必…...

Visual Point Cloud Forecasting enables Scalable Autonomous Driving——点云论文阅读(12)

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

《Xsens动捕与人形机器人训练》讲座将于1月9日下午2:30在线上召开

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

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 …...

形态学:图像处理中的强大工具

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

树莓派 Pico RP2040 教程点灯 双核编程案例

双核点亮不同的 LED 示例&#xff0c;引脚分别是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年对大型语言模型&#xff08;LLMs&#xff09;来说是充满变革的一年。以下是对过去一年中LLMs领域的关键进展和主题的总结。 GPT-4的壁垒被打破 去年&#xff0c;我们还在讨论如何构建超越GPT-4的模型。如今&#xff0c;已有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里凸包的源码。什么是凸包以及怎么求解&#xff0c;可以了解一下概念。 一、应用案例 #include <pcl/surfa…...

在K8S中,Pod请求另一个Pod偶尔出现超市或延迟,如何排查?

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

3blue1brow线代笔记

向量 物理&#xff1a;空间中的箭头&#xff0c;长度和方向决定一个向量。只要两者相同&#xff0c;可以任意移动保持不变 计算机&#xff1a;有序的数字列表 &#xff08;数组&#xff09; 数学&#xff1a;向量可以是任何东西&#xff0c;只要保证两个向量相加以及数字与向量…...

【前端系列】优化axios响应拦截器

文章目录 一、前言&#x1f680;&#x1f680;&#x1f680;二、axios响应拦截器&#xff1a;☀️☀️☀️2.1 为什么前端需要响应拦截器element ui的消息组件 一、前言&#x1f680;&#x1f680;&#x1f680; ☀️ 回报不在行动之后&#xff0c;回报在行动之中。 这个系列可…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下&#xff0c;限制某个 IP 的访问频率是非常重要的&#xff0c;可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案&#xff0c;使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...

nnUNet V2修改网络——暴力替换网络为UNet++

更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...