分布式理论与设计 四、分布式系统设计策略

在分布式环境下,有几个问题是普遍关心的:

  • 如何检测当前节点还活着?
  • 如何保障高可用?
  • 容错处理
  • 负载均衡

1.心跳检测

在分布式环境中,我们提及过存在非常多的节点(Node)。那么就有一个非常重要的问题,如何检测一个节点出现了故障乃至无法工作了?
通常解决这一问题采用心跳检测的手段,如同通过仪器对病人进行一些检测诊断一样。

心跳顾名思义,就是以固定的频率向其他节点汇报当前节点状态的方式。收到心跳,一般可以认为一个节点和现在的网络是良好的。当然,心跳汇报时,一般也会携带一些附加的状态、元数据信息,以便管理。

image.png

若Server没有收到Node3的心跳时,Server认为Node3失联。但是失联是失去联系,并不确定是否是Node3故障,有可能是Node3处于繁忙状态,导致调用检测超时;也有可能是Server与Node3之间链路出现故障或闪断。所以心跳不是万能的,收到心跳可以确认节点正常,但是收不到心跳也不能认为该节点就已经宣告“死亡”。此时,可以通过一些方法帮助Server做决定:周期检测心跳机制、累计失效检测机制

  • 周期检测心跳机制
    • Server端每隔t秒向Node集群发起检测请求,设定超时时间,如果超过超时时间,则判断“死亡”。可以把该节点踢出集群。

image.png

  • 累计失效检测机制
    • 在周期检测心跳机制的基础上,统计一定周期内节点的返回情况(包括超时及正确返回),依次计算节点的“死亡”概率。另外,对于宣告“濒临死亡”的节点可以发起有限次数的重试,以作进一步判断。如果超过次数则可以把该节点踢出集群。

image.png

2.高可用

1)高可用HA设计

高可用(High Availability)是系统架构设计中必须考虑的因素之一,通常是指,经过设计来减少系统不能提供服务的事件。
image.png
系统高可用性的常用设计模式包括三种:主备(Master-Slave)、互备(Active-Active)和集群(Cluster)模式。

(1)主备模式

主备模式就是Active-Standby模式,当主机宕机时,备机接管主机的一切工作,待主机恢复正常后,按使用者的设定以自动(热备)或手动(冷备)方式将服务切换到主机上运行。在数据库部分,习惯称之为MS模式。MS模式即Master/Slave模式,这在数据库高可用性方案中比较常用,如MySQL、Redis等就采用MS模式实现主从复制。保证高可用,如图所示。
image.png

(2)互备模式

互备模式指两台主机同时运行各自的服务工作且相互检测情况。在数据库高可用部分,常见的互备是MM模式。MM模式即Multi-Master模式,指一个系统存在多个master,每个master都具有read-write能力,会根据时间戳或业务逻辑合并版本。
image.png

(3)集群模式

集群模式是指有多个节点在运行,同时可以通过主控节点分担服务请求。集群模式需要解决主控节点本身的高可用问题,一般采用主备模式。

2)高可用HA下”脑裂问题“
(1)什么是脑裂

在高可用(HA)系统中,当联系两个节点的“心跳线”断开时(即两个节点断开联系时)。本来为一个整体、动作协调的HA系统,就分裂成为两个独立的节点(即两个独立的个体)。由于相互失去了联系,都以为是对方出了故障,两个节点上的HA软件像“裂脑人”一样,“本能”地争抢“共享资源”、争起“应用服务”。
就会发生严重的后果:

  • 共享资源被瓜分、两边“服务”都起不来了;
  • 两边“服务”都起来了,但同时读写“共享存储”,导致数据损坏(常见如数据库轮询着的联机日志出错)

两个节点相互争抢共享资源,结果会导致系统混乱,数据损坏。对于无状态服务的HA,无所谓脑裂不脑裂,但对有状态服务(比如MySQL)的HA,必须要严格防止脑裂。

(2)脑裂出现的原因

