分布式高级知识点

  • 分布式一致性算法:

  • Paxos

  • Paxos 是一种分布式一致性算法,用于在分布式系统中达成共识。它可以保证,即使在存在节点故障的情况下,系统也能就某个值达成一致。

    Paxos 算法的基本思想是,首先选出一个协调者(leader)。协调者负责向其他节点发送提案(proposal)。其他节点收到提案后,会对其进行投票。如果协调者收到了来自大多数节点的投票,那么它就会宣布提案被接受。

    Paxos 算法可以保证,即使在存在节点故障的情况下,系统也能就某个值达成一致。这是因为,即使协调者发生故障,其他节点也可以选出一个新的协调者来继续进行投票。

  • Raft

  • Raft 是一种分布式一致性算法,用于在分布式系统中达成共识。它与 Paxos 算法非常相似,但它更简单、更容易理解。

    Raft 算法的基本思想是,首先选出一个领导者(leader)。领导者负责向其他节点发送心跳(heartbeat)。其他节点收到心跳后,会对其进行回复。如果领导者在一段时间内没有收到来自大多数节点的回复,那么它就会认为自己已经宕机,并会触发新的领导者选举。

    Raft 算法可以保证,即使在存在节点故障的情况下,系统也能就某个值达成一致。这是因为,即使领导者发生故障,其他节点也可以选出一个新的领导者来继续进行心跳。

  • Zab

  • Zab 是一种分布式一致性算法,用于在分布式系统中达成共识。它与 Paxos 和 Raft 算法非常相似,但它更适合于使用 ZooKeeper 的系统。

    Zab 算法的基本思想是,首先选出一个领导者(leader)。领导者负责向其他节点发送提案(proposal)。其他节点收到提案后,会对其进行投票。如果领导者收到了来自大多数节点的投票,那么它就会宣布提案被接受。

    Zab 算法可以保证,即使在存在节点故障的情况下,系统也能就某个值达成一致。这是因为,即使领导者发生故障,其他节点也可以选出一个新的领导者来继续进行投票。

    Viewstamped Replication

    Viewstamped Replication (VR) 是一种分布式一致性算法,用于在分布式系统中达成共识。它与 Paxos、Raft 和 Zab 算法不同,它使用一种称为视图戳(viewstamp)的机制来保证一致性。

    VR 算法的基本思想是,首先选出一个主节点(primary)。主节点负责向其他节点发送视图戳。其他节点收到视图戳后,会将其存储在本地。当主节点向其他节点发送提案时,它会附带上视图戳。其他节点收到提案后,会将其与本地存储的视图戳进行比较。如果提案的视图戳大于本地存储的视图戳,那么其他节点就会接受该提案。

    VR 算法可以保证,即使在存在节点故障的情况下,系统也能就某个值达成一致。这是因为,即使主节点发生故障,其他节点也可以选出一个新的主节点来继续发送视图戳。

  • 详细介绍 Viewstamped Replication

  • Viewstamped Replication (VR) 是一种分布式一致性算法,用于在分布式系统中达成共识。它与 Paxos、Raft 和 Zab 算法不同,它使用一种称为视图戳(viewstamp)的机制来保证一致性。

    VR 算法的基本思想是,首先选出一个主节点(primary)。主节点负责向其他节点发送视图戳。其他节点收到视图戳后,会将其存储在本地。当主节点向其他节点发送提案时,它会附带上视图戳。其他节点收到提案后,会将其与本地存储的视图戳进行比较。如果提案的视图戳大于本地存储的视图戳,那么其他节点就会接受该提案。

    VR 算法可以保证,即使在存在节点故障的情况下,系统也能就某个值达成一致。这是因为,即使主节点发生故障,其他节点也可以选出一个新的主节点来继续发送视图戳。

    VR 算法的详细步骤如下:

    1. 主节点向其他节点发送视图戳。
    2. 其他节点收到视图戳后,会将其存储在本地。
    3. 主节点向其他节点发送提案,并附带上视图戳。
    4. 其他节点收到提案后,会将其与本地存储的视图戳进行比较。
    5. 如果提案的视图戳大于本地存储的视图戳,那么其他节点就会接受该提案。
    6. 如果提案的视图戳小于或等于本地存储的视图戳,那么其他节点就会拒绝该提案。
    7. 主节点收到来自大多数节点的接受后,就会宣布提案被接受。
    8. 其他节点收到主节点宣布提案被接受的消息后,就会将该提案应用到本地。

    VR 算法可以保证,即使在存在节点故障的情况下,系统也能就某个值达成一致。这是因为,即使主节点发生故障,其他节点也可以选出一个新的主节点来继续发送视图戳。

    VR 算法的优点:

    * 简单、易于理解
    * 性能好
    * 可扩展性强

    VR 算法的缺点:

    * 需要一个主节点
    * 主节点发生故障时,系统会有一段时间的不可用

  • 分布式事务:

    • 两阶段提交(2PC)

    • 两阶段提交(2PC)是一种分布式事务协议,它确保所有参与者要么都提交事务,要么都回滚事务。2PC有以下两个阶段:

      准备阶段:协调者向所有参与者发送一个准备请求。每个参与者执行事务并决定是否可以提交。如果可以提交,则参与者向协调者发送一个准备响应。如果不能提交,则参与者向协调者发送一个中止响应。
      提交/回滚阶段:协调者收集所有参与者的响应。如果所有参与者都准备提交,则协调者向所有参与者发送一个提交请求。如果任何参与者中止,则协调者向所有参与者发送一个回滚请求。

    • 三阶段提交(3PC)

    • 三阶段提交(3PC)是一种分布式事务协议,它比2PC更加可靠,但开销也更大。3PC有以下三个阶段:

      准备阶段:与2PC的准备阶段相同。
      预提交阶段:协调者向所有参与者发送一个预提交请求。每个参与者执行事务并决定是否可以提交。如果可以提交,则参与者向协调者发送一个预提交响应。如果不能提交,则参与者向协调者发送一个中止响应。
      提交/回滚阶段:协调者收集所有参与者的响应。如果所有参与者都预提交,则协调者向所有参与者发送一个提交请求。如果任何参与者中止,则协调者向所有参与者发送一个回滚请求。

      XA事务

      XA事务是一种分布式事务协议,它允许一个事务跨越多个资源管理器。XA事务有以下几个特点:

      XA资源管理器:XA资源管理器是一个管理资源的事务管理器。它可以是数据库、文件系统或其他类型的资源。
      XA协调器:XA协调器是一个协调XA事务的事务管理器。它负责确保所有XA资源管理器要么都提交事务,要么都回滚事务。
      XA事务分支:XA事务分支是一个在单个XA资源管理器中执行的事务的一部分。

      XA事务的执行过程如下:

      1. XA应用程序向XA协调器启动一个XA事务。
      2. XA协调器向每个XA资源管理器创建一个XA事务分支。
      3. XA应用程序在每个XA资源管理器中执行XA事务分支。
      4. XA应用程序向XA协调器提交XA事务。
      5. XA协调器向每个XA资源管理器提交XA事务分支。

      XA事务比2PC和3PC更加复杂,但它也更加灵活和强大。XA事务可以跨越多个资源管理器,并且可以处理更复杂的事务。

      总结

      2PC、3PC和XA事务都是分布式事务协议,它们都有自己的优缺点。2PC简单高效,但可靠性较差。3PC更加可靠,但开销也更大。XA事务更加灵活和强大,但复杂度也更高。

      在选择分布式事务协议时,需要考虑以下因素:

      * 事务的可靠性要求
      * 事务的性能要求
      * 事务的复杂度
      * 参与事务的资源类型

      根据这些因素,可以选择最合适的分布式事务协议。

  • 分布式锁:

    • 基于数据库的分布式锁

    • 基于数据库的分布式锁是通过在数据库中创建一个唯一索引的表来实现的。客户端在获取锁之前,需要先向表中插入一条记录。如果插入成功,则客户端获得锁。如果插入失败,则说明锁已被其他客户端持有。

      基于数据库的分布式锁具有以下几个优点:.

      简单易用:基于数据库的分布式锁的实现原理简单,易于理解和使用。
      性能良好:基于数据库的分布式锁的性能良好,即使在高并发的情况下也能保持较高的吞吐量。
      可靠性高:基于数据库的分布式锁具有较高的可靠性,即使数据库出现故障,锁也不会丢失。

      基于数据库的分布式锁也有一些缺点:

      可扩展性差:基于数据库的分布式锁的可扩展性较差,随着客户端数量的增加,数据库的负载会越来越重。
      不适用于跨数据库的场景:基于数据库的分布式锁不适用于跨数据库的场景,因为每个数据库都有自己的锁表。

    • 基于Redis的分布式锁

    • 基于Redis的分布式锁是通过在Redis中设置一个键值对来实现的。客户端在获取锁之前,需要先向Redis中设置一个键值对。如果设置成功,则客户端获得锁。如果设置失败,则说明锁已被其他客户端持有。

      基于Redis的分布式锁具有以下几个优点:

      简单易用:基于Redis的分布式锁的实现原理简单,易于理解和使用。
      性能良好:基于Redis的分布式锁的性能良好,即使在高并发的情况下也能保持较高的吞吐量。
      可扩展性好:基于Redis的分布式锁的可扩展性好,可以很容易地通过增加Redis服务器的数量来提高性能。
      适用于跨数据库的场景:基于Redis的分布式锁适用于跨数据库的场景,因为Redis是一个独立的存储系统。

      基于Redis的分布式锁也有一些缺点:

      可靠性较低:基于Redis的分布式锁的可靠性较低,如果Redis服务器宕机,锁就会丢失。
      不适用于对强一致性要求较高的场景:基于Redis的分布式锁不适用于对强一致性要求较高的场景,因为Redis是一个弱一致性的系统。

      基于ZooKeeper的分布式锁

      基于ZooKeeper的分布式锁是通过在ZooKeeper中创建一个临时节点来实现的。客户端在获取锁之前,需要先在ZooKeeper中创建一个临时节点。如果创建成功,则客户端获得锁。如果创建失败,则说明锁已被其他客户端持有。

      基于ZooKeeper的分布式锁具有以下几个优点:

      强一致性:ZooKeeper保证所有服务器上的数据都是一致的,因此基于ZooKeeper的分布式锁具有强一致性。
      高可用性:ZooKeeper是一个高可用的系统,即使部分服务器宕机,它仍然能够继续提供服务。因此,基于ZooKeeper的分布式锁具有高可用性。
      可扩展性好:ZooKeeper是一个可扩展的系统,可以很容易地添加或删除服务器。因此,基于ZooKeeper的分布式锁具有可扩展性。

      基于ZooKeeper的分布式锁也有一些缺点:

      ZooKeeper的学习成本较高:ZooKeeper是一个复杂的系统,学习成本较高。
      ZooKeeper的部署和维护成本较高:ZooKeeper需要部署和维护一个集群,因此成本较高。

      总结

      基于数据库的分布式锁、基于Redis的分布式锁和基于ZooKeeper的分布式锁各有优缺点。在选择分布式锁时,需要根据具体场景来选择合适的锁机制。

      示例代码

      基于数据库的分布式锁

      import java.sql.Connection;
      import java.sql.DriverManager;
      import java.sql.PreparedStatement;
      import java.sql.SQLException;public class DatabaseDistributedLock {    private static final String LOCK_TABLE = "my_lock";    private Connection conn;    public DatabaseDistributedLock() throws SQLException {
              conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/my_database", "root", "password");
          }    public void lock() throws SQLException {
              // 创建锁表
              String sql = "CREATE TABLE IF NOT EXISTS 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python封装接口自动化测试套件 !

在Python中,我们可以使用requests库来实现接口自动化测试,并使用unittest或pytest等测试框架来组织和运行测试套件。以下是一个基本的接口自动化测试套件封装示例: 首先,我们需要安装所需的库: pip install requests …

pytest conftest通过fixture实现变量共享

conftest.py scope"module" 只对当前执行的python文件 作用 pytest.fixture(scope"module") def global_variable():my_dict {}yield my_dict test_case7.py import pytestlist1 []def test_case001(global_variable):data1 123global_variable.u…

大华web SDK使用记录

用于开发项目中免登录前端摄像头播放页面,使用WEB无插件开发包V1.1.R1509191.230712 1.sdk提供2个通道,1个是视频流通道,基于websocket,使用PalyerControl对象;1个是云台控制通道,基于ajax,使用…

pythonPandas二:数据读取与写入

Pandas提供了各种函数和方法来实现数据读取和写入的操作。下面我将详细介绍Pandas中常用的数据读取和写入的方法。 数据读取: 从CSV文件读取:可以使用pd.read_csv()函数来读取CSV文件,并将其转换为DataFrame对象。 df pd.read_csv(data.csv…

qt 异常汇总

1. C2338 No Q_OBJECT in the class with the signal (编译源文件 ..\..\qt\labelme-master\src\mainwindow.cpp mainwindow头文件中的类没有Q_OBJECT宏定义,或者其子类或者其他依赖没有Q_OBJECT宏定义。 全部qt类都要写上Q_OBJECT. 2. C2385 对connect的访…

【c++】vector的特性及使用

目录 一、vector的介绍及使用 1、vector迭代器的使用 2、vector的空间增长 3、vector的迭代器失效问题 二、vector的深度剖析与模拟实现 一、vector的介绍及使用 1、vector迭代器的使用 vector的迭代器就是原生态指针。vector的迭代器使用方法与string的迭代器使用方法相…

【CANopen】关于STM32中CanFestival的pdo应用

系列文章目录 文章目录 系列文章目录一、发送1、同步传输2、异步传输 二、接收 使用STM32F407单片机 pdo属于过程数据用来传输实时数据,即单向传输,无需接收节点回应。 一、发送 分为同步传输和异步传输。 1、同步传输 分为循环传输(周期…

【12】ES6:模块化

一、JavaScript 模块化 JavaScript 模块化是一种组织和管理 JavaScript 代码的方法,它将代码分割为独立的模块,每个模块都有自己的作用域,并且可以导出和导入功能。模块化可以提高代码的可维护性、可重用性和可扩展性。 在JavaScript中&…

【vue/uniapp】使用 uni.chooseImage 和 uni.uploadFile 实现图片上传(包含样式,可以解决手机上无法上传的问题)

引入: 之前写过一篇关于 uview 1.x 版本上传照片 的文章,但是发现如果是在微信小程序的项目中嵌入 h5 的模块,这个 h5 的项目使用 u-upload 的话,图片上传功能在电脑上正常,但是在手机的小程序上测试就不会生效&#x…

漏洞复现--海康威视IP网络对讲广播系统远程命令执行

免责声明: 文章中涉及的漏洞均已修复,敏感信息均已做打码处理,文章仅做经验分享用途,切勿当真,未授权的攻击属于非法行为!文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…

职场革命:六款AI助手改写工作效率的故事

引言 在数字化时代,AI助手正快速成为职场的革命者。这些智能助手不仅仅是效率的提升者,它们更是创新的驱动力,重新定义了我们的工作方式。从自动化PPT创建到智能邮件优化,它们的影响深远且多元。本文将深入探讨六款不同领域的AI助…

三维模型数据的几何坐标变换的点云重建并行计算技术方法分析

三维模型数据的几何坐标变换的点云重建并行计算技术方法分析 倾斜摄影三维模型数据的几何坐标变换与点云重建并行计算技术的探讨主要涉及以下几个方面: 1、坐标系定义与转换:在进行坐标变换前,需要确定各个参考系的定义并实现坐标系之间的转…

卷积神经网络|制作自己的Dataset

在编写代码训练神经网络之前,导入数据是必不可少的。PyTorch提供了许多预加载的数据集(如FashionMNIST),这些数据集 子类并实现特定于特定数据的函数。 它们可用于对模型进行原型设计和基准测试,加载这些数据集是十分…

任务悬赏源码活动营销三级分销返佣积分商城版

分销功能:用户拉新用户做任务可以获取任务返佣,三级分销逻辑。 用户拉新会员可以获取一定比例的返佣,根据会员的等级不同获取返佣的比例不同。 会员功能:会员可以根据不同的等级设置任务返佣比例, 以及提现手续费和发布任务置顶次数的赠送问题。会员做任务的价格与普通…

阿里云服务器8080端口安全组开通图文教程

阿里云服务器8080端口开放在安全组中放行,Tomcat默认使用8080端口,8080端口也用于www代理服务,阿腾云atengyun.com以8080端口为例来详细说下阿里云服务器8080端口开启教程教程: 阿里云服务器8080端口开启教程 阿里云服务器8080端…

SkyWalking 快速入门

SkyWalking 是一个基于 Java 开发的分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。 一、SkyWalking 简介 SkyWalking 是观察性分析平台和应用性能管理系统。 提供分布式追踪、服务网格…

输入输出流

1.输入输出流 输入/输出流类:iostream---------i input(输入) o output(输出) stream:流 iostream: istream类:输入流类-------------cin:输入流类的对象 ostream类…

使用Tensorboard可视化网络结构(基于pytorch)

前言 我们在搭建网络模型的时候,通常希望可以对自己搭建好的网络模型有一个比较好的直观感受,从而更好地了解网络模型的结构,Tensorboard工具的使用就给我们提供了方便的途径 Tensorboard概况 Tensorboard是由Google公司开源的一款可视化工…

【大模型+编程助手】国内编程助手安装与使用(CodeGeeX,Baidu Comate)

百度 Comate (可试用):https://comate.baidu.com/ 清华CodeGeeX (开源,暂时免费):https://codegeex.cn/ 华为:https://devcloud.cn-north-4.huaweicloud.com/codeartside/home?productsnap# 开发平台VScod…

贪吃蛇C语言实现(有源码)

前言 之前学了一点easyx图形库的使用&#xff0c;掌握一些基本用法后就用贪吃蛇来进行实战了&#xff0c;运行视频放在csdn视频那一栏了&#xff0c;之前的烟花也是。 1.头文件 #define _CRT_SECURE_NO_WARNINGS 1 #include<easyx.h> #include<conio.h> #includ…