Snailclimb / JavaGuide

「Java学习+面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识。准备 Java 面试,首选 JavaGuide!
https://javaguide.cn
Apache License 2.0
146.58k stars 45.58k forks source link

RedLock实现分布式锁 #567

Open guozhongdong opened 4 years ago

guozhongdong commented 4 years ago

刚学习到这,有几处问题实在理解不了,希望博主不吝赐教一下: 1、redlock 中的多个节点跟平时理解的redis的集群模式 是不是一回事呢? 2、各个节点之间是如何同步数据的呢?

Snailclimb commented 4 years ago

刚学习到这,有几处问题实在理解不了,希望博主不吝赐教一下: 1、redlock 中的多个节点跟平时理解的redis的集群模式 是不是一回事呢? 2、各个节点之间是如何同步数据的呢?

你好 这篇文章是读者投稿的,对于 RedLock实现分布式锁 这部分我的了解不多,可能需要自己详细学习一遍才能为你解答。 希望其他小伙伴知道的话可以为你解答。

LiWenGu commented 4 years ago

如果有错误请指正。


先说答案:

  1. 不一回事
  2. 不同步

之前研究过一段时间,用的是 Redisson 框架,这里是 Redission 实现 Redlock 的官方文档 。以下为个人见解,可能有误

背景

  1. 平时理解的 Redis 的集群模式:http://www.redis.cn/topics/cluster-tutorial.html
  2. Redlock 多节点:http://redis.cn/topics/distlock.html

重点如下:

  1. 集群模式:Redis 集群是一个提供在多个Redis间节点间共享数据的程序集。

  2. Redlock:有 N 个 Redis master。这些节点完全互相独立,不存在主从复制或者其他集群协调机制。

    这里 Redlock 的使用有四个要求,一是需要 N 个 Redis master,二是节点独立、三是不存在主从复制、四是不存在集群协调机制。后三个要求其实就说明了,你要用的这些 master 不能同时存在同一个集群中。

以下用图加深理解

两主两从的集群与 Redlock

红框代表的是一个标准的 Redis 集群:它是有六个 Redis 节点间共享数据的程序集。

对于 Redlock 来说,这个集群中的两个 Master 不是互相独立的,而且是有集群协调机制的。因此它们不符合使用 Redlock 的场景。你会想,那我只连接一个 Master 可以吧,是可以的,但是也不是标准的 Redlock 的,因为不符合 N 个 Redis master 要求。

综上:如果你只有一个标准的集群,无论里面有多少个 Master,都是不符合 Redlock 的使用场景的,主要在于一个集群内的 Master 间它们不是互相独立的。

两个独立集群下的 Redlock

红框和蓝框分别代表两个独立的标准的 Redis 集群,它们分别是有三个 Redis 节点间共享数据的程序集。

对于 Redlock 来说,一共有两个符合要求的 Master,因此是符合 Redlock 的使用场景。这两个 Master 的同步只在自己的集群内和 Slave 同步。但是不允许这两个 Master 跨集群间同步,因为如果跨集群同步了,那么就不符合 Master 互相独立的要求了。

复杂的两个独立集群下的 Redlock

这里每个集群内部有两个 Master,此时对于 Redlock 来说,它只认为有一组 Master(Master1-Master2、Master1-Master22、Master11-Master2、Master11-Master22) 是互相独立的。(前提在于这两个集群之间并不同步)

其实这里说的并不严谨。这里涉及 Redis 集群的哈希槽知识,对于客户端来说,连接 Redis 集群时,连接该集群下的任意一个节点即可,集群会自动给你对 key 做 hash,然后映射到不同的 Master 上,因此对于客户端来说,其实一个集群无论里面有多少个 Master 节点,客户端只会以为有一个节点。

总结

  1. Redlock 所说的多节点,指的是,独立的 Master 节点。但是集群模式下的 Master 它们是归属于同一个集群下的 Master 节点,它们互相是不独立的,所以这不是一回事。
  2. 虽然 Redlock 所说的 Master 间不同步,但是为了高可用,这里每个 Master 节点都会有 Slave,用于冗余容灾,它们各自的 Master-Slave 是同步的。

备注

关于图的连线,是直接连接 Master 还是连接集群,其实这里要说一下 Redis-cluster,客户端连接集群时,选择集群的任意一个节点连接,在集群中会自动转发到对应的 Master 做操作。


发现仓库里关于 Redis 的文章基本都是 Copy 的,感觉可以再细化成一篇做为原创文章 PR~:shit:

如果有错误请指正。

刚学习到这,有几处问题实在理解不了,希望博主不吝赐教一下: 1、redlock 中的多个节点跟平时理解的redis的集群模式 是不是一回事呢? 2、各个节点之间是如何同步数据的呢?

jinyahuan commented 4 years ago

先说说我的见解:

  1. 和集群模式不是一回事。用途不一样,redlock的N台机的作用只是用于投票。
  2. 各个节点间数据不能同步,而且也各个节点不能做高可用(主从和哨兵),因为会影响投票的准确性。 附上redlock 原文的链接