一般来说,脑裂的发生,有以下几种原因:

  • 高可用服务器各节点之间心跳线链路发生故障,导致无法正常通信
  • 因网卡及相关驱动坏了,ip配置及冲突问题(网卡直连)
  • 因心跳线间连接的设备故障(网卡及交换机)
  • 因仲裁的机器出问题(采用仲裁的方案)
  • 高可用服务器上开启了iptables防火墙阻挡了心跳消息传输
  • 高可用服务器上心跳网卡地址等信息配置不正确,导致发送心跳失败
  • 其他服务配置不当等原因,如心跳方式不同,心跳广插冲突、软件Bug等
(3)脑裂预防方案
  • 添加冗余的心跳线(即冗余通信的方法)
    • 同时用两条心跳线路(即心跳线也HA),这样一条线路坏了,另一个还是好的,依然能传送心跳消息,尽量减少“脑裂”现象的发生几率
  • 仲裁机制
    • 当两个节点出现分歧时,由第3方的仲裁者决定听谁的。这个仲裁者,可能是一个锁服务,一个共享盘或者其他什么东西。
  • Lease机制
  • 隔离(Fencing)机制
    • 共享存储fencing:确保只有一个Master往共享存储中写数据
    • 客户端fencing:确保只有一个Master可以响应客户端的请求
    • Slave fencing:确保只有一个Master可以向Slave下发命令

3.容错性

容错性:IT系统对于错误的包容能力
容错的处理是保障分布式环境下相应系统的高可用或者健壮性,一个典型的案例就是对于缓存穿透问题的解决方案。

4.负载均衡

负载均衡:其关键在于使用多态集群服务器共同分担计算任务,把网络请求及计算分配到集群可用的不同服务器节点上,从而达到高可用性及较好的用户操作体验。

如图,不同的用户client1、client2、client3访问呢应用,通过负载均衡器分配到不同的节点
image.png

负载均衡器有硬件解决方案,也有软件解决方案。硬件解决方案有著名的F5,软件有LVS、HAProxy、Nginx等。
以Nginx为例,负载均衡有以下6中策略:
image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/728330.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

抉择与未来:高考后专业与学校的深度选择思考

引言 随着2024年高考的尘埃落定,数百万考生及其家庭正面临一个至关重要的决策:在有限的分数条件下,是优先选择专业还是学校?这一选择不仅影响着个人的未来职业道路,也关系到大学生活的质量和个人综合素质的培养。本文将…

C++ | Leetcode C++题解之第171题Excel表列序号

