分布式高级知识点

2024-01-03 16:38:33
  • 分布式一致性算法:

  • 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 

文章来源:https://blog.csdn.net/samsung_samsung/article/details/135357918
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。