当前位置: 首页 > 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;回报在行动之中。 这个系列可…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

【SpringBoot自动化部署】

SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一&#xff0c;能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时&#xff0c;需要添加Git仓库地址和凭证&#xff0c;设置构建触发器&#xff08;如GitHub…...

倒装芯片凸点成型工艺

UBM&#xff08;Under Bump Metallization&#xff09;与Bump&#xff08;焊球&#xff09;形成工艺流程。我们可以将整张流程图分为三大阶段来理解&#xff1a; &#x1f527; 一、UBM&#xff08;Under Bump Metallization&#xff09;工艺流程&#xff08;黄色区域&#xff…...