题目: 题解: class Solution { public:int titleToNumber(string columnTitle) {int number 0;long multiple 1;for (int i columnTitle.size() - 1; i > 0; i--) {int k columnTitle[i] - A 1;number k * multiple;multiple * 26;}return num…

ubuntu16因swap分区uuid错误启动慢排查

感觉ubuntu16启动特别慢 dmesg查看如下: [ 10.050123] audit: type1400 audit(1718608189.395:11): apparmor"STATUS" operation"profile_load" profile"unconfined" name"webbrowser-app//oxide_helper" pid708 comm&q…

Spring Boot轻松整合Minio实现文件上传下载功能

一、Linux 安装Minio 安装 在/root/xxkfz/soft目录下面创建文件minio文件夹,进入minio文件夹,并创建data目录; [rootxxkfz soft]# mkdir minio [rootxxkfz soft]# cd minio [rootxxkfz minio]# mkdir data执行如下命令进行下载 [rootxxkfz…

系统架构师考点--操作系统

大家好。今天我们来说一下操作系统考点,这部分考点出现在上午场考试,一般占3-5分左右。 一、操作系统概述 操作系统是指能有效地组织和管理系统中的各种软/硬件资源,合理地组织计算机系统工作流程,控制程序的执行,并…

【Python机器学习实战】 | 基于线性回归以及支持向量机对汽车MPG与自重进行回归预测

🎩 欢迎来到技术探索的奇幻世界👨‍💻 📜 个人主页:一伦明悦-CSDN博客 ✍🏻 作者简介: C软件开发、Python机器学习爱好者 🗣️ 互动与支持:💬评论 &…

Java | Leetcode Java题解之第171题Excel表列序号

题目: 题解: class Solution {public int titleToNumber(String columnTitle) {int number 0;int multiple 1;for (int i columnTitle.length() - 1; i > 0; i--) {int k columnTitle.charAt(i) - A 1;number k * multiple;multiple * 26;}ret…

nvdiadocker相关配置S3Gaussian

https://download.csdn.net/download/sinat_21699465/89458214 dockerfile文件参考: https://download.csdn.net/download/sinat_21699465/89458214 prework: 显卡驱动决定了cuda版本支持的上限。例如nvdia535驱动最高支持cuda12.2所以显卡驱动版本选…

养殖自动化温控系统:现代养殖场的智能守护神

现代农业养殖业中,养殖自动化温控系统已经成为提高生产效率和保障动物福利的关键技术之一。本篇文章将深入介绍养殖自动化温控系统的原理、组成、优势及其在不同类型养殖场中的应用实例,并展望该技术的未来发展。 一、养殖自动化温控系统概述 养殖自动…

Github 2024-06-20 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-06-20统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目4TypeScript项目4Rust项目2JavaScript项目1Dart项目1Java项目1Go项目1RustDesk: 用Rust编写的开源远程桌面软件 创建周期:1218 天开…

图片转pdf,图片转pdf在线转换,在线图片转pdf

图片转PDF,听起来似乎是一个简单的操作,但实际上,它涉及到许多细节和技巧。有时候我们需要将图片转换为PDF格式,以便于分享、打印或保存。那么,如何将图片转换成PDF呢?接下来,我将为您详细介绍几…

超越AnimateAnyone, 华中科大中科大阿里提出Unimate,可以根据单张图片和姿势指导生成视频。

阿里新发布的UniAnimate,与 AnimateAnyone 非常相似,它可以根据单张图片和姿势指导生成视频。项目核心技术是统一视频扩散模型,通过将参考图像和估计视频内容嵌入到共享特征空间,实现外观和动作的同步。 相关链接 项目&#xff1…

Leetcode - 周赛401

目录 一,3178. 找出 K 秒后拿着球的孩子 二,3179. K 秒后第 N 个元素的值 三,3180. 执行操作可获得的最大总奖励 I 四,3181. 执行操作可获得的最大总奖励 II 一,3178. 找出 K 秒后拿着球的孩子 本题可以直接模拟&a…

小红书官方教程:如何在小红书上打造IP

在小红书这个五彩斑斓的社区里,打造一个成功的IP就像是种下一颗种子,看着它慢慢发芽,开花结果。今天,就让我们来聊聊如何在小红书上打造一个让人眼前一亮的个人品牌。 首先,什么是IP?IP,也就是…

leetCode热题100——两数之和(python)

题目 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任意顺…

高考志愿服务,一张AI搜索的现实考卷

随着最后一笔落下,承载着高考考生们的知识考卷就此完成。另一张更为复杂的现实考卷——志愿填报,悄然摆在了家长和考生们的面前。 2024是多个省份进入新高考的第一年,新高考为考生带来了更大的选择空间和自由度,一些地区的考生需要…

差分总结(一维+二维)

差分&#xff0c;可以视作前缀和的逆运算。 前缀和用于去求一个区间段的和 差分用于改变一个区间的值&#xff08;比如说某个区间都加上或者减去一个数&#xff09; P2367 语文成绩 #include<bits/stdc.h> using namespace std; #define int long long int n,p; int a…

Linux:多线程中的互斥与同步

多线程 线程互斥互斥锁互斥锁实现的原理封装原生线程库封装互斥锁 死锁避免死锁的四种方法 线程同步条件变量 线程互斥 在多线程中&#xff0c;如果存在有一个全局变量&#xff0c;那么这个全局变量会被所有执行流所共享。但是&#xff0c;资源共享就会存在一种问题&#xff1…

云计算【第一阶段(17)】账号和权限管理

目录 一、用户账号和组账号概述 1.1、用户账号的三种角色 1.2、组账号的两个角色 二、用户账号文件 2.1、/etc/passwd 2.2、/etc/shadow 2.3、chage 命令 三、组账号文件 3.1、/etc/group 3.2、/etc/gshadow 四、添加组账户 4.1、添加删除组成员 4.2、删除组账号 …

【面试干货】throw 和 throws 的区别

【面试干货】throw 和 throws 的区别 1、throw1.1 示例 2、throws2.1 示例 3、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java中&#xff0c;throw和throws都与异常处理紧密相关&#xff0c;但它们在使用和含义上有明显的区别。…